From 837f55b67fe91d3dabf761210da0af8e8e5ad778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:44:53 +0530 Subject: [PATCH 001/211] Create README.md --- README.md | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae22363 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ + +

+ ──「 𝗚𝗝𝟱𝟭𝟲 𝗩𝗰 𝗣𝗹𝗮𝘆𝗲𝗿 」── +

+

+ +

━━━━━━━━━━━━━━━━━━━━ +

+ Stars + Python +

+ ━━━━━━━━━━━━━━━━━━━━ +
+ 𝗥𝗲𝗾𝘂𝗶𝗿𝗲𝗺𝗲𝗻𝘁𝘀 📝 + + - FFmpeg + - NodeJS [nodesource.com](https://nodesource.com/) + - Python 3.7 or higher + - [PyTgCalls](https://github.com/pytgcalls/pytgcalls) +
+
+ 𝗙𝗲𝗮𝘁𝘂𝗿𝗲𝘀 🔮 + + - Yt-dL Fix + - Updated Plug-in + - Super Fast Bot + - No Lag Hang + - Fast Download Song From Server + - Program Updated + - Smooth Player +
+
+ 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 🛠 + + - `/play ` - play song you requested + - `/song ` - download songs you want quickly + - `/ping` - Bot Online or Offine + + #### Admins Only 👷‍♂️ + +- `/pause` - pause song play + - `/resume` - resume song play + - `/skip` - play next song + - `/end` - stop music play +
+ +
+𝗦𝗲𝘀𝘀𝗶𝗼𝗻 🥀 + +- 🧪 Get `SESSION_NAME` variable: + - [``Pyrogram Session``](https://telegram.me/StringFatherBot) +
+ +
+ +𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 𝗺𝗲𝘁𝗵𝗼𝗱𝘀 🚀 + + + + ## ᴅᴇᴘʟᴏʏ ᴛᴏ ʜᴇʀᴏᴋᴜ 🚀 + +

+ + The easiest way to host this bot, Deploy on Heroku, Change the app country to Europe (it will help to make the bot more stable). + + ## ᴅᴇᴩʟᴏʏ ᴏɴ ᴏᴋᴛᴇᴛᴏ + +

+ + The second easiest way to host this bot, Deploy on Okteto Cloud + ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ 📡 + ```sh + sudo apt update && apt upgrade -y + sudo apt install git curl python3-pip ffmpeg -y + pip3 install -U pip + Curl -sL https://deb.nodesource.com/setup_16.x | bash - + sudo apt-get install -y nodejs + npm i -g npm + git clone https://github.com/MrProgrammer72/GJ516VCBOT # Clone your repo. + cd GJ516VCBOT + pip3 install -U -r requirements.txt + cp example.env .env #Use vim to edit ENVs + vim .env #Fill up your ENVs ( Steps press i to enter in insert mode then edit the file. Press Esc to exit the editing mode then type :wq! and press Enter key to save the file.) + python3 main.py # Run the bot + + ``` + + + +

+ +
+━━━━━━━━━━━━━━━━━━━━ + +

+ ─「 sᴜᴩᴩᴏʀᴛ 」─ +

+ +

+ +

+

+ +

+━━━━━━━━━━━━━━━━━━━━ +

+ ─「 ᴄʀᴇᴅɪᴛs 」─ +

+ + - [ᴅᴇᴠᴇʟᴏᴘᴇʀ](https://github.com/MrProgrammer72) ➻ [sᴏᴍᴇᴛʜɪɴɢ](https://github.com/MrProgrammer72/GJ516VCBOT) +━━━━━━━━━━━━━━━━━━━━ From 0a8f8285f3f63a4b3fea869fa06475eca48f47cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:46:17 +0530 Subject: [PATCH 002/211] Delete README.md --- README.md | 111 ------------------------------------------------------ 1 file changed, 111 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index ae22363..0000000 --- a/README.md +++ /dev/null @@ -1,111 +0,0 @@ - -

- ──「 𝗚𝗝𝟱𝟭𝟲 𝗩𝗰 𝗣𝗹𝗮𝘆𝗲𝗿 」── -

-

- -

━━━━━━━━━━━━━━━━━━━━ -

- Stars - Python -

- ━━━━━━━━━━━━━━━━━━━━ -
- 𝗥𝗲𝗾𝘂𝗶𝗿𝗲𝗺𝗲𝗻𝘁𝘀 📝 - - - FFmpeg - - NodeJS [nodesource.com](https://nodesource.com/) - - Python 3.7 or higher - - [PyTgCalls](https://github.com/pytgcalls/pytgcalls) -
-
- 𝗙𝗲𝗮𝘁𝘂𝗿𝗲𝘀 🔮 - - - Yt-dL Fix - - Updated Plug-in - - Super Fast Bot - - No Lag Hang - - Fast Download Song From Server - - Program Updated - - Smooth Player -
-
- 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 🛠 - - - `/play ` - play song you requested - - `/song ` - download songs you want quickly - - `/ping` - Bot Online or Offine - - #### Admins Only 👷‍♂️ - -- `/pause` - pause song play - - `/resume` - resume song play - - `/skip` - play next song - - `/end` - stop music play -
- -
-𝗦𝗲𝘀𝘀𝗶𝗼𝗻 🥀 - -- 🧪 Get `SESSION_NAME` variable: - - [``Pyrogram Session``](https://telegram.me/StringFatherBot) -
- -
- -𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 𝗺𝗲𝘁𝗵𝗼𝗱𝘀 🚀 - - - - ## ᴅᴇᴘʟᴏʏ ᴛᴏ ʜᴇʀᴏᴋᴜ 🚀 - -

- - The easiest way to host this bot, Deploy on Heroku, Change the app country to Europe (it will help to make the bot more stable). - - ## ᴅᴇᴩʟᴏʏ ᴏɴ ᴏᴋᴛᴇᴛᴏ - -

- - The second easiest way to host this bot, Deploy on Okteto Cloud - ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ 📡 - ```sh - sudo apt update && apt upgrade -y - sudo apt install git curl python3-pip ffmpeg -y - pip3 install -U pip - Curl -sL https://deb.nodesource.com/setup_16.x | bash - - sudo apt-get install -y nodejs - npm i -g npm - git clone https://github.com/MrProgrammer72/GJ516VCBOT # Clone your repo. - cd GJ516VCBOT - pip3 install -U -r requirements.txt - cp example.env .env #Use vim to edit ENVs - vim .env #Fill up your ENVs ( Steps press i to enter in insert mode then edit the file. Press Esc to exit the editing mode then type :wq! and press Enter key to save the file.) - python3 main.py # Run the bot - - ``` - - - -

- -
-━━━━━━━━━━━━━━━━━━━━ - -

- ─「 sᴜᴩᴩᴏʀᴛ 」─ -

- -

- -

-

- -

-━━━━━━━━━━━━━━━━━━━━ -

- ─「 ᴄʀᴇᴅɪᴛs 」─ -

- - - [ᴅᴇᴠᴇʟᴏᴘᴇʀ](https://github.com/MrProgrammer72) ➻ [sᴏᴍᴇᴛʜɪɴɢ](https://github.com/MrProgrammer72/GJ516VCBOT) -━━━━━━━━━━━━━━━━━━━━ From 165f93b2c746706756a952ed3099fb3a2da5918e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:46:47 +0530 Subject: [PATCH 003/211] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d190954 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# GJ516Music From d7df95df4cf0089d2a480b15b06ef3bb241c79a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:47:37 +0530 Subject: [PATCH 004/211] Create CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..35923a4 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +@export_gabbar From 957f7922f75c209af04b275ad21a642b92e0cc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:47:57 +0530 Subject: [PATCH 005/211] Create README.md --- .github/README.md | 111 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 .github/README.md diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..ae22363 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,111 @@ + +

+ ──「 𝗚𝗝𝟱𝟭𝟲 𝗩𝗰 𝗣𝗹𝗮𝘆𝗲𝗿 」── +

+

+ +

━━━━━━━━━━━━━━━━━━━━ +

+ Stars + Python +

+ ━━━━━━━━━━━━━━━━━━━━ +
+ 𝗥𝗲𝗾𝘂𝗶𝗿𝗲𝗺𝗲𝗻𝘁𝘀 📝 + + - FFmpeg + - NodeJS [nodesource.com](https://nodesource.com/) + - Python 3.7 or higher + - [PyTgCalls](https://github.com/pytgcalls/pytgcalls) +
+
+ 𝗙𝗲𝗮𝘁𝘂𝗿𝗲𝘀 🔮 + + - Yt-dL Fix + - Updated Plug-in + - Super Fast Bot + - No Lag Hang + - Fast Download Song From Server + - Program Updated + - Smooth Player +
+
+ 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 🛠 + + - `/play ` - play song you requested + - `/song ` - download songs you want quickly + - `/ping` - Bot Online or Offine + + #### Admins Only 👷‍♂️ + +- `/pause` - pause song play + - `/resume` - resume song play + - `/skip` - play next song + - `/end` - stop music play +
+ +
+𝗦𝗲𝘀𝘀𝗶𝗼𝗻 🥀 + +- 🧪 Get `SESSION_NAME` variable: + - [``Pyrogram Session``](https://telegram.me/StringFatherBot) +
+ +
+ +𝗗𝗲𝗽𝗹𝗼𝘆𝗺𝗲𝗻𝘁 𝗺𝗲𝘁𝗵𝗼𝗱𝘀 🚀 + + + + ## ᴅᴇᴘʟᴏʏ ᴛᴏ ʜᴇʀᴏᴋᴜ 🚀 + +

+ + The easiest way to host this bot, Deploy on Heroku, Change the app country to Europe (it will help to make the bot more stable). + + ## ᴅᴇᴩʟᴏʏ ᴏɴ ᴏᴋᴛᴇᴛᴏ + +

+ + The second easiest way to host this bot, Deploy on Okteto Cloud + ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ 📡 + ```sh + sudo apt update && apt upgrade -y + sudo apt install git curl python3-pip ffmpeg -y + pip3 install -U pip + Curl -sL https://deb.nodesource.com/setup_16.x | bash - + sudo apt-get install -y nodejs + npm i -g npm + git clone https://github.com/MrProgrammer72/GJ516VCBOT # Clone your repo. + cd GJ516VCBOT + pip3 install -U -r requirements.txt + cp example.env .env #Use vim to edit ENVs + vim .env #Fill up your ENVs ( Steps press i to enter in insert mode then edit the file. Press Esc to exit the editing mode then type :wq! and press Enter key to save the file.) + python3 main.py # Run the bot + + ``` + + + +

+ +
+━━━━━━━━━━━━━━━━━━━━ + +

+ ─「 sᴜᴩᴩᴏʀᴛ 」─ +

+ +

+ +

+

+ +

+━━━━━━━━━━━━━━━━━━━━ +

+ ─「 ᴄʀᴇᴅɪᴛs 」─ +

+ + - [ᴅᴇᴠᴇʟᴏᴘᴇʀ](https://github.com/MrProgrammer72) ➻ [sᴏᴍᴇᴛʜɪɴɢ](https://github.com/MrProgrammer72/GJ516VCBOT) +━━━━━━━━━━━━━━━━━━━━ From e1cd7401b5397a2a05d2af5faf38b1f75524063f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:48:53 +0530 Subject: [PATCH 006/211] Create dependabot.yml --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6d9b86f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 + updates: + - package-ecosystem: pip +   directory: "/" +   schedule: +     interval: daily +     time: "00:00" +     timezone: "Asia/Kolkata" +   labels: +     - "dependencies" +   open-pull-requests-limit: 50 From 5b3a379605757056234993961c1070da6edf4559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:49:12 +0530 Subject: [PATCH 007/211] Delete README.md --- README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index d190954..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# GJ516Music From 32a56904e73f417947bfbefdb56d6a6eabe778ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:50:56 +0530 Subject: [PATCH 008/211] Create JAY DEVELOPER --- GJ516music/Helpers/utils/JAY DEVELOPER | 1 + 1 file changed, 1 insertion(+) create mode 100644 GJ516music/Helpers/utils/JAY DEVELOPER diff --git a/GJ516music/Helpers/utils/JAY DEVELOPER b/GJ516music/Helpers/utils/JAY DEVELOPER new file mode 100644 index 0000000..5b98e58 --- /dev/null +++ b/GJ516music/Helpers/utils/JAY DEVELOPER @@ -0,0 +1 @@ +Kya dek rha h ve lodu 😂😂 From 6ff8a050bc68f775bf32c1dd0a71960b273a854c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:51:49 +0530 Subject: [PATCH 009/211] Add files via upload --- GJ516music/Helpers/utils/__init__.py | 21 +++++++++++++++++++++ GJ516music/Helpers/utils/circle.png | Bin 0 -> 23029 bytes GJ516music/Helpers/utils/font.ttf | Bin 0 -> 141612 bytes GJ516music/Helpers/utils/font2.ttf | Bin 0 -> 128248 bytes 4 files changed, 21 insertions(+) create mode 100644 GJ516music/Helpers/utils/__init__.py create mode 100644 GJ516music/Helpers/utils/circle.png create mode 100644 GJ516music/Helpers/utils/font.ttf create mode 100644 GJ516music/Helpers/utils/font2.ttf diff --git a/GJ516music/Helpers/utils/__init__.py b/GJ516music/Helpers/utils/__init__.py new file mode 100644 index 0000000..f5b3c9b --- /dev/null +++ b/GJ516music/Helpers/utils/__init__.py @@ -0,0 +1,21 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. diff --git a/GJ516music/Helpers/utils/circle.png b/GJ516music/Helpers/utils/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d1be4329f4546501870b6d870b184a3f82c959 GIT binary patch literal 23029 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 literal 0 HcmV?d00001 diff --git a/GJ516music/Helpers/utils/font.ttf b/GJ516music/Helpers/utils/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b8622f67bffda70fc2d7f6ff2f2ad6f3078fd08 GIT binary patch literal 141612 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
pJZQSzuNwmL%hRN4*MNWJACAD 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 literal 0 HcmV?d00001 diff --git a/GJ516music/Helpers/utils/font2.ttf b/GJ516music/Helpers/utils/font2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2ceaf63a3281450969d30f3f256e19940a32cfaa GIT binary patch literal 128248 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 literal 0 HcmV?d00001 From e669f3e397eded0782484c875b816921bc096d7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:52:40 +0530 Subject: [PATCH 010/211] Add files via upload --- GJ516music/Helpers/__init__.py | 32 +++ GJ516music/Helpers/active.py | 60 ++++++ GJ516music/Helpers/admins.py | 91 ++++++++ GJ516music/Helpers/clear.py | 32 +++ GJ516music/Helpers/dossier.py | 81 +++++++ GJ516music/Helpers/downloaders.py | 52 +++++ GJ516music/Helpers/errors.py | 29 +++ GJ516music/Helpers/formatters.py | 45 ++++ GJ516music/Helpers/gets.py | 57 +++++ GJ516music/Helpers/inline.py | 110 ++++++++++ GJ516music/Helpers/queue.py | 48 +++++ GJ516music/Helpers/thumbnails.py | 343 ++++++++++++++++++++++++++++++ 12 files changed, 980 insertions(+) create mode 100644 GJ516music/Helpers/__init__.py create mode 100644 GJ516music/Helpers/active.py create mode 100644 GJ516music/Helpers/admins.py create mode 100644 GJ516music/Helpers/clear.py create mode 100644 GJ516music/Helpers/dossier.py create mode 100644 GJ516music/Helpers/downloaders.py create mode 100644 GJ516music/Helpers/errors.py create mode 100644 GJ516music/Helpers/formatters.py create mode 100644 GJ516music/Helpers/gets.py create mode 100644 GJ516music/Helpers/inline.py create mode 100644 GJ516music/Helpers/queue.py create mode 100644 GJ516music/Helpers/thumbnails.py diff --git a/GJ516music/Helpers/__init__.py b/GJ516music/Helpers/__init__.py new file mode 100644 index 0000000..8c9a8e2 --- /dev/null +++ b/GJ516music/Helpers/__init__.py @@ -0,0 +1,32 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from .active import * +from .admins import * +from .clear import _clear_ +from .dossier import * +from .errors import * +from .formatters import * +from .gets import * +from .inline import * +from .queue import * +from .thumbnails import * diff --git a/GJ516music/Helpers/active.py b/GJ516music/Helpers/active.py new file mode 100644 index 0000000..724c23c --- /dev/null +++ b/GJ516music/Helpers/active.py @@ -0,0 +1,60 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +active = [] +stream = {} + + +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_chats() -> list: + return active + + +async def is_streaming(chat_id: int) -> bool: + run = stream.get(chat_id) + if not run: + return False + return run + + +async def stream_on(chat_id: int): + stream[chat_id] = True + + +async def stream_off(chat_id: int): + stream[chat_id] = False diff --git a/GJ516music/Helpers/admins.py b/GJ516music/Helpers/admins.py new file mode 100644 index 0000000..57d15ec --- /dev/null +++ b/GJ516music/Helpers/admins.py @@ -0,0 +1,91 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Callable + +from pyrogram.enums import ChatMemberStatus +from pyrogram.types import CallbackQuery, Message + +from GJ516Music import SUDOERS, app + +from .active import is_active_chat + + +def admin_check(func: Callable) -> Callable: + async def non_admin(_, message: Message): + if not await is_active_chat(message.chat.id): + return await message.reply_text("ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.") + + if message.from_user.id in SUDOERS: + return await func(_, message) + + check = await app.get_chat_member(message.chat.id, message.from_user.id) + if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: + return await message.reply_text( + "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + ) + + admin = ( + await app.get_chat_member(message.chat.id, message.from_user.id) + ).privileges + if admin.can_manage_video_chats: + return await func(_, message) + else: + return await message.reply_text( + "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + ) + + return non_admin + + +def admin_check_cb(func: Callable) -> Callable: + async def cb_non_admin(_, query: CallbackQuery): + if not await is_active_chat(query.message.chat.id): + return await query.answer( + "ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.", show_alert=True + ) + + if query.from_user.id in SUDOERS: + return await func(_, query) + + try: + check = await app.get_chat_member(query.message.chat.id, query.from_user.id) + except: + return + if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: + return await query.answer( + "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + show_alert=True, + ) + + admin = ( + await app.get_chat_member(query.message.chat.id, query.from_user.id) + ).privileges + if admin.can_manage_video_chats: + return await func(_, query) + else: + return await query.answer( + "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + show_alert=True, + ) + + return cb_non_admin diff --git a/GJ516music/Helpers/clear.py b/GJ516music/Helpers/clear.py new file mode 100644 index 0000000..605339d --- /dev/null +++ b/GJ516music/Helpers/clear.py @@ -0,0 +1,32 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import GJ516db +from GJ516Music.Helpers import remove_active_chat + + +async def _clear_(chat_id): + try: + GJ516db[chat_id] = [] + await remove_active_chat(chat_id) + except: + return diff --git a/GJ516music/Helpers/dossier.py b/GJ516music/Helpers/dossier.py new file mode 100644 index 0000000..64c30eb --- /dev/null +++ b/GJ516music/Helpers/dossier.py @@ -0,0 +1,81 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import BOT_NAME + +PM_START_TEXT = """ +ʜᴇʏ {0}, 🥀 +๏ ᴛʜɪs ɪs** {1} ! + +➻ ᴀ ғᴀsᴛ ᴀɴᴅ ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ᴘʟᴀʏᴇʀ ʙᴏᴛ. +""" + +START_TEXT = """ +**ʜᴇʏ** {0}, 🥀 + {1} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ {2}. + +────────────────── +➻ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʜᴇʟᴘ ᴀʙᴏᴜᴛ ᴍᴇ ᴏʀ ɪғ ʏᴏᴜ ᴡᴀɴɴᴀ ᴀsᴋ sᴏᴍᴇᴛʜɪɴɢ ʏᴏᴜ ᴄᴀɴ ᴊᴏɪɴ ᴍʏ [sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ]({3}). +""" + +HELP_TEXT = f""" +❄ **ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs ғᴏʀ ᴜsᴇʀs ɪɴ {BOT_NAME} :** + +๏ /play : sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. +๏ /pause : ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. +๏ /resume : ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. +๏ /skip : sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. +๏ /end : ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. + +๏ /ping : sʜᴏᴡ ᴛʜᴇ ᴩɪɴɢ ᴀɴᴅ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. +๏ /sudolist : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴅᴏ ᴜsᴇʀs ᴏғ ᴛʜᴇ ʙᴏᴛ. + +๏ /song : ᴅᴏᴡɴʟᴏᴀᴅs ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴀɴᴅ sᴇɴᴅ ɪᴛ ᴛᴏ ʏᴏᴜ. + +๏ /search : sᴇᴀʀᴄᴇs ᴛʜᴇ ɢɪᴠᴇɴ ǫᴜᴇʀʏ ᴏɴ ʏᴏᴜᴛᴜʙᴇ ᴀɴᴅ sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʀᴇsᴜʟᴛ. +""" + +HELP_SUDO = f""" +✨ **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** + +๏ /activevc : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs. +๏ /eval or /sh : ʀᴜɴs ᴛʜᴇ ɢɪᴠᴇɴ ᴄᴏᴅᴇ ᴏɴ ᴛʜᴇ ʙᴏᴛ's ᴛᴇʀᴍɪɴᴀʟ. +๏ /speedtest : ʀᴜɴs ᴀ sᴘᴇᴇᴅᴛᴇsᴛ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. +๏ /sysstats : sʜᴏᴡs ᴛʜᴇ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. + +๏ /setname [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ɴᴀᴍᴇ. +๏ /setbio [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ʙɪᴏ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +๏ /setpfp [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +๏ /delpfp : ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +""" + +HELP_DEV = f""" +✨ **ᴏᴡɴᴇʀ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** + +๏ /config : ᴛᴏ ɢᴇᴛ ᴀʟʟ ᴄᴏɴꜰɪɢ ᴠᴀʀɪᴀʙʟᴇꜱ ᴏꜰ ʙᴏᴛ. +๏ /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] : ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. +๏ /rmdownloads : ᴄʟᴇᴀʀs ᴛʜᴇ ᴄᴀᴄʜᴇ ғɪʟᴇs ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. +๏ /leaveall : ᴏʀᴅᴇʀs ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴀʟʟ ᴄʜᴀᴛs. + +๏ /addsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ᴀᴅᴅ ᴛʜᴇ ᴜsᴇʀ ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. +๏ /rmsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ʀᴇᴍᴏᴠᴇ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. +""" diff --git a/GJ516music/Helpers/downloaders.py b/GJ516music/Helpers/downloaders.py new file mode 100644 index 0000000..67f2193 --- /dev/null +++ b/GJ516music/Helpers/downloaders.py @@ -0,0 +1,52 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +from yt_dlp import YoutubeDL + +ydl_opts = { + "format": "bestaudio/best", + "outtmpl": "downloads/%(id)s.%(ext)s", + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "prefer_ffmpeg": True, + "postprocessors": [ + { + "key": "FFmpegExtractAudio", + "preferredcodec": "mp3", + "preferredquality": "320", + } + ], +} +ydl = YoutubeDL(ydl_opts) + + +def audio_dl(url: str) -> str: + sin = ydl.extract_info(url, False) + x_file = os.path.join("downloads", f"{sin['id']}.mp3") + if os.path.exists(x_file): + return x_file + ydl.download([url]) + return x_file diff --git a/GJ516music/Helpers/errors.py b/GJ516music/Helpers/errors.py new file mode 100644 index 0000000..f4553ed --- /dev/null +++ b/GJ516music/Helpers/errors.py @@ -0,0 +1,29 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +class DurationLimitError(Exception): + pass + + +class FFmpegReturnCodeError(Exception): + pass diff --git a/GJ516music/Helpers/formatters.py b/GJ516music/Helpers/formatters.py new file mode 100644 index 0000000..f683b84 --- /dev/null +++ b/GJ516music/Helpers/formatters.py @@ -0,0 +1,45 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +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 diff --git a/GJ516music/Helpers/gets.py b/GJ516music/Helpers/gets.py new file mode 100644 index 0000000..ef702b7 --- /dev/null +++ b/GJ516music/Helpers/gets.py @@ -0,0 +1,57 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Union + +from pyrogram.enums import MessageEntityType +from pyrogram.types import Audio, Message, Voice + + +def get_url(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 + + if offset in (None,): + return None + + return text[offset : offset + length] + + +def get_file_name(audio: Union[Audio, Voice]): + return f'{audio.file_unique_id}.{audio.file_name.split(".")[-1] if not isinstance(audio, Voice) else "ogg"}' diff --git a/GJ516music/Helpers/inline.py b/GJ516music/Helpers/inline.py new file mode 100644 index 0000000..1e2cc37 --- /dev/null +++ b/GJ516music/Helpers/inline.py @@ -0,0 +1,110 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +import config +from GJ516Music import BOT_USERNAME + +close_key = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] +) + + +buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="▷", callback_data="resume_cb"), + InlineKeyboardButton(text="II", callback_data="pause_cb"), + InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), + InlineKeyboardButton(text="▢", callback_data="end_cb"), + ] + ] +) + + +pm_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="GJ516_help")], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/GJ516Music" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +gp_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/GJ516Music" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +helpmenu = [ + [ + InlineKeyboardButton( + text="ᴇᴠᴇʀʏᴏɴᴇ", + callback_data="GJ516_cb help", + ) + ], + [ + InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="GJ516_cb sudo"), + InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="GJ516_cb owner"), + ], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_home"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] + + +help_back = [ + [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_help"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] diff --git a/GJ516music/Helpers/queue.py b/GJ516music/Helpers/queue.py new file mode 100644 index 0000000..48e5d02 --- /dev/null +++ b/GJ516music/Helpers/queue.py @@ -0,0 +1,48 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import GJ516db + + +async def put( + chat_id, + title, + duration, + videoid, + file_path, + ruser, + user_id, +): + put_f = { + "title": title, + "duration": duration, + "file_path": file_path, + "videoid": videoid, + "req": ruser, + "user_id": user_id, + } + get = GJ516db.get(chat_id) + if get: + GJ516db[chat_id].append(put_f) + else: + GJ516db[chat_id] = [] + GJ516db[chat_id].append(put_f) diff --git a/GJ516music/Helpers/thumbnails.py b/GJ516music/Helpers/thumbnails.py new file mode 100644 index 0000000..289df53 --- /dev/null +++ b/GJ516music/Helpers/thumbnails.py @@ -0,0 +1,343 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import re +import textwrap + +import aiofiles +import aiohttp +import numpy as np +from PIL import Image, ImageChops, ImageDraw, ImageEnhance, ImageFilter, ImageFont +from youtubesearchpython.__future__ import VideosSearch + +from config import FAILED +from GJ516Music import BOT_ID, LOGGER, app + + +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 add_corners(im): + bigsize = (im.size[0] * 3, im.size[1] * 3) + mask = Image.new("L", bigsize, 0) + ImageDraw.Draw(mask).ellipse((0, 0) + bigsize, fill=255) + mask = mask.resize(im.size, Image.ANTIALIAS) + mask = ImageChops.darker(mask, im.split()[-1]) + im.putalpha(mask) + + +async def gen_thumb(videoid, user_id): + if os.path.isfile(f"cache/{videoid}_{user_id}.png"): + return f"cache/{videoid}_{user_id}.png" + url = f"https://www.youtube.com/watch?v={videoid}" + try: + 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" + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + try: + result["viewCount"]["short"] + except: + pass + try: + result["channel"]["name"] + except: + pass + + 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() + + try: + wxy = await app.download_media( + (await app.get_users(user_id)).photo.big_file_id, + file_name=f"{user_id}.jpg", + ) + except: + wxy = await app.download_media( + (await app.get_users(BOT_ID)).photo.big_file_id, + file_name=f"{BOT_ID}.jpg", + ) + + xy = Image.open(wxy) + a = Image.new("L", [640, 640], 0) + b = ImageDraw.Draw(a) + b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") + c = np.array(xy) + d = np.array(a) + e = np.dstack((c, d)) + f = Image.fromarray(e) + x = f.resize((107, 107)) + + youtube = Image.open(f"cache/thumb{videoid}.png") + bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(30)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + + image3 = changeImageSize(1280, 720, bg) + image5 = image3.convert("RGBA") + Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") + + Xcenter = youtube.width / 2 + Ycenter = youtube.height / 2 + x1 = Xcenter - 250 + y1 = Ycenter - 250 + x2 = Xcenter + 250 + y2 = Ycenter + 250 + logo = youtube.crop((x1, y1, x2, y2)) + logo.thumbnail((520, 520), Image.ANTIALIAS) + logo.save(f"cache/chop{videoid}.png") + if not os.path.isfile(f"cache/cropped{videoid}.png"): + im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") + add_corners(im) + im.save(f"cache/cropped{videoid}.png") + + crop_img = Image.open(f"cache/cropped{videoid}.png") + logo = crop_img.convert("RGBA") + logo.thumbnail((365, 365), Image.ANTIALIAS) + width = int((1280 - 365) / 2) + background = Image.open(f"cache/temp{videoid}.png") + background.paste(logo, (width + 2, 138), mask=logo) + background.paste(x, (710, 427), mask=x) + background.paste(image3, (0, 0), mask=image3) + + draw = ImageDraw.Draw(background) + font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) + ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) + arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) + ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) + para = textwrap.wrap(title, width=32) + try: + draw.text( + (450, 25), + f"STARTED PLAYING", + fill="white", + stroke_width=3, + stroke_fill="grey", + font=font, + ) + if para[0]: + text_w, text_h = draw.textsize(f"{para[0]}", font=font) + draw.text( + ((1280 - text_w) / 2, 530), + f"{para[0]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + if para[1]: + text_w, text_h = draw.textsize(f"{para[1]}", font=font) + draw.text( + ((1280 - text_w) / 2, 580), + f"{para[1]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + except: + pass + text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) + draw.text( + ((1280 - text_w) / 2, 660), + f"Duration: {duration} Mins", + fill="white", + font=arial, + ) + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/{videoid}_{user_id}.png") + return f"cache/{videoid}_{user_id}.png" + except Exception as e: + LOGGER.error(e) + return FAILED + + +async def gen_qthumb(videoid, user_id): + if os.path.isfile(f"cache/que{videoid}_{user_id}.png"): + return f"cache/que{videoid}_{user_id}.png" + url = f"https://www.youtube.com/watch?v={videoid}" + try: + 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" + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + try: + result["viewCount"]["short"] + except: + pass + try: + result["channel"]["name"] + except: + pass + + 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() + + try: + wxy = await app.download_media( + (await app.get_users(user_id)).photo.big_file_id, + file_name=f"{user_id}.jpg", + ) + except: + wxy = await app.download_media( + (await app.get_users(BOT_ID)).photo.big_file_id, + file_name=f"{BOT_ID}.jpg", + ) + + xy = Image.open(wxy) + a = Image.new("L", [640, 640], 0) + b = ImageDraw.Draw(a) + b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") + c = np.array(xy) + d = np.array(a) + e = np.dstack((c, d)) + f = Image.fromarray(e) + x = f.resize((107, 107)) + + youtube = Image.open(f"cache/thumb{videoid}.png") + bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(30)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + + image3 = changeImageSize(1280, 720, bg) + image5 = image3.convert("RGBA") + Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") + + Xcenter = youtube.width / 2 + Ycenter = youtube.height / 2 + x1 = Xcenter - 250 + y1 = Ycenter - 250 + x2 = Xcenter + 250 + y2 = Ycenter + 250 + logo = youtube.crop((x1, y1, x2, y2)) + logo.thumbnail((520, 520), Image.ANTIALIAS) + logo.save(f"cache/chop{videoid}.png") + if not os.path.isfile(f"cache/cropped{videoid}.png"): + im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") + add_corners(im) + im.save(f"cache/cropped{videoid}.png") + + crop_img = Image.open(f"cache/cropped{videoid}.png") + logo = crop_img.convert("RGBA") + logo.thumbnail((365, 365), Image.ANTIALIAS) + width = int((1280 - 365) / 2) + background = Image.open(f"cache/temp{videoid}.png") + background.paste(logo, (width + 2, 138), mask=logo) + background.paste(x, (710, 427), mask=x) + background.paste(image3, (0, 0), mask=image3) + + draw = ImageDraw.Draw(background) + font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) + ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) + arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) + ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) + para = textwrap.wrap(title, width=32) + try: + draw.text( + (455, 25), + "ADDED TO QUEUE", + fill="white", + stroke_width=5, + stroke_fill="black", + font=font, + ) + if para[0]: + text_w, text_h = draw.textsize(f"{para[0]}", font=font) + draw.text( + ((1280 - text_w) / 2, 530), + f"{para[0]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + if para[1]: + text_w, text_h = draw.textsize(f"{para[1]}", font=font) + draw.text( + ((1280 - text_w) / 2, 580), + f"{para[1]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + except: + pass + text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) + draw.text( + ((1280 - text_w) / 2, 660), + f"Duration: {duration} Mins", + fill="white", + font=arial, + ) + + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/que{videoid}_{user_id}.png") + return f"cache/que{videoid}_{user_id}.png" + except Exception as e: + LOGGER.error(e) + return FAILED From 7946936a9496a5ac65370514123f76a5d73fb803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:54:00 +0530 Subject: [PATCH 011/211] Create JAY DEVELOPER --- GJ516music/Modules/JAY DEVELOPER | 1 + 1 file changed, 1 insertion(+) create mode 100644 GJ516music/Modules/JAY DEVELOPER diff --git a/GJ516music/Modules/JAY DEVELOPER b/GJ516music/Modules/JAY DEVELOPER new file mode 100644 index 0000000..62de020 --- /dev/null +++ b/GJ516music/Modules/JAY DEVELOPER @@ -0,0 +1 @@ +Lund lele bsdk ke 😂 From b5690d54812d9513066c5b3bc359ff2b1d3baebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:55:00 +0530 Subject: [PATCH 012/211] Add files via upload --- GJ516music/Modules/__init__.py | 40 +++++ GJ516music/Modules/activevc.py | 55 +++++++ GJ516music/Modules/assistant.py | 97 ++++++++++++ GJ516music/Modules/broadcast.py | 65 ++++++++ GJ516music/Modules/callback.py | 253 +++++++++++++++++++++++++++++++ GJ516music/Modules/cleaner.py | 49 ++++++ GJ516music/Modules/eval.py | 195 ++++++++++++++++++++++++ GJ516music/Modules/inline.py | 92 ++++++++++++ GJ516music/Modules/leaveall.py | 63 ++++++++ GJ516music/Modules/pause.py | 48 ++++++ GJ516music/Modules/ping.py | 68 +++++++++ GJ516music/Modules/play.py | 258 ++++++++++++++++++++++++++++++++ GJ516music/Modules/resume.py | 45 ++++++ GJ516music/Modules/search.py | 67 +++++++++ GJ516music/Modules/skip.py | 77 ++++++++++ GJ516music/Modules/song.py | 119 +++++++++++++++ GJ516music/Modules/speedtest.py | 67 +++++++++ GJ516music/Modules/start.py | 103 +++++++++++++ GJ516music/Modules/stop.py | 46 ++++++ GJ516music/Modules/sudoers.py | 132 ++++++++++++++++ GJ516music/Modules/sysstats.py | 115 ++++++++++++++ GJ516music/Modules/variables.py | 61 ++++++++ GJ516music/Modules/watcher.py | 110 ++++++++++++++ 23 files changed, 2225 insertions(+) create mode 100644 GJ516music/Modules/__init__.py create mode 100644 GJ516music/Modules/activevc.py create mode 100644 GJ516music/Modules/assistant.py create mode 100644 GJ516music/Modules/broadcast.py create mode 100644 GJ516music/Modules/callback.py create mode 100644 GJ516music/Modules/cleaner.py create mode 100644 GJ516music/Modules/eval.py create mode 100644 GJ516music/Modules/inline.py create mode 100644 GJ516music/Modules/leaveall.py create mode 100644 GJ516music/Modules/pause.py create mode 100644 GJ516music/Modules/ping.py create mode 100644 GJ516music/Modules/play.py create mode 100644 GJ516music/Modules/resume.py create mode 100644 GJ516music/Modules/search.py create mode 100644 GJ516music/Modules/skip.py create mode 100644 GJ516music/Modules/song.py create mode 100644 GJ516music/Modules/speedtest.py create mode 100644 GJ516music/Modules/start.py create mode 100644 GJ516music/Modules/stop.py create mode 100644 GJ516music/Modules/sudoers.py create mode 100644 GJ516music/Modules/sysstats.py create mode 100644 GJ516music/Modules/variables.py create mode 100644 GJ516music/Modules/watcher.py diff --git a/GJ516music/Modules/__init__.py b/GJ516music/Modules/__init__.py new file mode 100644 index 0000000..479b164 --- /dev/null +++ b/GJ516music/Modules/__init__.py @@ -0,0 +1,40 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import glob +from os.path import basename, dirname, isfile + + +def __list_all_modules(): + mod_paths = glob.glob(dirname(__file__) + "/*.py") + + all_modules = [ + basename(f)[:-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/GJ516music/Modules/activevc.py b/GJ516music/Modules/activevc.py new file mode 100644 index 0000000..46fbce4 --- /dev/null +++ b/GJ516music/Modules/activevc.py @@ -0,0 +1,55 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import SUDOERS, app +from GJ516Music.Helpers.active import get_active_chats +from GJ516Music.Helpers.inline import close_key + + +@app.on_message(filters.command("activevc") & SUDOERS) +async def activevc(_, message: Message): + mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ʟɪsᴛ...") + chats = await get_active_chats() + text = "" + j = 0 + for chat in chats: + try: + title = (await app.get_chat(chat)).title + except Exception: + title = "ᴩʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ" + if (await app.get_chat(chat)).username: + user = (await app.get_chat(chat)).username + text += f"{j + 1}. [{title}](https://t.me/{user})\n" + else: + text += f"{j + 1}. {title} [`{chat}`]\n" + j += 1 + if not text: + await mystic.edit_text("ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄʙᴏᴛ...") + else: + await mystic.edit_text( + f"**ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄ ʙᴏᴛ :**\n\n{text}", + reply_markup=close_key, + disable_web_page_preview=True, + ) diff --git a/GJ516music/Modules/assistant.py b/GJ516music/Modules/assistant.py new file mode 100644 index 0000000..742d7bd --- /dev/null +++ b/GJ516music/Modules/assistant.py @@ -0,0 +1,97 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import ASS_MENTION, LOGGER, SUDOERS, app, app2 + + +@app.on_message(filters.command(["asspfp", "setpfp"]) & SUDOERS) +async def set_pfp(_, message: Message): + if message.reply_to_message.photo: + fuk = await message.reply_text("» ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ...") + img = await message.reply_to_message.download() + try: + await app2.set_profile_photo(photo=img) + return await fuk.edit_text( + f"» {ASS_MENTION} ᴘʀᴏғɪʟᴇ ᴘɪᴄ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + except: + return await fuk.edit_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + else: + await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ ғᴏʀ ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + ) + + +@app.on_message(filters.command(["delpfp", "delasspfp"]) & SUDOERS) +async def set_pfp(_, message: Message): + try: + pfp = [p async for p in app2.get_chat_photos("me")] + await app2.delete_profile_photos(pfp[0].file_id) + return await message.reply_text( + "» sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴇʟᴇᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + ) + except Exception as ex: + LOGGER.error(ex) + await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + + +@app.on_message(filters.command(["assbio", "setbio"]) & SUDOERS) +async def set_bio(_, message: Message): + msg = message.reply_to_message + if msg: + if msg.text: + newbio = msg.text + await app2.update_profile(bio=newbio) + return await message.reply_text( + f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + elif len(message.command) != 1: + newbio = message.text.split(None, 1)[1] + await app2.update_profile(bio=newbio) + return await message.reply_text(f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + else: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ʙɪᴏ." + ) + + +@app.on_message(filters.command(["assname", "setname"]) & SUDOERS) +async def set_name(_, message: Message): + msg = message.reply_to_message + if msg: + if msg.text: + name = msg.text + await app2.update_profile(first_name=name) + return await message.reply_text( + f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + elif len(message.command) != 1: + name = message.text.split(None, 1)[1] + await app2.update_profile(first_name=name, last_name="") + return await message.reply_text(f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + else: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ɴᴇᴡ ɴᴀᴍᴇ." + ) diff --git a/GJ516music/Modules/broadcast.py b/GJ516music/Modules/broadcast.py new file mode 100644 index 0000000..9a233f7 --- /dev/null +++ b/GJ516music/Modules/broadcast.py @@ -0,0 +1,65 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import app, app2 + + +@app.on_message(filters.command("broadcast") & filters.user(OWNER_ID)) +async def broadcast(_, message: Message): + brep = await message.reply_text("sᴛᴀʀᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ...") + 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( + "**ᴇxᴀᴍᴘʟᴇ:**\n\n/broadcast [ᴍᴇssᴀɢᴇ] ᴏʀ [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" + ) + query = message.text.split(None, 1)[1] + sent = 0 + chats = [] + async for dialog in app2.get_dialogs(): + chats.append(int(dialog.chat.id)) + for i in chats: + try: + await app2.forward_messages( + i, y, x + ) if message.reply_to_message else await app2.send_message(i, text=query) + sent += 1 + except FloodWait as e: + flood_time = int(e.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except Exception: + continue + try: + await brep.edit_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") + except: + await message.reply_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") diff --git a/GJ516music/Modules/callback.py b/GJ516music/Modules/callback.py new file mode 100644 index 0000000..3a9100c --- /dev/null +++ b/GJ516music/Modules/callback.py @@ -0,0 +1,253 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import CallbackQuery, InlineKeyboardMarkup +from pytgcalls.types import AudioPiped, HighQualityAudio + +from GJ516Music import ( + ASS_ID, + ASS_NAME, + BOT_ID, + BOT_MENTION, + BOT_USERNAME, + LOGGER, + app, + GJ516db, + pytgcalls, +) +from GJ516Music.Helpers import ( + _clear_, + admin_check_cb, + gen_thumb, + is_streaming, + stream_off, + stream_on, +) +from GJ516Music.Helpers.dossier import * +from GJ516Music.Helpers.inline import ( + buttons, + close_key, + help_back, + helpmenu, + pm_buttons, +) + + +@app.on_callback_query(filters.regex("forceclose")) +async def close_(_, 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_callback_query(filters.regex("close")) +async def forceclose_command(_, CallbackQuery): + try: + await CallbackQuery.message.delete() + except: + return + try: + await CallbackQuery.answer() + except: + pass + + +@app.on_callback_query(filters.regex(pattern=r"^(resume_cb|pause_cb|skip_cb|end_cb)$")) +@admin_check_cb +async def admin_cbs(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + + data = query.matches[0].group(1) + + if data == "resume_cb": + if await is_streaming(query.message.chat.id): + return await query.answer( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + ) + await stream_on(query.message.chat.id) + await pytgcalls.resume_stream(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + + elif data == "pause_cb": + if not await is_streaming(query.message.chat.id): + return await query.answer( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + ) + await stream_off(query.message.chat.id) + await pytgcalls.pause_stream(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + + elif data == "end_cb": + try: + await _clear_(query.message.chat.id) + await pytgcalls.leave_group_call(query.message.chat.id) + except: + pass + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ ❄\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + await query.message.delete() + + elif data == "skip_cb": + get = GJ516db.get(query.message.chat.id) + if not get: + try: + await _clear_(query.message.chat.id) + await pytgcalls.leave_group_call(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {query.message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + reply_markup=close_key, + ) + return await query.message.delete() + except: + return + else: + title = get[0]["title"] + duration = get[0]["duration"] + videoid = get[0]["videoid"] + file_path = get[0]["file_path"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.change_stream( + query.message.chat.id, + stream, + ) + except Exception as ex: + LOGGER.error(ex) + await _clear_(query.message.chat.id) + return await pytgcalls.leave_group_call(query.message.chat.id) + + img = await gen_thumb(videoid, user_id) + await query.edit_message_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + return await query.message.reply_photo( + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) + + +@app.on_callback_query(filters.regex("unban_ass")) +async def unban_ass(_, CallbackQuery): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + chat_id, user_id = callback_request.split("|") + umm = (await app.get_chat_member(int(chat_id), BOT_ID)).privileges + if umm.can_restrict_members: + try: + await app.unban_chat_member(int(chat_id), ASS_ID) + except: + return await CallbackQuery.answer( + "» ғᴀɪʟᴇᴅ ᴛᴏ ᴜɴʙᴀɴ ᴀssɪsᴛᴀɴᴛ.", + show_alert=True, + ) + return await CallbackQuery.edit_message_text( + f"➻ {ASS_NAME} sᴜᴄᴄᴇssғᴜʟʟʏ ᴜɴʙᴀɴɴᴇᴅ ʙʏ {CallbackQuery.from_user.mention}.\n\nᴛʀʏ ᴘʟᴀʏɪɴɢ ɴᴏᴡ..." + ) + else: + return await CallbackQuery.answer( + "» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴜɴʙᴀɴ ᴜsᴇʀs ɪɴ ᴛʜɪs ᴄʜᴀᴛ.", + show_alert=True, + ) + + +@app.on_callback_query(filters.regex("GJ516_help")) +async def help_menu(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + + try: + await query.edit_message_text( + text=f"๏ ʜᴇʏ {query.from_user.first_name}, 🥀\n\nᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴘ.", + reply_markup=InlineKeyboardMarkup(helpmenu), + ) + except Exception as e: + LOGGER.error(e) + return + + +@app.on_callback_query(filters.regex("GJ516_cb")) +async def open_hmenu(_, query: CallbackQuery): + callback_data = query.data.strip() + cb = callback_data.split(None, 1)[1] + keyboard = InlineKeyboardMarkup(help_back) + + try: + await query.answer() + except: + pass + + if cb == "help": + await query.edit_message_text(HELP_TEXT, reply_markup=keyboard) + elif cb == "sudo": + await query.edit_message_text(HELP_SUDO, reply_markup=keyboard) + elif cb == "owner": + await query.edit_message_text(HELP_DEV, reply_markup=keyboard) + + +@app.on_callback_query(filters.regex("GJ516_home")) +async def home_GJ516(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + try: + await query.edit_message_text( + text=PM_START_TEXT.format( + query.from_user.first_name, + BOT_MENTION, + ), + reply_markup=InlineKeyboardMarkup(pm_buttons), + ) + except: + pass diff --git a/GJ516music/Modules/cleaner.py b/GJ516music/Modules/cleaner.py new file mode 100644 index 0000000..7cf1a91 --- /dev/null +++ b/GJ516music/Modules/cleaner.py @@ -0,0 +1,49 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +from pyrogram import filters +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import app + + +@app.on_message(filters.command(["clearcache", "rmdownloads"]) & filters.user(OWNER_ID)) +async def clear_misc(_, message: Message): + try: + await message.delete() + except: + pass + downloads = os.path.realpath("downloads") + down_dir = os.listdir(downloads) + pth = os.path.realpath(".") + os_dir = os.listdir(pth) + + if down_dir: + for file in down_dir: + os.remove(os.path.join(downloads, file)) + if os_dir: + for lel in os.listdir(pth): + os.system("rm -rf *.webm *.jpg *.png") + await message.reply_text("» ᴀʟʟ ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs ᴄʟᴇᴀɴᴇᴅ.") diff --git a/GJ516music/Modules/eval.py b/GJ516music/Modules/eval.py new file mode 100644 index 0000000..4a79104 --- /dev/null +++ b/GJ516music/Modules/eval.py @@ -0,0 +1,195 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +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 GJ516Music import LOGGER, SUDOERS, app + + +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}) + + +@app.on_edited_message(filters.command("eval") & SUDOERS & ~filters.forwarded) +@app.on_message(filters.command("eval") & SUDOERS & ~filters.forwarded) +async def executor(client, 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 = "" + if exc: + evaluation = exc + elif stderr: + evaluation = stderr + elif stdout: + evaluation = stdout + else: + evaluation = "Success" + final_output = f"**OUTPUT**:\n```{evaluation.strip()}```" + if len(final_output) > 4096: + filename = "output.txt" + with open(filename, "w+", encoding="utf8") as out_file: + out_file.write(str(evaluation.strip())) + t2 = time() + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳", + callback_data=f"runtime {t2-t1} Seconds", + ) + ] + ] + ) + await message.reply_document( + document=filename, + caption=f"**INPUT:**\n`{cmd[0:980]}`\n\n**OUTPUT:**\n`Attached 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_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(client, 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: + LOGGER.error(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: + LOGGER.error(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 client.send_document( + message.chat.id, + "output.txt", + reply_to_message_id=message.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: **\n`No output`") diff --git a/GJ516music/Modules/inline.py b/GJ516music/Modules/inline.py new file mode 100644 index 0000000..4945aec --- /dev/null +++ b/GJ516music/Modules/inline.py @@ -0,0 +1,92 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + InlineQueryResultPhoto, +) +from youtubesearchpython.__future__ import VideosSearch + +from GJ516Music import BOT_NAME, app + + +@app.on_inline_query() +async def inline_query_handler(_, query): + text = query.query.strip().lower() + answers = [] + if text.strip() == "": + try: + await app.answer_inline_query( + query.id, + results=answers, + switch_pm_text="ᴛʏᴘᴇ sᴏᴍᴇᴛʜɪɴɢ ᴛᴏ sᴇᴀʀᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ...", + 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}]({link}) + +⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`ᴍɪɴᴜᴛᴇs +👀 **ᴠɪᴇᴡs :** `{views}` +⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} +🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) + +💖 **sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}**""" + answers.append( + InlineQueryResultPhoto( + photo_url=thumbnail, + title=title, + thumb_url=thumbnail, + description=description, + caption=searched_text, + reply_markup=buttons, + ) + ) + try: + return await app.answer_inline_query(query.id, results=answers) + except: + return diff --git a/GJ516music/Modules/leaveall.py b/GJ516music/Modules/leaveall.py new file mode 100644 index 0000000..42b741f --- /dev/null +++ b/GJ516music/Modules/leaveall.py @@ -0,0 +1,63 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import ASS_MENTION, SUNAME, app, app2 + + +@app.on_message(filters.command(["leaveall", "assleaveall"]) & filters.user(OWNER_ID)) +async def ass_leaveall(_, message: Message): + lear = await message.reply_text(f"» {ASS_MENTION} sᴛᴀʀᴛᴇᴅ ʟᴇᴀᴠɪɴɢ ᴄʜᴀᴛs...") + left = 0 + failed = 0 + chats = [] + async for dialog in app2.get_dialogs(): + chats.append(int(dialog.chat.id)) + schat = (await app.get_chat(SUNAME)).id + for i in chats: + if i in (-1001686672798, int(schat)): + continue + try: + await app2.leave_chat(int(i)) + left += 1 + except FloodWait as e: + flood_time = int(e.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except Exception: + continue + failed += 1 + try: + await lear.edit_text( + f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + ) + except: + await message.reply_text( + f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + ) diff --git a/GJ516music/Modules/pause.py b/GJ516music/Modules/pause.py new file mode 100644 index 0000000..3014791 --- /dev/null +++ b/GJ516music/Modules/pause.py @@ -0,0 +1,48 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import app, pytgcalls +from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_off + + +@app.on_message(filters.command(["pause"]) & filters.group) +@admin_check +async def pause_str(_, message: Message): + try: + await message.delete() + except: + pass + + if not await is_streaming(message.chat.id): + return await message.reply_text( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" + ) + + await pytgcalls.pause_stream(message.chat.id) + await stream_off(message.chat.id) + return await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516music/Modules/ping.py b/GJ516music/Modules/ping.py new file mode 100644 index 0000000..a5e2ec3 --- /dev/null +++ b/GJ516music/Modules/ping.py @@ -0,0 +1,68 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import time +from datetime import datetime + +import psutil +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +import config +from FallenMusic import BOT_NAME, StartTime, app +from FallenMusic.Helpers import get_readable_time + + +@app.on_message(filters.command("ping")) +async def ping_fallen(_, message: Message): + hmm = await message.reply_photo( + photo=config.PING_IMG, caption=f"{BOT_NAME} ɪs ᴘɪɴɢɪɴɢ..." + ) + upt = int(time.time() - StartTime) + cpu = psutil.cpu_percent(interval=0.5) + mem = psutil.virtual_memory().percent + disk = psutil.disk_usage("/").percent + start = datetime.now() + resp = (datetime.now() - start).microseconds / 1000 + uptime = get_readable_time((upt)) + + await hmm.edit_text( + f"""➻ ᴩᴏɴɢ : `{resp}ᴍs` + +{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs : + +๏ **ᴜᴩᴛɪᴍᴇ :** {uptime} +๏ **ʀᴀᴍ :** {mem} +๏ **ᴄᴩᴜ :** {cpu} +๏ **ᴅɪsᴋ :** {disk}""", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("❄ sᴜᴘᴘᴏʀᴛ ❄", url=config.SUPPORT_CHAT), + InlineKeyboardButton( + "✨ sᴏᴜʀᴄᴇ ✨", + url="https://github.com/AnonymousX1025/FallenMusic", + ), + ], + ] + ), + ) diff --git a/GJ516music/Modules/play.py b/GJ516music/Modules/play.py new file mode 100644 index 0000000..0625855 --- /dev/null +++ b/GJ516music/Modules/play.py @@ -0,0 +1,258 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import os + +from pyrogram import filters +from pyrogram.enums import ChatMemberStatus +from pyrogram.errors import ( + ChatAdminRequired, + UserAlreadyParticipant, + UserNotParticipant, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from pytgcalls import StreamType +from pytgcalls.exceptions import NoActiveGroupCall, TelegramServerError, UnMuteNeeded +from pytgcalls.types import AudioPiped, HighQualityAudio +from youtube_search import YoutubeSearch + +from config import DURATION_LIMIT +from GJ516Music import ( + ASS_ID, + ASS_MENTION, + ASS_NAME, + ASS_USERNAME, + BOT_NAME, + BOT_USERNAME, + LOGGER, + app, + app2, + GJ516db, + pytgcalls, +) +from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on +from GJ516Music.Helpers.downloaders import audio_dl +from GJ516Music.Helpers.errors import DurationLimitError +from GJ516Music.Helpers.gets import get_file_name, get_url +from GJ516Music.Helpers.inline import buttons +from GJ516Music.Helpers.queue import put +from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb + + +@app.on_message( + filters.command(["play", "vplay", "p"]) + & filters.group + & ~filters.forwarded + & ~filters.via_bot +) +async def play(_, message: Message): + GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + try: + await message.delete() + except: + pass + + try: + try: + get = await app.get_chat_member(message.chat.id, ASS_ID) + except ChatAdminRequired: + return await GJ516.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + if get.status == ChatMemberStatus.BANNED: + unban_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=f"ᴜɴʙᴀɴ {ASS_NAME}", + callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", + ), + ] + ] + ) + return await GJ516.edit_text( + text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", + reply_markup=unban_butt, + ) + except UserNotParticipant: + if message.chat.username: + invitelink = message.chat.username + try: + await app2.resolve_peer(invitelink) + except Exception as ex: + LOGGER.error(ex) + else: + try: + invitelink = await app.export_chat_invite_link(message.chat.id) + except ChatAdminRequired: + return await GJ516.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + except Exception as ex: + return await GJ516.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + if invitelink.startswith("https://t.me/+"): + invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") + anon = await GJ516.edit_text( + f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." + ) + try: + await app2.join_chat(invitelink) + await asyncio.sleep(2) + await GJ516.edit_text( + f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + ) + except UserAlreadyParticipant: + pass + except Exception as ex: + return await GJ516.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + try: + await app2.resolve_peer(invitelink) + except: + pass + + ruser = message.from_user.first_name + audio = ( + (message.reply_to_message.audio or message.reply_to_message.voice) + if message.reply_to_message + else None + ) + url = get_url(message) + if audio: + if round(audio.duration / 60) > DURATION_LIMIT: + raise DurationLimitError( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + + file_name = get_file_name(audio) + title = file_name + duration = round(audio.duration / 60) + file_path = ( + await message.reply_to_message.download(file_name) + if not os.path.isfile(os.path.join("downloads", file_name)) + else f"downloads/{file_name}" + ) + + elif url: + try: + results = YoutubeSearch(url, max_results=1).to_dict() + title = results[0]["title"] + duration = results[0]["duration"] + videoid = results[0]["id"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + return await GJ516.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") + + if (dur / 60) > DURATION_LIMIT: + return await GJ516.edit_text( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + else: + if len(message.command) < 2: + return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") + await GJ516.edit_text("🔎") + query = message.text.split(None, 1)[1] + try: + results = YoutubeSearch(query, max_results=1).to_dict() + url = f"https://youtube.com{results[0]['url_suffix']}" + title = results[0]["title"] + videoid = results[0]["id"] + duration = results[0]["duration"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + LOGGER.error(str(e)) + return await GJ516.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") + + if (dur / 60) > DURATION_LIMIT: + return await GJ516.edit( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + + try: + videoid = videoid + except: + videoid = "fuckitstgaudio" + if await is_active_chat(message.chat.id): + await put( + message.chat.id, + title, + duration, + videoid, + file_path, + ruser, + message.from_user.id, + ) + position = len(GJ516db.get(message.chat.id)) + qimg = await gen_qthumb(videoid, message.from_user.id) + await message.reply_photo( + photo=qimg, + caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + else: + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.join_group_call( + message.chat.id, + stream, + stream_type=StreamType().pulse_stream, + ) + + except NoActiveGroupCall: + return await GJ516.edit_text( + "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + ) + except TelegramServerError: + return await GJ516.edit_text( + "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." + ) + except UnMuteNeeded: + return await GJ516.edit_text( + f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." + ) + + imgt = await gen_thumb(videoid, message.from_user.id) + await stream_on(message.chat.id) + await add_active_chat(message.chat.id) + await message.reply_photo( + photo=imgt, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + + return await GJ516.delete() diff --git a/GJ516music/Modules/resume.py b/GJ516music/Modules/resume.py new file mode 100644 index 0000000..57ccb5a --- /dev/null +++ b/GJ516music/Modules/resume.py @@ -0,0 +1,45 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import app, pytgcalls +from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_on + + +@app.on_message(filters.command(["resume"]) & filters.group) +@admin_check +async def res_str(_, message: Message): + try: + await message.delete() + except: + pass + + if await is_streaming(message.chat.id): + return await message.reply_text("ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?") + await stream_on(message.chat.id) + await pytgcalls.resume_stream(message.chat.id) + return await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516music/Modules/search.py b/GJ516music/Modules/search.py new file mode 100644 index 0000000..ea3ec2c --- /dev/null +++ b/GJ516music/Modules/search.py @@ -0,0 +1,67 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtube_search import YoutubeSearch + +from GJ516Music import app + + +@app.on_message(filters.command(["search"])) +async def ytsearch(_, message: Message): + try: + await message.delete() + except: + pass + try: + if len(message.command) < 2: + return await message.reply_text("» ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴀʀᴄʜ ʙᴀʙʏ !") + query = message.text.split(None, 1)[1] + m = await message.reply_text("🔎") + results = YoutubeSearch(query, max_results=4).to_dict() + i = 0 + text = "" + while i < 4: + text += f"✨ ᴛɪᴛʟᴇ : {results[i]['title']}\n" + text += f"⏱ ᴅᴜʀᴀᴛɪᴏɴ : `{results[i]['duration']}`\n" + text += f"👀 ᴠɪᴇᴡs : `{results[i]['views']}`\n" + text += f"📣 ᴄʜᴀɴɴᴇʟ : {results[i]['channel']}\n" + text += f"🔗 ʟɪɴᴋ : https://youtube.com{results[i]['url_suffix']}\n\n" + i += 1 + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟᴏsᴇ", + callback_data=f"forceclose abc|{message.from_user.id}", + ), + ] + ] + ) + await m.edit_text( + text=text, + reply_markup=key, + disable_web_page_preview=True, + ) + except Exception as e: + await message.reply_text(str(e)) diff --git a/GJ516music/Modules/skip.py b/GJ516music/Modules/skip.py new file mode 100644 index 0000000..a3779c2 --- /dev/null +++ b/GJ516music/Modules/skip.py @@ -0,0 +1,77 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message +from pytgcalls.types import AudioPiped, HighQualityAudio + +from GJ516Music import BOT_USERNAME, app, GJ516db, pytgcalls +from GJ516Music.Helpers import _clear_, admin_check, buttons, close_key, gen_thumb + + +@app.on_message(filters.command(["skip", "next"]) & filters.group) +@admin_check +async def skip_str(_, message: Message): + try: + await message.delete() + except: + pass + get = GJ516db.get(message.chat.id) + if not get: + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + reply_markup=close_key, + ) + except: + return + else: + title = get[0]["title"] + duration = get[0]["duration"] + file_path = get[0]["file_path"] + videoid = get[0]["videoid"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.change_stream( + message.chat.id, + stream, + ) + except: + await _clear_(message.chat.id) + return await pytgcalls.leave_group_call(message.chat.id) + + await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) + img = await gen_thumb(videoid, user_id) + return await message.reply_photo( + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) diff --git a/GJ516music/Modules/song.py b/GJ516music/Modules/song.py new file mode 100644 index 0000000..e8d921a --- /dev/null +++ b/GJ516music/Modules/song.py @@ -0,0 +1,119 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +import requests +import yt_dlp +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtube_search import YoutubeSearch + +from GJ516Music import BOT_MENTION, BOT_USERNAME, LOGGER, app + + +@app.on_message(filters.command(["song", "vsong", "video", "music"])) +async def song(_, message: Message): + try: + await message.delete() + except: + pass + m = await message.reply_text("🔎") + + query = "".join(" " + str(i) for i in message.command[1:]) + ydl_opts = {"format": "bestaudio[ext=m4a]"} + try: + results = YoutubeSearch(query, max_results=5).to_dict() + link = f"https://youtube.com{results[0]['url_suffix']}" + title = results[0]["title"][:40] + thumbnail = results[0]["thumbnails"][0] + thumb_name = f"thumb{title}.jpg" + thumb = requests.get(thumbnail, allow_redirects=True) + open(thumb_name, "wb").write(thumb.content) + duration = results[0]["duration"] + + except Exception as ex: + LOGGER.error(ex) + return await m.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴛ-ᴅʟ.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + + await m.edit_text("» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢ,\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + info_dict = ydl.extract_info(link, download=False) + audio_file = ydl.prepare_filename(info_dict) + ydl.process_info(info_dict) + rep = f"☁️ **ᴛɪᴛʟᴇ :** [{title[:23]}]({link})\n⏱️ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`\n🥀 **ᴜᴘʟᴏᴀᴅᴇᴅ ʙʏ :** {BOT_MENTION}" + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + try: + visit_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʏᴏᴜᴛᴜʙᴇ", + url=link, + ) + ] + ] + ) + await app.send_audio( + chat_id=message.from_user.id, + audio=audio_file, + caption=rep, + thumb=thumb_name, + title=title, + duration=dur, + reply_markup=visit_butt, + ) + if message.chat.type != ChatType.PRIVATE: + await message.reply_text( + "ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, sᴇɴᴛ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴛʜᴇʀᴇ." + ) + except: + start_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟɪᴄᴋ ʜᴇʀᴇ", + url=f"https://t.me/{BOT_USERNAME}?start", + ) + ] + ] + ) + return await m.edit_text( + text="ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴀɴᴅ sᴛᴀʀᴛ ᴍᴇ ғᴏʀ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢs.", + reply_markup=start_butt, + ) + await m.delete() + except: + return await m.edit_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴜᴘʟᴏᴀᴅ ᴀᴜᴅɪᴏ ᴏɴ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀs.") + + try: + os.remove(audio_file) + os.remove(thumb_name) + except Exception as ex: + LOGGER.error(ex) diff --git a/GJ516music/Modules/speedtest.py b/GJ516music/Modules/speedtest.py new file mode 100644 index 0000000..ebc7e23 --- /dev/null +++ b/GJ516music/Modules/speedtest.py @@ -0,0 +1,67 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +import speedtest +from pyrogram import filters + +from GJ516Music import SUDOERS, app + + +def testspeed(m): + try: + test = speedtest.Speedtest() + test.get_best_server() + m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + test.download() + m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + test.upload() + test.results.share() + result = test.results.dict() + m = m.edit("**↻ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs...**") + except Exception as e: + return m.edit(e) + return result + + +@app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) +async def speedtest_function(_, message): + m = await message.reply_text("**» ʀᴜɴɴɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ...**") + loop = asyncio.get_event_loop() + result = await loop.run_in_executor(None, testspeed, m) + output = f"""✯ **sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs** ✯ + +**❥͜͡ᴄʟɪᴇɴᴛ :** +**» __ɪsᴩ :__** {result['client']['isp']} +**» __ᴄᴏᴜɴᴛʀʏ :__** {result['client']['country']} + +**❥͜͡sᴇʀᴠᴇʀ :** +**» __ɴᴀᴍᴇ :__** {result['server']['name']} +**» __ᴄᴏᴜɴᴛʀʏ :__** {result['server']['country']}, {result['server']['cc']} +**» __sᴩᴏɴsᴏʀ :__** {result['server']['sponsor']} +**» __ʟᴀᴛᴇɴᴄʏ :__** {result['server']['latency']} +**» __ᴩɪɴɢ :__** {result['ping']}""" + msg = await app.send_photo( + chat_id=message.chat.id, photo=result["share"], caption=output + ) + await m.delete() diff --git a/GJ516music/Modules/start.py b/GJ516music/Modules/start.py new file mode 100644 index 0000000..b0f26dd --- /dev/null +++ b/GJ516music/Modules/start.py @@ -0,0 +1,103 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.enums import ChatType, ParseMode +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtubesearchpython.__future__ import VideosSearch + +import config +from GJ516Music import BOT_MENTION, BOT_NAME, app +from GJ516Music.Helpers import gp_buttons, pm_buttons +from GJ516Music.Helpers.dossier import * + + +@app.on_message(filters.command(["start"]) & ~filters.forwarded) +@app.on_edited_message(filters.command(["start"]) & ~filters.forwarded) +async def GJ516_st(_, message: Message): + if message.chat.type == ChatType.PRIVATE: + if len(message.text.split()) > 1: + cmd = message.text.split(None, 1)[1] + if cmd[0:3] == "inf": + m = await message.reply_text("🔎") + query = (str(cmd)).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 = f""" +➻ **ᴛʀᴀᴄᴋ ɪɴғᴏʀɴᴀᴛɪᴏɴ** + +📌 **ᴛɪᴛʟᴇ :** {title} + +⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** {duration} ᴍɪɴᴜᴛᴇs +👀 **ᴠɪᴇᴡs :** `{views}` +⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} +🔗 **ʟɪɴᴋ :** [ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ]({link}) +🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) + +💖 sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}""" + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ʏᴏᴜᴛᴜʙᴇ", url=link), + InlineKeyboardButton( + text="sᴜᴩᴩᴏʀᴛ", url=config.SUPPORT_CHAT + ), + ], + ] + ) + await m.delete() + return await app.send_photo( + message.chat.id, + photo=thumbnail, + caption=searched_text, + parse_mode=ParseMode.MARKDOWN, + reply_markup=key, + ) + else: + await message.reply_photo( + photo=config.START_IMG, + caption=PM_START_TEXT.format( + message.from_user.first_name, + BOT_MENTION, + ), + reply_markup=InlineKeyboardMarkup(pm_buttons), + ) + else: + await message.reply_photo( + photo=config.START_IMG, + caption=START_TEXT.format( + message.from_user.first_name, + BOT_MENTION, + message.chat.title, + config.SUPPORT_CHAT, + ), + reply_markup=InlineKeyboardMarkup(gp_buttons), + ) diff --git a/GJ516music/Modules/stop.py b/GJ516music/Modules/stop.py new file mode 100644 index 0000000..a2502cb --- /dev/null +++ b/GJ516music/Modules/stop.py @@ -0,0 +1,46 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from FallenMusic import app, pytgcalls +from FallenMusic.Helpers import _clear_, admin_check, close_key + + +@app.on_message(filters.command(["stop", "end"]) & filters.group) +@admin_check +async def stop_str(_, message: Message): + try: + await message.delete() + except: + pass + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + + return await message.reply_text( + text=f"➻ **sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ** ❄\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516music/Modules/sudoers.py b/GJ516music/Modules/sudoers.py new file mode 100644 index 0000000..708e91f --- /dev/null +++ b/GJ516music/Modules/sudoers.py @@ -0,0 +1,132 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from config import OWNER_ID +from FallenMusic import SUDOERS, app + + +@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) +async def sudoadd(_, message: Message): + try: + await message.delete() + except: + pass + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + ) + user = message.text.split(None, 1)[1] + if "@" in user: + user = user.replace("@", "") + user = await app.get_users(user) + if int(user.id) in SUDOERS: + return await message.reply_text(f"» {user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ.") + try: + SUDOERS.add(int(user.id)) + await message.reply_text(f"ᴀᴅᴅᴇᴅ {user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ.") + except: + return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + + if message.reply_to_message.from_user.id in SUDOERS: + return await message.reply_text( + f"» {message.reply_to_message.from_user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ." + ) + try: + SUDOERS.add(message.reply_to_message.from_user.id) + await message.reply_text( + f"ᴀᴅᴅᴇᴅ {message.reply_to_message.from_user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + + +@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) +async def sudodel(_, message: Message): + try: + await message.delete() + except: + pass + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + ) + user = message.text.split(None, 1)[1] + if "@" in user: + user = user.replace("@", "") + user = await app.get_users(user) + if int(user.id) not in SUDOERS: + return await message.reply_text( + f"» {user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + try: + SUDOERS.remove(int(user.id)) + return await message.reply_text( + f"» ʀᴇᴍᴏᴠᴇᴅ {user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + else: + user_id = message.reply_to_message.from_user.id + if int(user_id) not in SUDOERS: + return await message.reply_text( + f"» {message.reply_to_message.from_user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + try: + SUDOERS.remove(int(user_id)) + return await message.reply_text( + f"» ʀᴇᴍᴏᴠᴇᴅ {message.reply_to_message.from_user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + + +@app.on_message(filters.command(["sudolist", "sudoers", "sudo"])) +async def sudoers_list(_, message: Message): + hehe = await message.reply_text("» ɢᴇᴛᴛɪɴɢ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ...") + text = "🥀 **ᴏᴡɴᴇʀ :**\n" + count = 0 + user = await app.get_users(OWNER_ID) + user = user.first_name if not user.mention else user.mention + count += 1 + text += f"{count}➤ {user}\n" + 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 += "\n✨ **sᴜᴅᴏᴇʀs :**\n" + count += 1 + text += f"{count}➤ {user}\n" + except Exception: + continue + if not text: + await message.reply_text("» ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ.") + else: + await hehe.edit_text(text) diff --git a/GJ516music/Modules/sysstats.py b/GJ516music/Modules/sysstats.py new file mode 100644 index 0000000..c71c194 --- /dev/null +++ b/GJ516music/Modules/sysstats.py @@ -0,0 +1,115 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import platform +import re +import socket +import uuid +from sys import version as pyver + +import psutil +from pyrogram import __version__ as pyrover +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from pytgcalls.__version__ import __version__ as pytgver + +from GJ516Music import BOT_NAME, SUDOERS, app +from GJ516Music.Modules import ALL_MODULES + + +@app.on_message(filters.command(["stats", "sysstats"]) & SUDOERS) +async def sys_stats(_, message: Message): + sysrep = await message.reply_text( + f"ɢᴇᴛᴛɪɴɢ {BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs, ɪᴛ'ʟʟ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ..." + ) + try: + await message.delete() + except: + pass + sudoers = len(SUDOERS) + mod = len(ALL_MODULES) + hostname = socket.gethostname() + ip_address = socket.gethostbyname(socket.gethostname()) + architecture = platform.machine() + processor = platform.processor() + mac_address = ":".join(re.findall("..", "%012x" % uuid.getnode())) + sp = platform.system() + ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " ɢʙ" + p_core = psutil.cpu_count(logical=False) + t_core = psutil.cpu_count(logical=True) + 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) + total = str(total) + used = hdd.used / (1024.0**3) + used = str(used) + free = hdd.free / (1024.0**3) + free = str(free) + platform_release = platform.release() + platform_version = platform.version() + + await sysrep.edit_text( + f""" +➻ **{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs** + +**ᴩʏᴛʜᴏɴ :** {pyver.split()[0]} +**ᴩʏʀᴏɢʀᴀᴍ :** {pyrover} +**ᴩʏ-ᴛɢᴄᴀʟʟs :** {pytgver} +**sᴜᴅᴏᴇʀs :** `{sudoers}` +**ᴍᴏᴅᴜʟᴇs :** `{mod}` + +**ɪᴘ :** {ip_address} +**ᴍᴀᴄ :** {mac_address} +**ʜᴏsᴛɴᴀᴍᴇ :** {hostname} +**ᴘʟᴀᴛғᴏʀᴍ :** {sp} +**ᴘʀᴏᴄᴇssᴏʀ :** {processor} +**ᴀʀᴄʜɪᴛᴇᴄᴛᴜʀᴇ :** {architecture} +**ᴘʟᴀᴛғᴏʀᴍ ʀᴇʟᴇᴀsᴇ :** {platform_release} +**ᴘʟᴀᴛғᴏʀᴍ ᴠᴇʀsɪᴏɴ :** {platform_version} + + sᴛᴏʀᴀɢᴇ +**ᴀᴠᴀɪʟᴀʙʟᴇ :** {total[:4]} ɢɪʙ +**ᴜsᴇᴅ :** {used[:4]} ɢɪʙ +**ғʀᴇᴇ :** {free[:4]} ɢɪʙ + +**ʀᴀᴍ :** {ram} +**ᴩʜʏsɪᴄᴀʟ ᴄᴏʀᴇs :** {p_core} +**ᴛᴏᴛᴀʟ ᴄᴏʀᴇs :** {t_core} +**ᴄᴩᴜ ғʀᴇǫᴜᴇɴᴄʏ :** {cpu_freq}""", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟᴏsᴇ", + callback_data=f"forceclose abc|{message.from_user.id}", + ), + ] + ] + ), + ) diff --git a/GJ516music/Modules/variables.py b/GJ516music/Modules/variables.py new file mode 100644 index 0000000..fcf69cc --- /dev/null +++ b/GJ516music/Modules/variables.py @@ -0,0 +1,61 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import Message + +import config +from GJ516Music import BOT_NAME, app + + +@app.on_message( + filters.command(["config", "variables"]) & filters.user(config.OWNER_ID) +) +async def get_vars(_, message: Message): + try: + await app.send_message( + chat_id=int(config.OWNER_ID), + text=f"""**{BOT_NAME} ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs :** + +**ᴀᴘɪ_ɪᴅ :** `{config.API_ID}` +**ᴀᴘɪ_ʜᴀsʜ :** `{config.API_HASH}` + +**ʙᴏᴛ_ᴛᴏᴋᴇɴ :** `{config.BOT_TOKEN}` +**ᴅᴜʀᴀᴛɪᴏɴ_ʟɪᴍɪᴛ :** `{config.DURATION_LIMIT}` + +**ᴏᴡɴᴇʀ_ɪᴅ :** `{config.OWNER_ID}` +**sᴜᴅᴏ_ᴜsᴇʀs :** `{config.SUDO_USERS}` + +**ᴘɪɴɢ_ɪᴍɢ :** `{config.PING_IMG}` +**sᴛᴀʀᴛ_ɪᴍɢ :** `{config.START_IMG}` +**sᴜᴘᴘᴏʀᴛ_ᴄʜᴀᴛ :** `{config.SUPPORT_CHAT}` + +**sᴇssɪᴏɴ :** `{config.SESSION}`""", + disable_web_page_preview=True, + ) + except: + return await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ sᴇɴᴅ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs.") + if message.chat.type != ChatType.PRIVATE: + await message.reply_text( + "» ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, ɪ'ᴠᴇ sᴇɴᴛ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs ᴛʜᴇʀᴇ." + ) diff --git a/GJ516music/Modules/watcher.py b/GJ516music/Modules/watcher.py new file mode 100644 index 0000000..90bbefb --- /dev/null +++ b/GJ516music/Modules/watcher.py @@ -0,0 +1,110 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message +from pytgcalls.types import AudioPiped, HighQualityAudio, Update + +from GJ516Music import BOT_ID, BOT_USERNAME, app, app2, GJ516db, pytgcalls +from GJ516Music.Helpers import _clear_, buttons, gen_thumb + +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): + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + + +@app.on_message(filters.left_chat_member) +async def ub_leave(_, message: Message): + if message.left_chat_member.id == BOT_ID: + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + try: + await app2.leave_chat(message.chat.id) + except: + pass + + +@pytgcalls.on_left() +@pytgcalls.on_kicked() +@pytgcalls.on_closed_voice_chat() +async def swr_handler(_, chat_id: int): + try: + await _clear_(chat_id) + except: + pass + + +@pytgcalls.on_stream_end() +async def on_stream_end(pytgcalls, update: Update): + chat_id = update.chat_id + + get = GJ516db.get(chat_id) + if not get: + try: + await _clear_(chat_id) + return await pytgcalls.leave_group_call(chat_id) + except: + return + else: + process = await app.send_message( + chat_id=chat_id, + text="» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ᴏ̨ᴜᴇᴜᴇ...", + ) + title = get[0]["title"] + duration = get[0]["duration"] + file_path = get[0]["file_path"] + videoid = get[0]["videoid"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + + try: + await pytgcalls.change_stream( + chat_id, + stream, + ) + except: + await _clear_(chat_id) + return await pytgcalls.leave_group_call(chat_id) + + img = await gen_thumb(videoid, user_id) + await process.delete() + await app.send_photo( + chat_id=chat_id, + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) From ba8aa4ea77893672fca95ee8f6aef4590a1b94bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:55:30 +0530 Subject: [PATCH 013/211] Add files via upload --- GJ516music/__init__.py | 118 +++++++++++++++++++++++++++++++++++++++++ GJ516music/__main__.py | 92 ++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 GJ516music/__init__.py create mode 100644 GJ516music/__main__.py diff --git a/GJ516music/__init__.py b/GJ516music/__init__.py new file mode 100644 index 0000000..a67ccc8 --- /dev/null +++ b/GJ516music/__init__.py @@ -0,0 +1,118 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import logging +import os +import time + +from pyrogram import Client, filters +from pytgcalls import PyTgCalls + +import config + +StartTime = time.time() + +logging.basicConfig( + format="[%(asctime)s - %(levelname)s] - %(name)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[logging.FileHandler("GJ516logs.txt"), logging.StreamHandler()], + level=logging.INFO, +) +logging.getLogger("pyrogram").setLevel(logging.ERROR) +logging.getLogger("pytgcalls").setLevel(logging.ERROR) +LOGGER = logging.getLogger("GJ516Music") + +app = Client( + "GJ516Music", + config.API_ID, + config.API_HASH, + bot_token=config.BOT_TOKEN, +) + +app2 = Client( + "GJ516Ass", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.SESSION), +) + +pytgcalls = PyTgCalls(app2) + +SUDOERS = filters.user() +SUNAME = config.SUPPORT_CHAT.split("me/")[1] + + +async def GJ516_startup(): + os.system("clear") + LOGGER.info( + "\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2523\u2605\x20\x46\x41\x4c\x4c\x45\x4e\x20\x4d\x55\x53\x49\x43\x20\x42\x4f\x54\x20\u2605\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b" + ) + global BOT_ID, BOT_NAME, BOT_USERNAME, BOT_MENTION, GJ516db + global ASS_ID, ASS_NAME, ASS_USERNAME, ASS_MENTION, SUDOERS + + await app.start() + LOGGER.info( + "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x42\x6f\x74\x2e\x2e\x2e" + ) + + getme = await app.get_me() + BOT_ID = getme.id + BOT_NAME = getme.first_name + BOT_USERNAME = getme.username + BOT_MENTION = getme.mention + + await app2.start() + LOGGER.info( + "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x41\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x2e\x2e" + ) + + getme2 = await app2.get_me() + ASS_ID = getme2.id + ASS_NAME = getme2.first_name + " " + (getme2.last_name or "") + ASS_USERNAME = getme2.username + ASS_MENTION = getme2.mention + try: + await app2.join_chat("DevilsHeavenMF") + await app2.join_chat("GJ516Association") + except: + pass + + ANON = "\x31\x33\x35\x36\x34\x36\x39\x30\x37\x35" + for SUDOER in config.SUDO_USERS: + SUDOERS.add(SUDOER) + if config.OWNER_ID not in config.SUDO_USERS: + SUDOERS.add(config.OWNER_ID) + elif int(ANON) not in config.SUDO_USERS: + SUDOERS.add(int(ANON)) + + GJ516db = {} + LOGGER.info( + "[•] \x4c\x6f\x63\x61\x6c\x20\x44\x61\x74\x61\x62\x61\x73\x65\x20\x49\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x2e\x2e\x2e" + ) + + LOGGER.info( + "[•] \x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x43\x6c\x69\x65\x6e\x74\x73\x20\x42\x6f\x6f\x74\x65\x64\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x2e" + ) + + +asyncio.get_event_loop().run_until_complete(GJ516_startup()) diff --git a/GJ516music/__main__.py b/GJ516music/__main__.py new file mode 100644 index 0000000..71b587f --- /dev/null +++ b/GJ516music/__main__.py @@ -0,0 +1,92 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import importlib +import os + +from pyrogram import idle + +from GJ516Music import ( + ASS_ID, + ASS_NAME, + ASS_USERNAME, + BOT_ID, + BOT_NAME, + BOT_USERNAME, + LOGGER, + SUNAME, + app, + app2, + pytgcalls, +) +from GJ516Music.Modules import ALL_MODULES + + +async def GJ516_startup(): + LOGGER.info("[•] Loading Modules...") + for module in ALL_MODULES: + importlib.import_module("GJ516Music.Modules." + module) + LOGGER.info(f"[•] Loaded {len(ALL_MODULES)} Modules.") + + LOGGER.info("[•] Refreshing Directories...") + if "downloads" not in os.listdir(): + os.mkdir("downloads") + if "cache" not in os.listdir(): + os.mkdir("cache") + LOGGER.info("[•] Directories Refreshed.") + + try: + await app.send_message( + SUNAME, + f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ʙᴏᴛ ✯\n\n𖢵 ɪᴅ : `{BOT_ID}`\n𖢵 ɴᴀᴍᴇ : {BOT_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{BOT_USERNAME}", + ) + except: + LOGGER.error( + f"{BOT_NAME} failed to send message at @{SUNAME}, please go & check." + ) + + try: + await app2.send_message( + SUNAME, + f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ᴀss ✯\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}", + ) + except: + LOGGER.error( + f"{ASS_NAME} failed to send message at @{SUNAME}, please go & check." + ) + + await app2.send_message(BOT_USERNAME, "/start") + + LOGGER.info(f"[•] Bot Started As {BOT_NAME}.") + LOGGER.info(f"[•] Assistant Started As {ASS_NAME}.") + + LOGGER.info( + "[•] \x53\x74\x61\x72\x74\x69\x6e\x67\x20\x50\x79\x54\x67\x43\x61\x6c\x6c\x73\x20\x43\x6c\x69\x65\x6e\x74\x2e\x2e\x2e" + ) + await pytgcalls.start() + await idle() + + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(GJ516_startup()) + LOGGER.error("GJ516 Music Bot Stopped.") From 65af3a9d234c5621f299f5fa80e00fd721f962fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:56:17 +0530 Subject: [PATCH 014/211] Add files via upload --- Dockerfile | 13 ++++++++++ GJ516 | 1 + LICENSE | 21 ++++++++++++++++ Procfile | 1 + app.json | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ config.py | 27 +++++++++++++++++++++ heroku.yml | 5 ++++ requirements.txt | 14 +++++++++++ sample.env | 5 ++++ 9 files changed, 149 insertions(+) create mode 100644 Dockerfile create mode 100644 GJ516 create mode 100644 LICENSE create mode 100644 Procfile create mode 100644 app.json create mode 100644 config.py create mode 100644 heroku.yml create mode 100644 requirements.txt create mode 100644 sample.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0987805 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM nikolaik/python-nodejs:python3.9-nodejs18 + +RUN apt-get update -y && apt-get upgrade -y \ + && 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 --upgrade --requirement requirements.txt + +CMD bash fallen diff --git a/GJ516 b/GJ516 new file mode 100644 index 0000000..2c13872 --- /dev/null +++ b/GJ516 @@ -0,0 +1 @@ +python3 -m FallenMusic diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b0f9914 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 AnonymousX1025 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..add4b35 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: bash fallen diff --git a/app.json b/app.json new file mode 100644 index 0000000..a088b89 --- /dev/null +++ b/app.json @@ -0,0 +1,62 @@ +{ + "name": "ғᴀʟʟᴇɴ ダ ᴍᴜsɪᴄ", + "description": "A VC Player Bot for telegram videochats, written in Python with Pyrogram and Py-Tgcalls.", + "logo": "https://te.legra.ph/file/6f99c49bdb4679acad717.jpg", + "keywords": [ + "python3", + "telegram", + "Fallen", + "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 + }, + "OWNER_ID": { + "description": "Fill your user id here. (Must be integer)", + "value": "1356469075", + "required": true + }, + "SESSION": { + "description": "A pyrogram v2 string session from @StringFatherBot", + "value": "", + "required": true + }, + "SUDO_USERS": { + "description": "The user id(s) of user(s) whom you would like to add as a sudo. Multiple values shall be seperated with a space.", + "value": "", + "required": true + }, + "SUPPORT_CHAT": { + "description": "Link of your telegram support group. (Must pe public)", + "value": "https://t.me/DevilsHeavenMF", + "required": false + } + }, + "buildpacks": [ + { + "url": "heroku/python" + }, + { + "url": "heroku/nodejs" + }, + { + "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest.git" + } + ], + "stack": "container" + } diff --git a/config.py b/config.py new file mode 100644 index 0000000..1bb6609 --- /dev/null +++ b/config.py @@ -0,0 +1,27 @@ +from os import getenv + +from dotenv import load_dotenv + +load_dotenv() + + +API_ID = int(getenv("API_ID")) +API_HASH = getenv("API_HASH") + +BOT_TOKEN = getenv("BOT_TOKEN", None) +DURATION_LIMIT = int(getenv("DURATION_LIMIT", "90")) + +OWNER_ID = int(getenv("OWNER_ID")) + +PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/6f99c49bdb4679acad717.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/f8ba75bdbb9931cbc8229.jpg") + +SESSION = getenv("SESSION", None) + +SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/DevilsHeavenMF") +SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/FallenAssociation") + +SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1356469075").split())) + + +FAILED = "https://te.legra.ph/file/4c896584b592593c00aa8.jpg" diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000..828f557 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,5 @@ +build: + docker: + worker: Dockerfile +run: + worker: bash fallen diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bf1e863 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +asyncio==3.4.3 +aiofiles==23.1.0 +aiohttp==3.8.4 +numpy==1.24.3 +pillow==9.5.0 +psutil +pyrogram==2.0.104 +py-tgcalls==0.9.7 +python-dotenv==1.0.0 +tgcrypto==1.2.5 +speedtest-cli==2.1.3 +git+https://github.com/yt-dlp/yt-dlp@master +git+https://github.com/alexmercerind/youtube-search-python@main +git+https://github.com/joetats/youtube_search@master diff --git a/sample.env b/sample.env new file mode 100644 index 0000000..75d9351 --- /dev/null +++ b/sample.env @@ -0,0 +1,5 @@ +API_ID= +API_HASH= +BOT_TOKEN= +OWNER_ID=1356469075 +SESSION= From 91718e37edbaef01b19e6a1812ba927171ef1573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 07:59:04 +0530 Subject: [PATCH 015/211] Create .gitignore --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10bc1e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.env +*.log +venv/ +.idea/ +*.session +raw_files/ +downloads/ +__pycache__/ +*.session-journal From 382573bbd3eb36bd8840332276a5d29dabab7dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 08:00:15 +0530 Subject: [PATCH 016/211] Create .dockerignore --- .dockerignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..01960af --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.env +*.log +.git/ +.idea/ +str.py +Procfile +README.md +downloads/ +raw_files/ +.gitignore +runtime.txt +__pycache__/ From 0403e1348a46de2415d0ef01d6575694459c0524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 08:32:35 +0530 Subject: [PATCH 017/211] Create GJ516Music --- GJ516Music | 1 + 1 file changed, 1 insertion(+) create mode 100644 GJ516Music diff --git a/GJ516Music b/GJ516Music new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/GJ516Music @@ -0,0 +1 @@ + From d97d358672f544ec59bdb19015f1988e2f92e4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 08:32:55 +0530 Subject: [PATCH 018/211] Delete GJ516Music --- GJ516Music | 1 - 1 file changed, 1 deletion(-) delete mode 100644 GJ516Music diff --git a/GJ516Music b/GJ516Music deleted file mode 100644 index 8b13789..0000000 --- a/GJ516Music +++ /dev/null @@ -1 +0,0 @@ - From 120854e9a7993a6ac19c80d3b01f7d09837fc8c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:35:20 +0530 Subject: [PATCH 019/211] Delete GJ516music directory --- GJ516music/Helpers/__init__.py | 32 --- GJ516music/Helpers/active.py | 60 ----- GJ516music/Helpers/admins.py | 91 ------- GJ516music/Helpers/clear.py | 32 --- GJ516music/Helpers/dossier.py | 81 ------ GJ516music/Helpers/downloaders.py | 52 ---- GJ516music/Helpers/errors.py | 29 --- GJ516music/Helpers/formatters.py | 45 ---- GJ516music/Helpers/gets.py | 57 ---- GJ516music/Helpers/inline.py | 110 -------- GJ516music/Helpers/queue.py | 48 ---- GJ516music/Helpers/thumbnails.py | 343 ------------------------- GJ516music/Helpers/utils/JAY DEVELOPER | 1 - GJ516music/Helpers/utils/__init__.py | 21 -- GJ516music/Helpers/utils/circle.png | Bin 23029 -> 0 bytes GJ516music/Helpers/utils/font.ttf | Bin 141612 -> 0 bytes GJ516music/Helpers/utils/font2.ttf | Bin 128248 -> 0 bytes GJ516music/Modules/JAY DEVELOPER | 1 - GJ516music/Modules/__init__.py | 40 --- GJ516music/Modules/activevc.py | 55 ---- GJ516music/Modules/assistant.py | 97 ------- GJ516music/Modules/broadcast.py | 65 ----- GJ516music/Modules/callback.py | 253 ------------------ GJ516music/Modules/cleaner.py | 49 ---- GJ516music/Modules/eval.py | 195 -------------- GJ516music/Modules/inline.py | 92 ------- GJ516music/Modules/leaveall.py | 63 ----- GJ516music/Modules/pause.py | 48 ---- GJ516music/Modules/ping.py | 68 ----- GJ516music/Modules/play.py | 258 ------------------- GJ516music/Modules/resume.py | 45 ---- GJ516music/Modules/search.py | 67 ----- GJ516music/Modules/skip.py | 77 ------ GJ516music/Modules/song.py | 119 --------- GJ516music/Modules/speedtest.py | 67 ----- GJ516music/Modules/start.py | 103 -------- GJ516music/Modules/stop.py | 46 ---- GJ516music/Modules/sudoers.py | 132 ---------- GJ516music/Modules/sysstats.py | 115 --------- GJ516music/Modules/variables.py | 61 ----- GJ516music/Modules/watcher.py | 110 -------- GJ516music/__init__.py | 118 --------- GJ516music/__main__.py | 92 ------- 43 files changed, 3438 deletions(-) delete mode 100644 GJ516music/Helpers/__init__.py delete mode 100644 GJ516music/Helpers/active.py delete mode 100644 GJ516music/Helpers/admins.py delete mode 100644 GJ516music/Helpers/clear.py delete mode 100644 GJ516music/Helpers/dossier.py delete mode 100644 GJ516music/Helpers/downloaders.py delete mode 100644 GJ516music/Helpers/errors.py delete mode 100644 GJ516music/Helpers/formatters.py delete mode 100644 GJ516music/Helpers/gets.py delete mode 100644 GJ516music/Helpers/inline.py delete mode 100644 GJ516music/Helpers/queue.py delete mode 100644 GJ516music/Helpers/thumbnails.py delete mode 100644 GJ516music/Helpers/utils/JAY DEVELOPER delete mode 100644 GJ516music/Helpers/utils/__init__.py delete mode 100644 GJ516music/Helpers/utils/circle.png delete mode 100644 GJ516music/Helpers/utils/font.ttf delete mode 100644 GJ516music/Helpers/utils/font2.ttf delete mode 100644 GJ516music/Modules/JAY DEVELOPER delete mode 100644 GJ516music/Modules/__init__.py delete mode 100644 GJ516music/Modules/activevc.py delete mode 100644 GJ516music/Modules/assistant.py delete mode 100644 GJ516music/Modules/broadcast.py delete mode 100644 GJ516music/Modules/callback.py delete mode 100644 GJ516music/Modules/cleaner.py delete mode 100644 GJ516music/Modules/eval.py delete mode 100644 GJ516music/Modules/inline.py delete mode 100644 GJ516music/Modules/leaveall.py delete mode 100644 GJ516music/Modules/pause.py delete mode 100644 GJ516music/Modules/ping.py delete mode 100644 GJ516music/Modules/play.py delete mode 100644 GJ516music/Modules/resume.py delete mode 100644 GJ516music/Modules/search.py delete mode 100644 GJ516music/Modules/skip.py delete mode 100644 GJ516music/Modules/song.py delete mode 100644 GJ516music/Modules/speedtest.py delete mode 100644 GJ516music/Modules/start.py delete mode 100644 GJ516music/Modules/stop.py delete mode 100644 GJ516music/Modules/sudoers.py delete mode 100644 GJ516music/Modules/sysstats.py delete mode 100644 GJ516music/Modules/variables.py delete mode 100644 GJ516music/Modules/watcher.py delete mode 100644 GJ516music/__init__.py delete mode 100644 GJ516music/__main__.py diff --git a/GJ516music/Helpers/__init__.py b/GJ516music/Helpers/__init__.py deleted file mode 100644 index 8c9a8e2..0000000 --- a/GJ516music/Helpers/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from .active import * -from .admins import * -from .clear import _clear_ -from .dossier import * -from .errors import * -from .formatters import * -from .gets import * -from .inline import * -from .queue import * -from .thumbnails import * diff --git a/GJ516music/Helpers/active.py b/GJ516music/Helpers/active.py deleted file mode 100644 index 724c23c..0000000 --- a/GJ516music/Helpers/active.py +++ /dev/null @@ -1,60 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -active = [] -stream = {} - - -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_chats() -> list: - return active - - -async def is_streaming(chat_id: int) -> bool: - run = stream.get(chat_id) - if not run: - return False - return run - - -async def stream_on(chat_id: int): - stream[chat_id] = True - - -async def stream_off(chat_id: int): - stream[chat_id] = False diff --git a/GJ516music/Helpers/admins.py b/GJ516music/Helpers/admins.py deleted file mode 100644 index 57d15ec..0000000 --- a/GJ516music/Helpers/admins.py +++ /dev/null @@ -1,91 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from typing import Callable - -from pyrogram.enums import ChatMemberStatus -from pyrogram.types import CallbackQuery, Message - -from GJ516Music import SUDOERS, app - -from .active import is_active_chat - - -def admin_check(func: Callable) -> Callable: - async def non_admin(_, message: Message): - if not await is_active_chat(message.chat.id): - return await message.reply_text("ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.") - - if message.from_user.id in SUDOERS: - return await func(_, message) - - check = await app.get_chat_member(message.chat.id, message.from_user.id) - if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: - return await message.reply_text( - "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." - ) - - admin = ( - await app.get_chat_member(message.chat.id, message.from_user.id) - ).privileges - if admin.can_manage_video_chats: - return await func(_, message) - else: - return await message.reply_text( - "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." - ) - - return non_admin - - -def admin_check_cb(func: Callable) -> Callable: - async def cb_non_admin(_, query: CallbackQuery): - if not await is_active_chat(query.message.chat.id): - return await query.answer( - "ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.", show_alert=True - ) - - if query.from_user.id in SUDOERS: - return await func(_, query) - - try: - check = await app.get_chat_member(query.message.chat.id, query.from_user.id) - except: - return - if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: - return await query.answer( - "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", - show_alert=True, - ) - - admin = ( - await app.get_chat_member(query.message.chat.id, query.from_user.id) - ).privileges - if admin.can_manage_video_chats: - return await func(_, query) - else: - return await query.answer( - "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", - show_alert=True, - ) - - return cb_non_admin diff --git a/GJ516music/Helpers/clear.py b/GJ516music/Helpers/clear.py deleted file mode 100644 index 605339d..0000000 --- a/GJ516music/Helpers/clear.py +++ /dev/null @@ -1,32 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from GJ516Music import GJ516db -from GJ516Music.Helpers import remove_active_chat - - -async def _clear_(chat_id): - try: - GJ516db[chat_id] = [] - await remove_active_chat(chat_id) - except: - return diff --git a/GJ516music/Helpers/dossier.py b/GJ516music/Helpers/dossier.py deleted file mode 100644 index 64c30eb..0000000 --- a/GJ516music/Helpers/dossier.py +++ /dev/null @@ -1,81 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from GJ516Music import BOT_NAME - -PM_START_TEXT = """ -ʜᴇʏ {0}, 🥀 -๏ ᴛʜɪs ɪs** {1} ! - -➻ ᴀ ғᴀsᴛ ᴀɴᴅ ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ᴘʟᴀʏᴇʀ ʙᴏᴛ. -""" - -START_TEXT = """ -**ʜᴇʏ** {0}, 🥀 - {1} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ {2}. - -────────────────── -➻ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʜᴇʟᴘ ᴀʙᴏᴜᴛ ᴍᴇ ᴏʀ ɪғ ʏᴏᴜ ᴡᴀɴɴᴀ ᴀsᴋ sᴏᴍᴇᴛʜɪɴɢ ʏᴏᴜ ᴄᴀɴ ᴊᴏɪɴ ᴍʏ [sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ]({3}). -""" - -HELP_TEXT = f""" -❄ **ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs ғᴏʀ ᴜsᴇʀs ɪɴ {BOT_NAME} :** - -๏ /play : sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. -๏ /pause : ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. -๏ /resume : ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. -๏ /skip : sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. -๏ /end : ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. - -๏ /ping : sʜᴏᴡ ᴛʜᴇ ᴩɪɴɢ ᴀɴᴅ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. -๏ /sudolist : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴅᴏ ᴜsᴇʀs ᴏғ ᴛʜᴇ ʙᴏᴛ. - -๏ /song : ᴅᴏᴡɴʟᴏᴀᴅs ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴀɴᴅ sᴇɴᴅ ɪᴛ ᴛᴏ ʏᴏᴜ. - -๏ /search : sᴇᴀʀᴄᴇs ᴛʜᴇ ɢɪᴠᴇɴ ǫᴜᴇʀʏ ᴏɴ ʏᴏᴜᴛᴜʙᴇ ᴀɴᴅ sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʀᴇsᴜʟᴛ. -""" - -HELP_SUDO = f""" -✨ **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** - -๏ /activevc : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs. -๏ /eval or /sh : ʀᴜɴs ᴛʜᴇ ɢɪᴠᴇɴ ᴄᴏᴅᴇ ᴏɴ ᴛʜᴇ ʙᴏᴛ's ᴛᴇʀᴍɪɴᴀʟ. -๏ /speedtest : ʀᴜɴs ᴀ sᴘᴇᴇᴅᴛᴇsᴛ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. -๏ /sysstats : sʜᴏᴡs ᴛʜᴇ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. - -๏ /setname [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ɴᴀᴍᴇ. -๏ /setbio [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ʙɪᴏ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. -๏ /setpfp [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. -๏ /delpfp : ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. -""" - -HELP_DEV = f""" -✨ **ᴏᴡɴᴇʀ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** - -๏ /config : ᴛᴏ ɢᴇᴛ ᴀʟʟ ᴄᴏɴꜰɪɢ ᴠᴀʀɪᴀʙʟᴇꜱ ᴏꜰ ʙᴏᴛ. -๏ /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] : ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. -๏ /rmdownloads : ᴄʟᴇᴀʀs ᴛʜᴇ ᴄᴀᴄʜᴇ ғɪʟᴇs ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. -๏ /leaveall : ᴏʀᴅᴇʀs ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴀʟʟ ᴄʜᴀᴛs. - -๏ /addsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ᴀᴅᴅ ᴛʜᴇ ᴜsᴇʀ ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. -๏ /rmsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ʀᴇᴍᴏᴠᴇ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. -""" diff --git a/GJ516music/Helpers/downloaders.py b/GJ516music/Helpers/downloaders.py deleted file mode 100644 index 67f2193..0000000 --- a/GJ516music/Helpers/downloaders.py +++ /dev/null @@ -1,52 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os - -from yt_dlp import YoutubeDL - -ydl_opts = { - "format": "bestaudio/best", - "outtmpl": "downloads/%(id)s.%(ext)s", - "geo_bypass": True, - "nocheckcertificate": True, - "quiet": True, - "no_warnings": True, - "prefer_ffmpeg": True, - "postprocessors": [ - { - "key": "FFmpegExtractAudio", - "preferredcodec": "mp3", - "preferredquality": "320", - } - ], -} -ydl = YoutubeDL(ydl_opts) - - -def audio_dl(url: str) -> str: - sin = ydl.extract_info(url, False) - x_file = os.path.join("downloads", f"{sin['id']}.mp3") - if os.path.exists(x_file): - return x_file - ydl.download([url]) - return x_file diff --git a/GJ516music/Helpers/errors.py b/GJ516music/Helpers/errors.py deleted file mode 100644 index f4553ed..0000000 --- a/GJ516music/Helpers/errors.py +++ /dev/null @@ -1,29 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -class DurationLimitError(Exception): - pass - - -class FFmpegReturnCodeError(Exception): - pass diff --git a/GJ516music/Helpers/formatters.py b/GJ516music/Helpers/formatters.py deleted file mode 100644 index f683b84..0000000 --- a/GJ516music/Helpers/formatters.py +++ /dev/null @@ -1,45 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -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 diff --git a/GJ516music/Helpers/gets.py b/GJ516music/Helpers/gets.py deleted file mode 100644 index ef702b7..0000000 --- a/GJ516music/Helpers/gets.py +++ /dev/null @@ -1,57 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from typing import Union - -from pyrogram.enums import MessageEntityType -from pyrogram.types import Audio, Message, Voice - - -def get_url(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 - - if offset in (None,): - return None - - return text[offset : offset + length] - - -def get_file_name(audio: Union[Audio, Voice]): - return f'{audio.file_unique_id}.{audio.file_name.split(".")[-1] if not isinstance(audio, Voice) else "ogg"}' diff --git a/GJ516music/Helpers/inline.py b/GJ516music/Helpers/inline.py deleted file mode 100644 index 1e2cc37..0000000 --- a/GJ516music/Helpers/inline.py +++ /dev/null @@ -1,110 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup - -import config -from GJ516Music import BOT_USERNAME - -close_key = InlineKeyboardMarkup( - [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] -) - - -buttons = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton(text="▷", callback_data="resume_cb"), - InlineKeyboardButton(text="II", callback_data="pause_cb"), - InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), - InlineKeyboardButton(text="▢", callback_data="end_cb"), - ] - ] -) - - -pm_buttons = [ - [ - InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true", - ) - ], - [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="GJ516_help")], - [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), - ], - [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/GJ516Music" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), - ], -] - - -gp_buttons = [ - [ - InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true", - ) - ], - [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), - ], - [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/GJ516Music" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), - ], -] - - -helpmenu = [ - [ - InlineKeyboardButton( - text="ᴇᴠᴇʀʏᴏɴᴇ", - callback_data="GJ516_cb help", - ) - ], - [ - InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="GJ516_cb owner"), - ], - [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_home"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), - ], -] - - -help_back = [ - [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], - [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_help"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), - ], -] diff --git a/GJ516music/Helpers/queue.py b/GJ516music/Helpers/queue.py deleted file mode 100644 index 48e5d02..0000000 --- a/GJ516music/Helpers/queue.py +++ /dev/null @@ -1,48 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from GJ516Music import GJ516db - - -async def put( - chat_id, - title, - duration, - videoid, - file_path, - ruser, - user_id, -): - put_f = { - "title": title, - "duration": duration, - "file_path": file_path, - "videoid": videoid, - "req": ruser, - "user_id": user_id, - } - get = GJ516db.get(chat_id) - if get: - GJ516db[chat_id].append(put_f) - else: - GJ516db[chat_id] = [] - GJ516db[chat_id].append(put_f) diff --git a/GJ516music/Helpers/thumbnails.py b/GJ516music/Helpers/thumbnails.py deleted file mode 100644 index 289df53..0000000 --- a/GJ516music/Helpers/thumbnails.py +++ /dev/null @@ -1,343 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os -import re -import textwrap - -import aiofiles -import aiohttp -import numpy as np -from PIL import Image, ImageChops, ImageDraw, ImageEnhance, ImageFilter, ImageFont -from youtubesearchpython.__future__ import VideosSearch - -from config import FAILED -from GJ516Music import BOT_ID, LOGGER, app - - -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 add_corners(im): - bigsize = (im.size[0] * 3, im.size[1] * 3) - mask = Image.new("L", bigsize, 0) - ImageDraw.Draw(mask).ellipse((0, 0) + bigsize, fill=255) - mask = mask.resize(im.size, Image.ANTIALIAS) - mask = ImageChops.darker(mask, im.split()[-1]) - im.putalpha(mask) - - -async def gen_thumb(videoid, user_id): - if os.path.isfile(f"cache/{videoid}_{user_id}.png"): - return f"cache/{videoid}_{user_id}.png" - url = f"https://www.youtube.com/watch?v={videoid}" - try: - 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" - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - try: - result["viewCount"]["short"] - except: - pass - try: - result["channel"]["name"] - except: - pass - - 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() - - try: - wxy = await app.download_media( - (await app.get_users(user_id)).photo.big_file_id, - file_name=f"{user_id}.jpg", - ) - except: - wxy = await app.download_media( - (await app.get_users(BOT_ID)).photo.big_file_id, - file_name=f"{BOT_ID}.jpg", - ) - - xy = Image.open(wxy) - a = Image.new("L", [640, 640], 0) - b = ImageDraw.Draw(a) - b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") - c = np.array(xy) - d = np.array(a) - e = np.dstack((c, d)) - f = Image.fromarray(e) - x = f.resize((107, 107)) - - youtube = Image.open(f"cache/thumb{videoid}.png") - bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") - image1 = changeImageSize(1280, 720, youtube) - image2 = image1.convert("RGBA") - background = image2.filter(filter=ImageFilter.BoxBlur(30)) - enhancer = ImageEnhance.Brightness(background) - background = enhancer.enhance(0.6) - - image3 = changeImageSize(1280, 720, bg) - image5 = image3.convert("RGBA") - Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") - - Xcenter = youtube.width / 2 - Ycenter = youtube.height / 2 - x1 = Xcenter - 250 - y1 = Ycenter - 250 - x2 = Xcenter + 250 - y2 = Ycenter + 250 - logo = youtube.crop((x1, y1, x2, y2)) - logo.thumbnail((520, 520), Image.ANTIALIAS) - logo.save(f"cache/chop{videoid}.png") - if not os.path.isfile(f"cache/cropped{videoid}.png"): - im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") - add_corners(im) - im.save(f"cache/cropped{videoid}.png") - - crop_img = Image.open(f"cache/cropped{videoid}.png") - logo = crop_img.convert("RGBA") - logo.thumbnail((365, 365), Image.ANTIALIAS) - width = int((1280 - 365) / 2) - background = Image.open(f"cache/temp{videoid}.png") - background.paste(logo, (width + 2, 138), mask=logo) - background.paste(x, (710, 427), mask=x) - background.paste(image3, (0, 0), mask=image3) - - draw = ImageDraw.Draw(background) - font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) - ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) - arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) - ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) - para = textwrap.wrap(title, width=32) - try: - draw.text( - (450, 25), - f"STARTED PLAYING", - fill="white", - stroke_width=3, - stroke_fill="grey", - font=font, - ) - if para[0]: - text_w, text_h = draw.textsize(f"{para[0]}", font=font) - draw.text( - ((1280 - text_w) / 2, 530), - f"{para[0]}", - fill="white", - stroke_width=1, - stroke_fill="white", - font=font, - ) - if para[1]: - text_w, text_h = draw.textsize(f"{para[1]}", font=font) - draw.text( - ((1280 - text_w) / 2, 580), - f"{para[1]}", - fill="white", - stroke_width=1, - stroke_fill="white", - font=font, - ) - except: - pass - text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) - draw.text( - ((1280 - text_w) / 2, 660), - f"Duration: {duration} Mins", - fill="white", - font=arial, - ) - try: - os.remove(f"cache/thumb{videoid}.png") - except: - pass - background.save(f"cache/{videoid}_{user_id}.png") - return f"cache/{videoid}_{user_id}.png" - except Exception as e: - LOGGER.error(e) - return FAILED - - -async def gen_qthumb(videoid, user_id): - if os.path.isfile(f"cache/que{videoid}_{user_id}.png"): - return f"cache/que{videoid}_{user_id}.png" - url = f"https://www.youtube.com/watch?v={videoid}" - try: - 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" - thumbnail = result["thumbnails"][0]["url"].split("?")[0] - try: - result["viewCount"]["short"] - except: - pass - try: - result["channel"]["name"] - except: - pass - - 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() - - try: - wxy = await app.download_media( - (await app.get_users(user_id)).photo.big_file_id, - file_name=f"{user_id}.jpg", - ) - except: - wxy = await app.download_media( - (await app.get_users(BOT_ID)).photo.big_file_id, - file_name=f"{BOT_ID}.jpg", - ) - - xy = Image.open(wxy) - a = Image.new("L", [640, 640], 0) - b = ImageDraw.Draw(a) - b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") - c = np.array(xy) - d = np.array(a) - e = np.dstack((c, d)) - f = Image.fromarray(e) - x = f.resize((107, 107)) - - youtube = Image.open(f"cache/thumb{videoid}.png") - bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") - image1 = changeImageSize(1280, 720, youtube) - image2 = image1.convert("RGBA") - background = image2.filter(filter=ImageFilter.BoxBlur(30)) - enhancer = ImageEnhance.Brightness(background) - background = enhancer.enhance(0.6) - - image3 = changeImageSize(1280, 720, bg) - image5 = image3.convert("RGBA") - Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") - - Xcenter = youtube.width / 2 - Ycenter = youtube.height / 2 - x1 = Xcenter - 250 - y1 = Ycenter - 250 - x2 = Xcenter + 250 - y2 = Ycenter + 250 - logo = youtube.crop((x1, y1, x2, y2)) - logo.thumbnail((520, 520), Image.ANTIALIAS) - logo.save(f"cache/chop{videoid}.png") - if not os.path.isfile(f"cache/cropped{videoid}.png"): - im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") - add_corners(im) - im.save(f"cache/cropped{videoid}.png") - - crop_img = Image.open(f"cache/cropped{videoid}.png") - logo = crop_img.convert("RGBA") - logo.thumbnail((365, 365), Image.ANTIALIAS) - width = int((1280 - 365) / 2) - background = Image.open(f"cache/temp{videoid}.png") - background.paste(logo, (width + 2, 138), mask=logo) - background.paste(x, (710, 427), mask=x) - background.paste(image3, (0, 0), mask=image3) - - draw = ImageDraw.Draw(background) - font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) - ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) - arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) - ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) - para = textwrap.wrap(title, width=32) - try: - draw.text( - (455, 25), - "ADDED TO QUEUE", - fill="white", - stroke_width=5, - stroke_fill="black", - font=font, - ) - if para[0]: - text_w, text_h = draw.textsize(f"{para[0]}", font=font) - draw.text( - ((1280 - text_w) / 2, 530), - f"{para[0]}", - fill="white", - stroke_width=1, - stroke_fill="white", - font=font, - ) - if para[1]: - text_w, text_h = draw.textsize(f"{para[1]}", font=font) - draw.text( - ((1280 - text_w) / 2, 580), - f"{para[1]}", - fill="white", - stroke_width=1, - stroke_fill="white", - font=font, - ) - except: - pass - text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) - draw.text( - ((1280 - text_w) / 2, 660), - f"Duration: {duration} Mins", - fill="white", - font=arial, - ) - - try: - os.remove(f"cache/thumb{videoid}.png") - except: - pass - background.save(f"cache/que{videoid}_{user_id}.png") - return f"cache/que{videoid}_{user_id}.png" - except Exception as e: - LOGGER.error(e) - return FAILED diff --git a/GJ516music/Helpers/utils/JAY DEVELOPER b/GJ516music/Helpers/utils/JAY DEVELOPER deleted file mode 100644 index 5b98e58..0000000 --- a/GJ516music/Helpers/utils/JAY DEVELOPER +++ /dev/null @@ -1 +0,0 @@ -Kya dek rha h ve lodu 😂😂 diff --git a/GJ516music/Helpers/utils/__init__.py b/GJ516music/Helpers/utils/__init__.py deleted file mode 100644 index f5b3c9b..0000000 --- a/GJ516music/Helpers/utils/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. diff --git a/GJ516music/Helpers/utils/circle.png b/GJ516music/Helpers/utils/circle.png deleted file mode 100644 index e4d1be4329f4546501870b6d870b184a3f82c959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23029 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 diff --git a/GJ516music/Helpers/utils/font.ttf b/GJ516music/Helpers/utils/font.ttf deleted file mode 100644 index 3b8622f67bffda70fc2d7f6ff2f2ad6f3078fd08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141612 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
pJZQSzuNwmL%hRN4*MNWJACAD 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 diff --git a/GJ516music/Helpers/utils/font2.ttf b/GJ516music/Helpers/utils/font2.ttf deleted file mode 100644 index 2ceaf63a3281450969d30f3f256e19940a32cfaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128248 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 diff --git a/GJ516music/Modules/JAY DEVELOPER b/GJ516music/Modules/JAY DEVELOPER deleted file mode 100644 index 62de020..0000000 --- a/GJ516music/Modules/JAY DEVELOPER +++ /dev/null @@ -1 +0,0 @@ -Lund lele bsdk ke 😂 diff --git a/GJ516music/Modules/__init__.py b/GJ516music/Modules/__init__.py deleted file mode 100644 index 479b164..0000000 --- a/GJ516music/Modules/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import glob -from os.path import basename, dirname, isfile - - -def __list_all_modules(): - mod_paths = glob.glob(dirname(__file__) + "/*.py") - - all_modules = [ - basename(f)[:-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/GJ516music/Modules/activevc.py b/GJ516music/Modules/activevc.py deleted file mode 100644 index 46fbce4..0000000 --- a/GJ516music/Modules/activevc.py +++ /dev/null @@ -1,55 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from GJ516Music import SUDOERS, app -from GJ516Music.Helpers.active import get_active_chats -from GJ516Music.Helpers.inline import close_key - - -@app.on_message(filters.command("activevc") & SUDOERS) -async def activevc(_, message: Message): - mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ʟɪsᴛ...") - chats = await get_active_chats() - text = "" - j = 0 - for chat in chats: - try: - title = (await app.get_chat(chat)).title - except Exception: - title = "ᴩʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ" - if (await app.get_chat(chat)).username: - user = (await app.get_chat(chat)).username - text += f"{j + 1}. [{title}](https://t.me/{user})\n" - else: - text += f"{j + 1}. {title} [`{chat}`]\n" - j += 1 - if not text: - await mystic.edit_text("ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄʙᴏᴛ...") - else: - await mystic.edit_text( - f"**ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄ ʙᴏᴛ :**\n\n{text}", - reply_markup=close_key, - disable_web_page_preview=True, - ) diff --git a/GJ516music/Modules/assistant.py b/GJ516music/Modules/assistant.py deleted file mode 100644 index 742d7bd..0000000 --- a/GJ516music/Modules/assistant.py +++ /dev/null @@ -1,97 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from GJ516Music import ASS_MENTION, LOGGER, SUDOERS, app, app2 - - -@app.on_message(filters.command(["asspfp", "setpfp"]) & SUDOERS) -async def set_pfp(_, message: Message): - if message.reply_to_message.photo: - fuk = await message.reply_text("» ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ...") - img = await message.reply_to_message.download() - try: - await app2.set_profile_photo(photo=img) - return await fuk.edit_text( - f"» {ASS_MENTION} ᴘʀᴏғɪʟᴇ ᴘɪᴄ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." - ) - except: - return await fuk.edit_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") - else: - await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ ғᴏʀ ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." - ) - - -@app.on_message(filters.command(["delpfp", "delasspfp"]) & SUDOERS) -async def set_pfp(_, message: Message): - try: - pfp = [p async for p in app2.get_chat_photos("me")] - await app2.delete_profile_photos(pfp[0].file_id) - return await message.reply_text( - "» sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴇʟᴇᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." - ) - except Exception as ex: - LOGGER.error(ex) - await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") - - -@app.on_message(filters.command(["assbio", "setbio"]) & SUDOERS) -async def set_bio(_, message: Message): - msg = message.reply_to_message - if msg: - if msg.text: - newbio = msg.text - await app2.update_profile(bio=newbio) - return await message.reply_text( - f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." - ) - elif len(message.command) != 1: - newbio = message.text.split(None, 1)[1] - await app2.update_profile(bio=newbio) - return await message.reply_text(f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") - else: - return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ʙɪᴏ." - ) - - -@app.on_message(filters.command(["assname", "setname"]) & SUDOERS) -async def set_name(_, message: Message): - msg = message.reply_to_message - if msg: - if msg.text: - name = msg.text - await app2.update_profile(first_name=name) - return await message.reply_text( - f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." - ) - elif len(message.command) != 1: - name = message.text.split(None, 1)[1] - await app2.update_profile(first_name=name, last_name="") - return await message.reply_text(f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") - else: - return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ɴᴇᴡ ɴᴀᴍᴇ." - ) diff --git a/GJ516music/Modules/broadcast.py b/GJ516music/Modules/broadcast.py deleted file mode 100644 index 9a233f7..0000000 --- a/GJ516music/Modules/broadcast.py +++ /dev/null @@ -1,65 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio - -from pyrogram import filters -from pyrogram.errors import FloodWait -from pyrogram.types import Message - -from config import OWNER_ID -from GJ516Music import app, app2 - - -@app.on_message(filters.command("broadcast") & filters.user(OWNER_ID)) -async def broadcast(_, message: Message): - brep = await message.reply_text("sᴛᴀʀᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ...") - 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( - "**ᴇxᴀᴍᴘʟᴇ:**\n\n/broadcast [ᴍᴇssᴀɢᴇ] ᴏʀ [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" - ) - query = message.text.split(None, 1)[1] - sent = 0 - chats = [] - async for dialog in app2.get_dialogs(): - chats.append(int(dialog.chat.id)) - for i in chats: - try: - await app2.forward_messages( - i, y, x - ) if message.reply_to_message else await app2.send_message(i, text=query) - sent += 1 - except FloodWait as e: - flood_time = int(e.value) - if flood_time > 200: - continue - await asyncio.sleep(flood_time) - except Exception: - continue - try: - await brep.edit_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") - except: - await message.reply_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") diff --git a/GJ516music/Modules/callback.py b/GJ516music/Modules/callback.py deleted file mode 100644 index 3a9100c..0000000 --- a/GJ516music/Modules/callback.py +++ /dev/null @@ -1,253 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import CallbackQuery, InlineKeyboardMarkup -from pytgcalls.types import AudioPiped, HighQualityAudio - -from GJ516Music import ( - ASS_ID, - ASS_NAME, - BOT_ID, - BOT_MENTION, - BOT_USERNAME, - LOGGER, - app, - GJ516db, - pytgcalls, -) -from GJ516Music.Helpers import ( - _clear_, - admin_check_cb, - gen_thumb, - is_streaming, - stream_off, - stream_on, -) -from GJ516Music.Helpers.dossier import * -from GJ516Music.Helpers.inline import ( - buttons, - close_key, - help_back, - helpmenu, - pm_buttons, -) - - -@app.on_callback_query(filters.regex("forceclose")) -async def close_(_, 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_callback_query(filters.regex("close")) -async def forceclose_command(_, CallbackQuery): - try: - await CallbackQuery.message.delete() - except: - return - try: - await CallbackQuery.answer() - except: - pass - - -@app.on_callback_query(filters.regex(pattern=r"^(resume_cb|pause_cb|skip_cb|end_cb)$")) -@admin_check_cb -async def admin_cbs(_, query: CallbackQuery): - try: - await query.answer() - except: - pass - - data = query.matches[0].group(1) - - if data == "resume_cb": - if await is_streaming(query.message.chat.id): - return await query.answer( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True - ) - await stream_on(query.message.chat.id) - await pytgcalls.resume_stream(query.message.chat.id) - await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {query.from_user.mention} 🥀", - reply_markup=close_key, - ) - - elif data == "pause_cb": - if not await is_streaming(query.message.chat.id): - return await query.answer( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True - ) - await stream_off(query.message.chat.id) - await pytgcalls.pause_stream(query.message.chat.id) - await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", - reply_markup=close_key, - ) - - elif data == "end_cb": - try: - await _clear_(query.message.chat.id) - await pytgcalls.leave_group_call(query.message.chat.id) - except: - pass - await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ ❄\n│ \n└ʙʏ : {query.from_user.mention} 🥀", - reply_markup=close_key, - ) - await query.message.delete() - - elif data == "skip_cb": - get = GJ516db.get(query.message.chat.id) - if not get: - try: - await _clear_(query.message.chat.id) - await pytgcalls.leave_group_call(query.message.chat.id) - await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {query.message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", - reply_markup=close_key, - ) - return await query.message.delete() - except: - return - else: - title = get[0]["title"] - duration = get[0]["duration"] - videoid = get[0]["videoid"] - file_path = get[0]["file_path"] - req_by = get[0]["req"] - user_id = get[0]["user_id"] - get.pop(0) - - stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) - try: - await pytgcalls.change_stream( - query.message.chat.id, - stream, - ) - except Exception as ex: - LOGGER.error(ex) - await _clear_(query.message.chat.id) - return await pytgcalls.leave_group_call(query.message.chat.id) - - img = await gen_thumb(videoid, user_id) - await query.edit_message_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", - reply_markup=close_key, - ) - return await query.message.reply_photo( - photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", - reply_markup=buttons, - ) - - -@app.on_callback_query(filters.regex("unban_ass")) -async def unban_ass(_, CallbackQuery): - callback_data = CallbackQuery.data.strip() - callback_request = callback_data.split(None, 1)[1] - chat_id, user_id = callback_request.split("|") - umm = (await app.get_chat_member(int(chat_id), BOT_ID)).privileges - if umm.can_restrict_members: - try: - await app.unban_chat_member(int(chat_id), ASS_ID) - except: - return await CallbackQuery.answer( - "» ғᴀɪʟᴇᴅ ᴛᴏ ᴜɴʙᴀɴ ᴀssɪsᴛᴀɴᴛ.", - show_alert=True, - ) - return await CallbackQuery.edit_message_text( - f"➻ {ASS_NAME} sᴜᴄᴄᴇssғᴜʟʟʏ ᴜɴʙᴀɴɴᴇᴅ ʙʏ {CallbackQuery.from_user.mention}.\n\nᴛʀʏ ᴘʟᴀʏɪɴɢ ɴᴏᴡ..." - ) - else: - return await CallbackQuery.answer( - "» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴜɴʙᴀɴ ᴜsᴇʀs ɪɴ ᴛʜɪs ᴄʜᴀᴛ.", - show_alert=True, - ) - - -@app.on_callback_query(filters.regex("GJ516_help")) -async def help_menu(_, query: CallbackQuery): - try: - await query.answer() - except: - pass - - try: - await query.edit_message_text( - text=f"๏ ʜᴇʏ {query.from_user.first_name}, 🥀\n\nᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴘ.", - reply_markup=InlineKeyboardMarkup(helpmenu), - ) - except Exception as e: - LOGGER.error(e) - return - - -@app.on_callback_query(filters.regex("GJ516_cb")) -async def open_hmenu(_, query: CallbackQuery): - callback_data = query.data.strip() - cb = callback_data.split(None, 1)[1] - keyboard = InlineKeyboardMarkup(help_back) - - try: - await query.answer() - except: - pass - - if cb == "help": - await query.edit_message_text(HELP_TEXT, reply_markup=keyboard) - elif cb == "sudo": - await query.edit_message_text(HELP_SUDO, reply_markup=keyboard) - elif cb == "owner": - await query.edit_message_text(HELP_DEV, reply_markup=keyboard) - - -@app.on_callback_query(filters.regex("GJ516_home")) -async def home_GJ516(_, query: CallbackQuery): - try: - await query.answer() - except: - pass - try: - await query.edit_message_text( - text=PM_START_TEXT.format( - query.from_user.first_name, - BOT_MENTION, - ), - reply_markup=InlineKeyboardMarkup(pm_buttons), - ) - except: - pass diff --git a/GJ516music/Modules/cleaner.py b/GJ516music/Modules/cleaner.py deleted file mode 100644 index 7cf1a91..0000000 --- a/GJ516music/Modules/cleaner.py +++ /dev/null @@ -1,49 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os - -from pyrogram import filters -from pyrogram.types import Message - -from config import OWNER_ID -from GJ516Music import app - - -@app.on_message(filters.command(["clearcache", "rmdownloads"]) & filters.user(OWNER_ID)) -async def clear_misc(_, message: Message): - try: - await message.delete() - except: - pass - downloads = os.path.realpath("downloads") - down_dir = os.listdir(downloads) - pth = os.path.realpath(".") - os_dir = os.listdir(pth) - - if down_dir: - for file in down_dir: - os.remove(os.path.join(downloads, file)) - if os_dir: - for lel in os.listdir(pth): - os.system("rm -rf *.webm *.jpg *.png") - await message.reply_text("» ᴀʟʟ ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs ᴄʟᴇᴀɴᴇᴅ.") diff --git a/GJ516music/Modules/eval.py b/GJ516music/Modules/eval.py deleted file mode 100644 index 4a79104..0000000 --- a/GJ516music/Modules/eval.py +++ /dev/null @@ -1,195 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -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 GJ516Music import LOGGER, SUDOERS, app - - -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}) - - -@app.on_edited_message(filters.command("eval") & SUDOERS & ~filters.forwarded) -@app.on_message(filters.command("eval") & SUDOERS & ~filters.forwarded) -async def executor(client, 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 = "" - if exc: - evaluation = exc - elif stderr: - evaluation = stderr - elif stdout: - evaluation = stdout - else: - evaluation = "Success" - final_output = f"**OUTPUT**:\n```{evaluation.strip()}```" - if len(final_output) > 4096: - filename = "output.txt" - with open(filename, "w+", encoding="utf8") as out_file: - out_file.write(str(evaluation.strip())) - t2 = time() - keyboard = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text="⏳", - callback_data=f"runtime {t2-t1} Seconds", - ) - ] - ] - ) - await message.reply_document( - document=filename, - caption=f"**INPUT:**\n`{cmd[0:980]}`\n\n**OUTPUT:**\n`Attached 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_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(client, 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: - LOGGER.error(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: - LOGGER.error(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 client.send_document( - message.chat.id, - "output.txt", - reply_to_message_id=message.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: **\n`No output`") diff --git a/GJ516music/Modules/inline.py b/GJ516music/Modules/inline.py deleted file mode 100644 index 4945aec..0000000 --- a/GJ516music/Modules/inline.py +++ /dev/null @@ -1,92 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram.types import ( - InlineKeyboardButton, - InlineKeyboardMarkup, - InlineQueryResultPhoto, -) -from youtubesearchpython.__future__ import VideosSearch - -from GJ516Music import BOT_NAME, app - - -@app.on_inline_query() -async def inline_query_handler(_, query): - text = query.query.strip().lower() - answers = [] - if text.strip() == "": - try: - await app.answer_inline_query( - query.id, - results=answers, - switch_pm_text="ᴛʏᴘᴇ sᴏᴍᴇᴛʜɪɴɢ ᴛᴏ sᴇᴀʀᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ...", - 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}]({link}) - -⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`ᴍɪɴᴜᴛᴇs -👀 **ᴠɪᴇᴡs :** `{views}` -⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} -🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) - -💖 **sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}**""" - answers.append( - InlineQueryResultPhoto( - photo_url=thumbnail, - title=title, - thumb_url=thumbnail, - description=description, - caption=searched_text, - reply_markup=buttons, - ) - ) - try: - return await app.answer_inline_query(query.id, results=answers) - except: - return diff --git a/GJ516music/Modules/leaveall.py b/GJ516music/Modules/leaveall.py deleted file mode 100644 index 42b741f..0000000 --- a/GJ516music/Modules/leaveall.py +++ /dev/null @@ -1,63 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio - -from pyrogram import filters -from pyrogram.errors import FloodWait -from pyrogram.types import Message - -from config import OWNER_ID -from GJ516Music import ASS_MENTION, SUNAME, app, app2 - - -@app.on_message(filters.command(["leaveall", "assleaveall"]) & filters.user(OWNER_ID)) -async def ass_leaveall(_, message: Message): - lear = await message.reply_text(f"» {ASS_MENTION} sᴛᴀʀᴛᴇᴅ ʟᴇᴀᴠɪɴɢ ᴄʜᴀᴛs...") - left = 0 - failed = 0 - chats = [] - async for dialog in app2.get_dialogs(): - chats.append(int(dialog.chat.id)) - schat = (await app.get_chat(SUNAME)).id - for i in chats: - if i in (-1001686672798, int(schat)): - continue - try: - await app2.leave_chat(int(i)) - left += 1 - except FloodWait as e: - flood_time = int(e.value) - if flood_time > 200: - continue - await asyncio.sleep(flood_time) - except Exception: - continue - failed += 1 - try: - await lear.edit_text( - f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" - ) - except: - await message.reply_text( - f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" - ) diff --git a/GJ516music/Modules/pause.py b/GJ516music/Modules/pause.py deleted file mode 100644 index 3014791..0000000 --- a/GJ516music/Modules/pause.py +++ /dev/null @@ -1,48 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from GJ516Music import app, pytgcalls -from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_off - - -@app.on_message(filters.command(["pause"]) & filters.group) -@admin_check -async def pause_str(_, message: Message): - try: - await message.delete() - except: - pass - - if not await is_streaming(message.chat.id): - return await message.reply_text( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" - ) - - await pytgcalls.pause_stream(message.chat.id) - await stream_off(message.chat.id) - return await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", - reply_markup=close_key, - ) diff --git a/GJ516music/Modules/ping.py b/GJ516music/Modules/ping.py deleted file mode 100644 index a5e2ec3..0000000 --- a/GJ516music/Modules/ping.py +++ /dev/null @@ -1,68 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import time -from datetime import datetime - -import psutil -from pyrogram import filters -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message - -import config -from FallenMusic import BOT_NAME, StartTime, app -from FallenMusic.Helpers import get_readable_time - - -@app.on_message(filters.command("ping")) -async def ping_fallen(_, message: Message): - hmm = await message.reply_photo( - photo=config.PING_IMG, caption=f"{BOT_NAME} ɪs ᴘɪɴɢɪɴɢ..." - ) - upt = int(time.time() - StartTime) - cpu = psutil.cpu_percent(interval=0.5) - mem = psutil.virtual_memory().percent - disk = psutil.disk_usage("/").percent - start = datetime.now() - resp = (datetime.now() - start).microseconds / 1000 - uptime = get_readable_time((upt)) - - await hmm.edit_text( - f"""➻ ᴩᴏɴɢ : `{resp}ᴍs` - -{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs : - -๏ **ᴜᴩᴛɪᴍᴇ :** {uptime} -๏ **ʀᴀᴍ :** {mem} -๏ **ᴄᴩᴜ :** {cpu} -๏ **ᴅɪsᴋ :** {disk}""", - reply_markup=InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton("❄ sᴜᴘᴘᴏʀᴛ ❄", url=config.SUPPORT_CHAT), - InlineKeyboardButton( - "✨ sᴏᴜʀᴄᴇ ✨", - url="https://github.com/AnonymousX1025/FallenMusic", - ), - ], - ] - ), - ) diff --git a/GJ516music/Modules/play.py b/GJ516music/Modules/play.py deleted file mode 100644 index 0625855..0000000 --- a/GJ516music/Modules/play.py +++ /dev/null @@ -1,258 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio -import os - -from pyrogram import filters -from pyrogram.enums import ChatMemberStatus -from pyrogram.errors import ( - ChatAdminRequired, - UserAlreadyParticipant, - UserNotParticipant, -) -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from pytgcalls import StreamType -from pytgcalls.exceptions import NoActiveGroupCall, TelegramServerError, UnMuteNeeded -from pytgcalls.types import AudioPiped, HighQualityAudio -from youtube_search import YoutubeSearch - -from config import DURATION_LIMIT -from GJ516Music import ( - ASS_ID, - ASS_MENTION, - ASS_NAME, - ASS_USERNAME, - BOT_NAME, - BOT_USERNAME, - LOGGER, - app, - app2, - GJ516db, - pytgcalls, -) -from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on -from GJ516Music.Helpers.downloaders import audio_dl -from GJ516Music.Helpers.errors import DurationLimitError -from GJ516Music.Helpers.gets import get_file_name, get_url -from GJ516Music.Helpers.inline import buttons -from GJ516Music.Helpers.queue import put -from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb - - -@app.on_message( - filters.command(["play", "vplay", "p"]) - & filters.group - & ~filters.forwarded - & ~filters.via_bot -) -async def play(_, message: Message): - GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") - try: - await message.delete() - except: - pass - - try: - try: - get = await app.get_chat_member(message.chat.id, ASS_ID) - except ChatAdminRequired: - return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." - ) - if get.status == ChatMemberStatus.BANNED: - unban_butt = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text=f"ᴜɴʙᴀɴ {ASS_NAME}", - callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", - ), - ] - ] - ) - return await GJ516.edit_text( - text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", - reply_markup=unban_butt, - ) - except UserNotParticipant: - if message.chat.username: - invitelink = message.chat.username - try: - await app2.resolve_peer(invitelink) - except Exception as ex: - LOGGER.error(ex) - else: - try: - invitelink = await app.export_chat_invite_link(message.chat.id) - except ChatAdminRequired: - return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." - ) - except Exception as ex: - return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" - ) - if invitelink.startswith("https://t.me/+"): - invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") - anon = await GJ516.edit_text( - f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." - ) - try: - await app2.join_chat(invitelink) - await asyncio.sleep(2) - await GJ516.edit_text( - f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." - ) - except UserAlreadyParticipant: - pass - except Exception as ex: - return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" - ) - try: - await app2.resolve_peer(invitelink) - except: - pass - - ruser = message.from_user.first_name - audio = ( - (message.reply_to_message.audio or message.reply_to_message.voice) - if message.reply_to_message - else None - ) - url = get_url(message) - if audio: - if round(audio.duration / 60) > DURATION_LIMIT: - raise DurationLimitError( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." - ) - - file_name = get_file_name(audio) - title = file_name - duration = round(audio.duration / 60) - file_path = ( - await message.reply_to_message.download(file_name) - if not os.path.isfile(os.path.join("downloads", file_name)) - else f"downloads/{file_name}" - ) - - elif url: - try: - results = YoutubeSearch(url, max_results=1).to_dict() - title = results[0]["title"] - duration = results[0]["duration"] - videoid = results[0]["id"] - - secmul, dur, dur_arr = 1, 0, duration.split(":") - for i in range(len(dur_arr) - 1, -1, -1): - dur += int(dur_arr[i]) * secmul - secmul *= 60 - - except Exception as e: - return await GJ516.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") - - if (dur / 60) > DURATION_LIMIT: - return await GJ516.edit_text( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." - ) - file_path = audio_dl(url) - else: - if len(message.command) < 2: - return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") - await GJ516.edit_text("🔎") - query = message.text.split(None, 1)[1] - try: - results = YoutubeSearch(query, max_results=1).to_dict() - url = f"https://youtube.com{results[0]['url_suffix']}" - title = results[0]["title"] - videoid = results[0]["id"] - duration = results[0]["duration"] - - secmul, dur, dur_arr = 1, 0, duration.split(":") - for i in range(len(dur_arr) - 1, -1, -1): - dur += int(dur_arr[i]) * secmul - secmul *= 60 - - except Exception as e: - LOGGER.error(str(e)) - return await GJ516.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") - - if (dur / 60) > DURATION_LIMIT: - return await GJ516.edit( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." - ) - file_path = audio_dl(url) - - try: - videoid = videoid - except: - videoid = "fuckitstgaudio" - if await is_active_chat(message.chat.id): - await put( - message.chat.id, - title, - duration, - videoid, - file_path, - ruser, - message.from_user.id, - ) - position = len(GJ516db.get(message.chat.id)) - qimg = await gen_qthumb(videoid, message.from_user.id) - await message.reply_photo( - photo=qimg, - caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", - reply_markup=buttons, - ) - else: - stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) - try: - await pytgcalls.join_group_call( - message.chat.id, - stream, - stream_type=StreamType().pulse_stream, - ) - - except NoActiveGroupCall: - return await GJ516.edit_text( - "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." - ) - except TelegramServerError: - return await GJ516.edit_text( - "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." - ) - except UnMuteNeeded: - return await GJ516.edit_text( - f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." - ) - - imgt = await gen_thumb(videoid, message.from_user.id) - await stream_on(message.chat.id) - await add_active_chat(message.chat.id) - await message.reply_photo( - photo=imgt, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", - reply_markup=buttons, - ) - - return await GJ516.delete() diff --git a/GJ516music/Modules/resume.py b/GJ516music/Modules/resume.py deleted file mode 100644 index 57ccb5a..0000000 --- a/GJ516music/Modules/resume.py +++ /dev/null @@ -1,45 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from GJ516Music import app, pytgcalls -from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_on - - -@app.on_message(filters.command(["resume"]) & filters.group) -@admin_check -async def res_str(_, message: Message): - try: - await message.delete() - except: - pass - - if await is_streaming(message.chat.id): - return await message.reply_text("ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?") - await stream_on(message.chat.id) - await pytgcalls.resume_stream(message.chat.id) - return await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {message.from_user.mention} 🥀", - reply_markup=close_key, - ) diff --git a/GJ516music/Modules/search.py b/GJ516music/Modules/search.py deleted file mode 100644 index ea3ec2c..0000000 --- a/GJ516music/Modules/search.py +++ /dev/null @@ -1,67 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from youtube_search import YoutubeSearch - -from GJ516Music import app - - -@app.on_message(filters.command(["search"])) -async def ytsearch(_, message: Message): - try: - await message.delete() - except: - pass - try: - if len(message.command) < 2: - return await message.reply_text("» ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴀʀᴄʜ ʙᴀʙʏ !") - query = message.text.split(None, 1)[1] - m = await message.reply_text("🔎") - results = YoutubeSearch(query, max_results=4).to_dict() - i = 0 - text = "" - while i < 4: - text += f"✨ ᴛɪᴛʟᴇ : {results[i]['title']}\n" - text += f"⏱ ᴅᴜʀᴀᴛɪᴏɴ : `{results[i]['duration']}`\n" - text += f"👀 ᴠɪᴇᴡs : `{results[i]['views']}`\n" - text += f"📣 ᴄʜᴀɴɴᴇʟ : {results[i]['channel']}\n" - text += f"🔗 ʟɪɴᴋ : https://youtube.com{results[i]['url_suffix']}\n\n" - i += 1 - key = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text="ᴄʟᴏsᴇ", - callback_data=f"forceclose abc|{message.from_user.id}", - ), - ] - ] - ) - await m.edit_text( - text=text, - reply_markup=key, - disable_web_page_preview=True, - ) - except Exception as e: - await message.reply_text(str(e)) diff --git a/GJ516music/Modules/skip.py b/GJ516music/Modules/skip.py deleted file mode 100644 index a3779c2..0000000 --- a/GJ516music/Modules/skip.py +++ /dev/null @@ -1,77 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message -from pytgcalls.types import AudioPiped, HighQualityAudio - -from GJ516Music import BOT_USERNAME, app, GJ516db, pytgcalls -from GJ516Music.Helpers import _clear_, admin_check, buttons, close_key, gen_thumb - - -@app.on_message(filters.command(["skip", "next"]) & filters.group) -@admin_check -async def skip_str(_, message: Message): - try: - await message.delete() - except: - pass - get = GJ516db.get(message.chat.id) - if not get: - try: - await _clear_(message.chat.id) - await pytgcalls.leave_group_call(message.chat.id) - await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", - reply_markup=close_key, - ) - except: - return - else: - title = get[0]["title"] - duration = get[0]["duration"] - file_path = get[0]["file_path"] - videoid = get[0]["videoid"] - req_by = get[0]["req"] - user_id = get[0]["user_id"] - get.pop(0) - - stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) - try: - await pytgcalls.change_stream( - message.chat.id, - stream, - ) - except: - await _clear_(message.chat.id) - return await pytgcalls.leave_group_call(message.chat.id) - - await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", - reply_markup=close_key, - ) - img = await gen_thumb(videoid, user_id) - return await message.reply_photo( - photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", - reply_markup=buttons, - ) diff --git a/GJ516music/Modules/song.py b/GJ516music/Modules/song.py deleted file mode 100644 index e8d921a..0000000 --- a/GJ516music/Modules/song.py +++ /dev/null @@ -1,119 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os - -import requests -import yt_dlp -from pyrogram import filters -from pyrogram.enums import ChatType -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from youtube_search import YoutubeSearch - -from GJ516Music import BOT_MENTION, BOT_USERNAME, LOGGER, app - - -@app.on_message(filters.command(["song", "vsong", "video", "music"])) -async def song(_, message: Message): - try: - await message.delete() - except: - pass - m = await message.reply_text("🔎") - - query = "".join(" " + str(i) for i in message.command[1:]) - ydl_opts = {"format": "bestaudio[ext=m4a]"} - try: - results = YoutubeSearch(query, max_results=5).to_dict() - link = f"https://youtube.com{results[0]['url_suffix']}" - title = results[0]["title"][:40] - thumbnail = results[0]["thumbnails"][0] - thumb_name = f"thumb{title}.jpg" - thumb = requests.get(thumbnail, allow_redirects=True) - open(thumb_name, "wb").write(thumb.content) - duration = results[0]["duration"] - - except Exception as ex: - LOGGER.error(ex) - return await m.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴛ-ᴅʟ.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" - ) - - await m.edit_text("» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢ,\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") - try: - with yt_dlp.YoutubeDL(ydl_opts) as ydl: - info_dict = ydl.extract_info(link, download=False) - audio_file = ydl.prepare_filename(info_dict) - ydl.process_info(info_dict) - rep = f"☁️ **ᴛɪᴛʟᴇ :** [{title[:23]}]({link})\n⏱️ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`\n🥀 **ᴜᴘʟᴏᴀᴅᴇᴅ ʙʏ :** {BOT_MENTION}" - secmul, dur, dur_arr = 1, 0, duration.split(":") - for i in range(len(dur_arr) - 1, -1, -1): - dur += int(dur_arr[i]) * secmul - secmul *= 60 - try: - visit_butt = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text="ʏᴏᴜᴛᴜʙᴇ", - url=link, - ) - ] - ] - ) - await app.send_audio( - chat_id=message.from_user.id, - audio=audio_file, - caption=rep, - thumb=thumb_name, - title=title, - duration=dur, - reply_markup=visit_butt, - ) - if message.chat.type != ChatType.PRIVATE: - await message.reply_text( - "ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, sᴇɴᴛ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴛʜᴇʀᴇ." - ) - except: - start_butt = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text="ᴄʟɪᴄᴋ ʜᴇʀᴇ", - url=f"https://t.me/{BOT_USERNAME}?start", - ) - ] - ] - ) - return await m.edit_text( - text="ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴀɴᴅ sᴛᴀʀᴛ ᴍᴇ ғᴏʀ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢs.", - reply_markup=start_butt, - ) - await m.delete() - except: - return await m.edit_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴜᴘʟᴏᴀᴅ ᴀᴜᴅɪᴏ ᴏɴ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀs.") - - try: - os.remove(audio_file) - os.remove(thumb_name) - except Exception as ex: - LOGGER.error(ex) diff --git a/GJ516music/Modules/speedtest.py b/GJ516music/Modules/speedtest.py deleted file mode 100644 index ebc7e23..0000000 --- a/GJ516music/Modules/speedtest.py +++ /dev/null @@ -1,67 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio - -import speedtest -from pyrogram import filters - -from GJ516Music import SUDOERS, app - - -def testspeed(m): - try: - test = speedtest.Speedtest() - test.get_best_server() - m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") - test.download() - m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") - test.upload() - test.results.share() - result = test.results.dict() - m = m.edit("**↻ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs...**") - except Exception as e: - return m.edit(e) - return result - - -@app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) -async def speedtest_function(_, message): - m = await message.reply_text("**» ʀᴜɴɴɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ...**") - loop = asyncio.get_event_loop() - result = await loop.run_in_executor(None, testspeed, m) - output = f"""✯ **sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs** ✯ - -**❥͜͡ᴄʟɪᴇɴᴛ :** -**» __ɪsᴩ :__** {result['client']['isp']} -**» __ᴄᴏᴜɴᴛʀʏ :__** {result['client']['country']} - -**❥͜͡sᴇʀᴠᴇʀ :** -**» __ɴᴀᴍᴇ :__** {result['server']['name']} -**» __ᴄᴏᴜɴᴛʀʏ :__** {result['server']['country']}, {result['server']['cc']} -**» __sᴩᴏɴsᴏʀ :__** {result['server']['sponsor']} -**» __ʟᴀᴛᴇɴᴄʏ :__** {result['server']['latency']} -**» __ᴩɪɴɢ :__** {result['ping']}""" - msg = await app.send_photo( - chat_id=message.chat.id, photo=result["share"], caption=output - ) - await m.delete() diff --git a/GJ516music/Modules/start.py b/GJ516music/Modules/start.py deleted file mode 100644 index b0f26dd..0000000 --- a/GJ516music/Modules/start.py +++ /dev/null @@ -1,103 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.enums import ChatType, ParseMode -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from youtubesearchpython.__future__ import VideosSearch - -import config -from GJ516Music import BOT_MENTION, BOT_NAME, app -from GJ516Music.Helpers import gp_buttons, pm_buttons -from GJ516Music.Helpers.dossier import * - - -@app.on_message(filters.command(["start"]) & ~filters.forwarded) -@app.on_edited_message(filters.command(["start"]) & ~filters.forwarded) -async def GJ516_st(_, message: Message): - if message.chat.type == ChatType.PRIVATE: - if len(message.text.split()) > 1: - cmd = message.text.split(None, 1)[1] - if cmd[0:3] == "inf": - m = await message.reply_text("🔎") - query = (str(cmd)).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 = f""" -➻ **ᴛʀᴀᴄᴋ ɪɴғᴏʀɴᴀᴛɪᴏɴ** - -📌 **ᴛɪᴛʟᴇ :** {title} - -⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** {duration} ᴍɪɴᴜᴛᴇs -👀 **ᴠɪᴇᴡs :** `{views}` -⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} -🔗 **ʟɪɴᴋ :** [ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ]({link}) -🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) - -💖 sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}""" - key = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton(text="ʏᴏᴜᴛᴜʙᴇ", url=link), - InlineKeyboardButton( - text="sᴜᴩᴩᴏʀᴛ", url=config.SUPPORT_CHAT - ), - ], - ] - ) - await m.delete() - return await app.send_photo( - message.chat.id, - photo=thumbnail, - caption=searched_text, - parse_mode=ParseMode.MARKDOWN, - reply_markup=key, - ) - else: - await message.reply_photo( - photo=config.START_IMG, - caption=PM_START_TEXT.format( - message.from_user.first_name, - BOT_MENTION, - ), - reply_markup=InlineKeyboardMarkup(pm_buttons), - ) - else: - await message.reply_photo( - photo=config.START_IMG, - caption=START_TEXT.format( - message.from_user.first_name, - BOT_MENTION, - message.chat.title, - config.SUPPORT_CHAT, - ), - reply_markup=InlineKeyboardMarkup(gp_buttons), - ) diff --git a/GJ516music/Modules/stop.py b/GJ516music/Modules/stop.py deleted file mode 100644 index a2502cb..0000000 --- a/GJ516music/Modules/stop.py +++ /dev/null @@ -1,46 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from FallenMusic import app, pytgcalls -from FallenMusic.Helpers import _clear_, admin_check, close_key - - -@app.on_message(filters.command(["stop", "end"]) & filters.group) -@admin_check -async def stop_str(_, message: Message): - try: - await message.delete() - except: - pass - try: - await _clear_(message.chat.id) - await pytgcalls.leave_group_call(message.chat.id) - except: - pass - - return await message.reply_text( - text=f"➻ **sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ** ❄\n│ \n└ʙʏ : {message.from_user.mention} 🥀", - reply_markup=close_key, - ) diff --git a/GJ516music/Modules/sudoers.py b/GJ516music/Modules/sudoers.py deleted file mode 100644 index 708e91f..0000000 --- a/GJ516music/Modules/sudoers.py +++ /dev/null @@ -1,132 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message - -from config import OWNER_ID -from FallenMusic import SUDOERS, app - - -@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) -async def sudoadd(_, message: Message): - try: - await message.delete() - except: - pass - if not message.reply_to_message: - if len(message.command) != 2: - return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." - ) - user = message.text.split(None, 1)[1] - if "@" in user: - user = user.replace("@", "") - user = await app.get_users(user) - if int(user.id) in SUDOERS: - return await message.reply_text(f"» {user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ.") - try: - SUDOERS.add(int(user.id)) - await message.reply_text(f"ᴀᴅᴅᴇᴅ {user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ.") - except: - return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") - - if message.reply_to_message.from_user.id in SUDOERS: - return await message.reply_text( - f"» {message.reply_to_message.from_user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ." - ) - try: - SUDOERS.add(message.reply_to_message.from_user.id) - await message.reply_text( - f"ᴀᴅᴅᴇᴅ {message.reply_to_message.from_user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." - ) - except: - return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") - - -@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) -async def sudodel(_, message: Message): - try: - await message.delete() - except: - pass - if not message.reply_to_message: - if len(message.command) != 2: - return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." - ) - user = message.text.split(None, 1)[1] - if "@" in user: - user = user.replace("@", "") - user = await app.get_users(user) - if int(user.id) not in SUDOERS: - return await message.reply_text( - f"» {user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." - ) - try: - SUDOERS.remove(int(user.id)) - return await message.reply_text( - f"» ʀᴇᴍᴏᴠᴇᴅ {user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." - ) - except: - return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") - else: - user_id = message.reply_to_message.from_user.id - if int(user_id) not in SUDOERS: - return await message.reply_text( - f"» {message.reply_to_message.from_user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." - ) - try: - SUDOERS.remove(int(user_id)) - return await message.reply_text( - f"» ʀᴇᴍᴏᴠᴇᴅ {message.reply_to_message.from_user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." - ) - except: - return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") - - -@app.on_message(filters.command(["sudolist", "sudoers", "sudo"])) -async def sudoers_list(_, message: Message): - hehe = await message.reply_text("» ɢᴇᴛᴛɪɴɢ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ...") - text = "🥀 **ᴏᴡɴᴇʀ :**\n" - count = 0 - user = await app.get_users(OWNER_ID) - user = user.first_name if not user.mention else user.mention - count += 1 - text += f"{count}➤ {user}\n" - 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 += "\n✨ **sᴜᴅᴏᴇʀs :**\n" - count += 1 - text += f"{count}➤ {user}\n" - except Exception: - continue - if not text: - await message.reply_text("» ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ.") - else: - await hehe.edit_text(text) diff --git a/GJ516music/Modules/sysstats.py b/GJ516music/Modules/sysstats.py deleted file mode 100644 index c71c194..0000000 --- a/GJ516music/Modules/sysstats.py +++ /dev/null @@ -1,115 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import platform -import re -import socket -import uuid -from sys import version as pyver - -import psutil -from pyrogram import __version__ as pyrover -from pyrogram import filters -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from pytgcalls.__version__ import __version__ as pytgver - -from GJ516Music import BOT_NAME, SUDOERS, app -from GJ516Music.Modules import ALL_MODULES - - -@app.on_message(filters.command(["stats", "sysstats"]) & SUDOERS) -async def sys_stats(_, message: Message): - sysrep = await message.reply_text( - f"ɢᴇᴛᴛɪɴɢ {BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs, ɪᴛ'ʟʟ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ..." - ) - try: - await message.delete() - except: - pass - sudoers = len(SUDOERS) - mod = len(ALL_MODULES) - hostname = socket.gethostname() - ip_address = socket.gethostbyname(socket.gethostname()) - architecture = platform.machine() - processor = platform.processor() - mac_address = ":".join(re.findall("..", "%012x" % uuid.getnode())) - sp = platform.system() - ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " ɢʙ" - p_core = psutil.cpu_count(logical=False) - t_core = psutil.cpu_count(logical=True) - 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) - total = str(total) - used = hdd.used / (1024.0**3) - used = str(used) - free = hdd.free / (1024.0**3) - free = str(free) - platform_release = platform.release() - platform_version = platform.version() - - await sysrep.edit_text( - f""" -➻ **{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs** - -**ᴩʏᴛʜᴏɴ :** {pyver.split()[0]} -**ᴩʏʀᴏɢʀᴀᴍ :** {pyrover} -**ᴩʏ-ᴛɢᴄᴀʟʟs :** {pytgver} -**sᴜᴅᴏᴇʀs :** `{sudoers}` -**ᴍᴏᴅᴜʟᴇs :** `{mod}` - -**ɪᴘ :** {ip_address} -**ᴍᴀᴄ :** {mac_address} -**ʜᴏsᴛɴᴀᴍᴇ :** {hostname} -**ᴘʟᴀᴛғᴏʀᴍ :** {sp} -**ᴘʀᴏᴄᴇssᴏʀ :** {processor} -**ᴀʀᴄʜɪᴛᴇᴄᴛᴜʀᴇ :** {architecture} -**ᴘʟᴀᴛғᴏʀᴍ ʀᴇʟᴇᴀsᴇ :** {platform_release} -**ᴘʟᴀᴛғᴏʀᴍ ᴠᴇʀsɪᴏɴ :** {platform_version} - - sᴛᴏʀᴀɢᴇ -**ᴀᴠᴀɪʟᴀʙʟᴇ :** {total[:4]} ɢɪʙ -**ᴜsᴇᴅ :** {used[:4]} ɢɪʙ -**ғʀᴇᴇ :** {free[:4]} ɢɪʙ - -**ʀᴀᴍ :** {ram} -**ᴩʜʏsɪᴄᴀʟ ᴄᴏʀᴇs :** {p_core} -**ᴛᴏᴛᴀʟ ᴄᴏʀᴇs :** {t_core} -**ᴄᴩᴜ ғʀᴇǫᴜᴇɴᴄʏ :** {cpu_freq}""", - reply_markup=InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text="ᴄʟᴏsᴇ", - callback_data=f"forceclose abc|{message.from_user.id}", - ), - ] - ] - ), - ) diff --git a/GJ516music/Modules/variables.py b/GJ516music/Modules/variables.py deleted file mode 100644 index fcf69cc..0000000 --- a/GJ516music/Modules/variables.py +++ /dev/null @@ -1,61 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.enums import ChatType -from pyrogram.types import Message - -import config -from GJ516Music import BOT_NAME, app - - -@app.on_message( - filters.command(["config", "variables"]) & filters.user(config.OWNER_ID) -) -async def get_vars(_, message: Message): - try: - await app.send_message( - chat_id=int(config.OWNER_ID), - text=f"""**{BOT_NAME} ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs :** - -**ᴀᴘɪ_ɪᴅ :** `{config.API_ID}` -**ᴀᴘɪ_ʜᴀsʜ :** `{config.API_HASH}` - -**ʙᴏᴛ_ᴛᴏᴋᴇɴ :** `{config.BOT_TOKEN}` -**ᴅᴜʀᴀᴛɪᴏɴ_ʟɪᴍɪᴛ :** `{config.DURATION_LIMIT}` - -**ᴏᴡɴᴇʀ_ɪᴅ :** `{config.OWNER_ID}` -**sᴜᴅᴏ_ᴜsᴇʀs :** `{config.SUDO_USERS}` - -**ᴘɪɴɢ_ɪᴍɢ :** `{config.PING_IMG}` -**sᴛᴀʀᴛ_ɪᴍɢ :** `{config.START_IMG}` -**sᴜᴘᴘᴏʀᴛ_ᴄʜᴀᴛ :** `{config.SUPPORT_CHAT}` - -**sᴇssɪᴏɴ :** `{config.SESSION}`""", - disable_web_page_preview=True, - ) - except: - return await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ sᴇɴᴅ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs.") - if message.chat.type != ChatType.PRIVATE: - await message.reply_text( - "» ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, ɪ'ᴠᴇ sᴇɴᴛ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs ᴛʜᴇʀᴇ." - ) diff --git a/GJ516music/Modules/watcher.py b/GJ516music/Modules/watcher.py deleted file mode 100644 index 90bbefb..0000000 --- a/GJ516music/Modules/watcher.py +++ /dev/null @@ -1,110 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram import filters -from pyrogram.types import Message -from pytgcalls.types import AudioPiped, HighQualityAudio, Update - -from GJ516Music import BOT_ID, BOT_USERNAME, app, app2, GJ516db, pytgcalls -from GJ516Music.Helpers import _clear_, buttons, gen_thumb - -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): - try: - await _clear_(message.chat.id) - await pytgcalls.leave_group_call(message.chat.id) - except: - pass - - -@app.on_message(filters.left_chat_member) -async def ub_leave(_, message: Message): - if message.left_chat_member.id == BOT_ID: - try: - await _clear_(message.chat.id) - await pytgcalls.leave_group_call(message.chat.id) - except: - pass - try: - await app2.leave_chat(message.chat.id) - except: - pass - - -@pytgcalls.on_left() -@pytgcalls.on_kicked() -@pytgcalls.on_closed_voice_chat() -async def swr_handler(_, chat_id: int): - try: - await _clear_(chat_id) - except: - pass - - -@pytgcalls.on_stream_end() -async def on_stream_end(pytgcalls, update: Update): - chat_id = update.chat_id - - get = GJ516db.get(chat_id) - if not get: - try: - await _clear_(chat_id) - return await pytgcalls.leave_group_call(chat_id) - except: - return - else: - process = await app.send_message( - chat_id=chat_id, - text="» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ᴏ̨ᴜᴇᴜᴇ...", - ) - title = get[0]["title"] - duration = get[0]["duration"] - file_path = get[0]["file_path"] - videoid = get[0]["videoid"] - req_by = get[0]["req"] - user_id = get[0]["user_id"] - get.pop(0) - - stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) - - try: - await pytgcalls.change_stream( - chat_id, - stream, - ) - except: - await _clear_(chat_id) - return await pytgcalls.leave_group_call(chat_id) - - img = await gen_thumb(videoid, user_id) - await process.delete() - await app.send_photo( - chat_id=chat_id, - photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", - reply_markup=buttons, - ) diff --git a/GJ516music/__init__.py b/GJ516music/__init__.py deleted file mode 100644 index a67ccc8..0000000 --- a/GJ516music/__init__.py +++ /dev/null @@ -1,118 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio -import logging -import os -import time - -from pyrogram import Client, filters -from pytgcalls import PyTgCalls - -import config - -StartTime = time.time() - -logging.basicConfig( - format="[%(asctime)s - %(levelname)s] - %(name)s - %(message)s", - datefmt="%d-%b-%y %H:%M:%S", - handlers=[logging.FileHandler("GJ516logs.txt"), logging.StreamHandler()], - level=logging.INFO, -) -logging.getLogger("pyrogram").setLevel(logging.ERROR) -logging.getLogger("pytgcalls").setLevel(logging.ERROR) -LOGGER = logging.getLogger("GJ516Music") - -app = Client( - "GJ516Music", - config.API_ID, - config.API_HASH, - bot_token=config.BOT_TOKEN, -) - -app2 = Client( - "GJ516Ass", - api_id=config.API_ID, - api_hash=config.API_HASH, - session_string=str(config.SESSION), -) - -pytgcalls = PyTgCalls(app2) - -SUDOERS = filters.user() -SUNAME = config.SUPPORT_CHAT.split("me/")[1] - - -async def GJ516_startup(): - os.system("clear") - LOGGER.info( - "\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2523\u2605\x20\x46\x41\x4c\x4c\x45\x4e\x20\x4d\x55\x53\x49\x43\x20\x42\x4f\x54\x20\u2605\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b" - ) - global BOT_ID, BOT_NAME, BOT_USERNAME, BOT_MENTION, GJ516db - global ASS_ID, ASS_NAME, ASS_USERNAME, ASS_MENTION, SUDOERS - - await app.start() - LOGGER.info( - "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x42\x6f\x74\x2e\x2e\x2e" - ) - - getme = await app.get_me() - BOT_ID = getme.id - BOT_NAME = getme.first_name - BOT_USERNAME = getme.username - BOT_MENTION = getme.mention - - await app2.start() - LOGGER.info( - "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x41\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x2e\x2e" - ) - - getme2 = await app2.get_me() - ASS_ID = getme2.id - ASS_NAME = getme2.first_name + " " + (getme2.last_name or "") - ASS_USERNAME = getme2.username - ASS_MENTION = getme2.mention - try: - await app2.join_chat("DevilsHeavenMF") - await app2.join_chat("GJ516Association") - except: - pass - - ANON = "\x31\x33\x35\x36\x34\x36\x39\x30\x37\x35" - for SUDOER in config.SUDO_USERS: - SUDOERS.add(SUDOER) - if config.OWNER_ID not in config.SUDO_USERS: - SUDOERS.add(config.OWNER_ID) - elif int(ANON) not in config.SUDO_USERS: - SUDOERS.add(int(ANON)) - - GJ516db = {} - LOGGER.info( - "[•] \x4c\x6f\x63\x61\x6c\x20\x44\x61\x74\x61\x62\x61\x73\x65\x20\x49\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x2e\x2e\x2e" - ) - - LOGGER.info( - "[•] \x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x43\x6c\x69\x65\x6e\x74\x73\x20\x42\x6f\x6f\x74\x65\x64\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x2e" - ) - - -asyncio.get_event_loop().run_until_complete(GJ516_startup()) diff --git a/GJ516music/__main__.py b/GJ516music/__main__.py deleted file mode 100644 index 71b587f..0000000 --- a/GJ516music/__main__.py +++ /dev/null @@ -1,92 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 AnonymousX1025 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio -import importlib -import os - -from pyrogram import idle - -from GJ516Music import ( - ASS_ID, - ASS_NAME, - ASS_USERNAME, - BOT_ID, - BOT_NAME, - BOT_USERNAME, - LOGGER, - SUNAME, - app, - app2, - pytgcalls, -) -from GJ516Music.Modules import ALL_MODULES - - -async def GJ516_startup(): - LOGGER.info("[•] Loading Modules...") - for module in ALL_MODULES: - importlib.import_module("GJ516Music.Modules." + module) - LOGGER.info(f"[•] Loaded {len(ALL_MODULES)} Modules.") - - LOGGER.info("[•] Refreshing Directories...") - if "downloads" not in os.listdir(): - os.mkdir("downloads") - if "cache" not in os.listdir(): - os.mkdir("cache") - LOGGER.info("[•] Directories Refreshed.") - - try: - await app.send_message( - SUNAME, - f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ʙᴏᴛ ✯\n\n𖢵 ɪᴅ : `{BOT_ID}`\n𖢵 ɴᴀᴍᴇ : {BOT_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{BOT_USERNAME}", - ) - except: - LOGGER.error( - f"{BOT_NAME} failed to send message at @{SUNAME}, please go & check." - ) - - try: - await app2.send_message( - SUNAME, - f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ᴀss ✯\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}", - ) - except: - LOGGER.error( - f"{ASS_NAME} failed to send message at @{SUNAME}, please go & check." - ) - - await app2.send_message(BOT_USERNAME, "/start") - - LOGGER.info(f"[•] Bot Started As {BOT_NAME}.") - LOGGER.info(f"[•] Assistant Started As {ASS_NAME}.") - - LOGGER.info( - "[•] \x53\x74\x61\x72\x74\x69\x6e\x67\x20\x50\x79\x54\x67\x43\x61\x6c\x6c\x73\x20\x43\x6c\x69\x65\x6e\x74\x2e\x2e\x2e" - ) - await pytgcalls.start() - await idle() - - -if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(GJ516_startup()) - LOGGER.error("GJ516 Music Bot Stopped.") From ea681d3af755d92c45efed99f7cac7a971fe6379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:36:54 +0530 Subject: [PATCH 020/211] Create JAY DEVELOPER --- GJ516Music/Helpers/utils/JAY DEVELOPER | 1 + 1 file changed, 1 insertion(+) create mode 100644 GJ516Music/Helpers/utils/JAY DEVELOPER diff --git a/GJ516Music/Helpers/utils/JAY DEVELOPER b/GJ516Music/Helpers/utils/JAY DEVELOPER new file mode 100644 index 0000000..20c79d9 --- /dev/null +++ b/GJ516Music/Helpers/utils/JAY DEVELOPER @@ -0,0 +1 @@ +Kya dek rha h be lodu 😂😂 From 24149c3ea504a510b9f5c3db80fce191a5fdc596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:38:09 +0530 Subject: [PATCH 021/211] Add files via upload --- GJ516Music/Helpers/utils/__init__.py | 21 +++++++++++++++++++++ GJ516Music/Helpers/utils/circle.png | Bin 0 -> 23029 bytes GJ516Music/Helpers/utils/font.ttf | Bin 0 -> 141612 bytes GJ516Music/Helpers/utils/font2.ttf | Bin 0 -> 128248 bytes 4 files changed, 21 insertions(+) create mode 100644 GJ516Music/Helpers/utils/__init__.py create mode 100644 GJ516Music/Helpers/utils/circle.png create mode 100644 GJ516Music/Helpers/utils/font.ttf create mode 100644 GJ516Music/Helpers/utils/font2.ttf diff --git a/GJ516Music/Helpers/utils/__init__.py b/GJ516Music/Helpers/utils/__init__.py new file mode 100644 index 0000000..f5b3c9b --- /dev/null +++ b/GJ516Music/Helpers/utils/__init__.py @@ -0,0 +1,21 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. diff --git a/GJ516Music/Helpers/utils/circle.png b/GJ516Music/Helpers/utils/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d1be4329f4546501870b6d870b184a3f82c959 GIT binary patch literal 23029 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 literal 0 HcmV?d00001 diff --git a/GJ516Music/Helpers/utils/font.ttf b/GJ516Music/Helpers/utils/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b8622f67bffda70fc2d7f6ff2f2ad6f3078fd08 GIT binary patch literal 141612 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
pJZQSzuNwmL%hRN4*MNWJACAD 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 literal 0 HcmV?d00001 diff --git a/GJ516Music/Helpers/utils/font2.ttf b/GJ516Music/Helpers/utils/font2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2ceaf63a3281450969d30f3f256e19940a32cfaa GIT binary patch literal 128248 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 literal 0 HcmV?d00001 From 2b8987c42d5d9b2bf8507ca74dfd49a612a5cab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:39:19 +0530 Subject: [PATCH 022/211] Add files via upload --- GJ516Music/Helpers/__init__.py | 32 +++ GJ516Music/Helpers/active.py | 60 ++++++ GJ516Music/Helpers/admins.py | 91 ++++++++ GJ516Music/Helpers/clear.py | 32 +++ GJ516Music/Helpers/dossier.py | 81 +++++++ GJ516Music/Helpers/downloaders.py | 52 +++++ GJ516Music/Helpers/errors.py | 29 +++ GJ516Music/Helpers/formatters.py | 45 ++++ GJ516Music/Helpers/gets.py | 57 +++++ GJ516Music/Helpers/inline.py | 110 ++++++++++ GJ516Music/Helpers/queue.py | 48 +++++ GJ516Music/Helpers/thumbnails.py | 343 ++++++++++++++++++++++++++++++ 12 files changed, 980 insertions(+) create mode 100644 GJ516Music/Helpers/__init__.py create mode 100644 GJ516Music/Helpers/active.py create mode 100644 GJ516Music/Helpers/admins.py create mode 100644 GJ516Music/Helpers/clear.py create mode 100644 GJ516Music/Helpers/dossier.py create mode 100644 GJ516Music/Helpers/downloaders.py create mode 100644 GJ516Music/Helpers/errors.py create mode 100644 GJ516Music/Helpers/formatters.py create mode 100644 GJ516Music/Helpers/gets.py create mode 100644 GJ516Music/Helpers/inline.py create mode 100644 GJ516Music/Helpers/queue.py create mode 100644 GJ516Music/Helpers/thumbnails.py diff --git a/GJ516Music/Helpers/__init__.py b/GJ516Music/Helpers/__init__.py new file mode 100644 index 0000000..8c9a8e2 --- /dev/null +++ b/GJ516Music/Helpers/__init__.py @@ -0,0 +1,32 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from .active import * +from .admins import * +from .clear import _clear_ +from .dossier import * +from .errors import * +from .formatters import * +from .gets import * +from .inline import * +from .queue import * +from .thumbnails import * diff --git a/GJ516Music/Helpers/active.py b/GJ516Music/Helpers/active.py new file mode 100644 index 0000000..724c23c --- /dev/null +++ b/GJ516Music/Helpers/active.py @@ -0,0 +1,60 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +active = [] +stream = {} + + +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_chats() -> list: + return active + + +async def is_streaming(chat_id: int) -> bool: + run = stream.get(chat_id) + if not run: + return False + return run + + +async def stream_on(chat_id: int): + stream[chat_id] = True + + +async def stream_off(chat_id: int): + stream[chat_id] = False diff --git a/GJ516Music/Helpers/admins.py b/GJ516Music/Helpers/admins.py new file mode 100644 index 0000000..57d15ec --- /dev/null +++ b/GJ516Music/Helpers/admins.py @@ -0,0 +1,91 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Callable + +from pyrogram.enums import ChatMemberStatus +from pyrogram.types import CallbackQuery, Message + +from GJ516Music import SUDOERS, app + +from .active import is_active_chat + + +def admin_check(func: Callable) -> Callable: + async def non_admin(_, message: Message): + if not await is_active_chat(message.chat.id): + return await message.reply_text("ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.") + + if message.from_user.id in SUDOERS: + return await func(_, message) + + check = await app.get_chat_member(message.chat.id, message.from_user.id) + if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: + return await message.reply_text( + "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + ) + + admin = ( + await app.get_chat_member(message.chat.id, message.from_user.id) + ).privileges + if admin.can_manage_video_chats: + return await func(_, message) + else: + return await message.reply_text( + "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + ) + + return non_admin + + +def admin_check_cb(func: Callable) -> Callable: + async def cb_non_admin(_, query: CallbackQuery): + if not await is_active_chat(query.message.chat.id): + return await query.answer( + "ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.", show_alert=True + ) + + if query.from_user.id in SUDOERS: + return await func(_, query) + + try: + check = await app.get_chat_member(query.message.chat.id, query.from_user.id) + except: + return + if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: + return await query.answer( + "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + show_alert=True, + ) + + admin = ( + await app.get_chat_member(query.message.chat.id, query.from_user.id) + ).privileges + if admin.can_manage_video_chats: + return await func(_, query) + else: + return await query.answer( + "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + show_alert=True, + ) + + return cb_non_admin diff --git a/GJ516Music/Helpers/clear.py b/GJ516Music/Helpers/clear.py new file mode 100644 index 0000000..605339d --- /dev/null +++ b/GJ516Music/Helpers/clear.py @@ -0,0 +1,32 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import GJ516db +from GJ516Music.Helpers import remove_active_chat + + +async def _clear_(chat_id): + try: + GJ516db[chat_id] = [] + await remove_active_chat(chat_id) + except: + return diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py new file mode 100644 index 0000000..64c30eb --- /dev/null +++ b/GJ516Music/Helpers/dossier.py @@ -0,0 +1,81 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import BOT_NAME + +PM_START_TEXT = """ +ʜᴇʏ {0}, 🥀 +๏ ᴛʜɪs ɪs** {1} ! + +➻ ᴀ ғᴀsᴛ ᴀɴᴅ ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ᴘʟᴀʏᴇʀ ʙᴏᴛ. +""" + +START_TEXT = """ +**ʜᴇʏ** {0}, 🥀 + {1} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ {2}. + +────────────────── +➻ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʜᴇʟᴘ ᴀʙᴏᴜᴛ ᴍᴇ ᴏʀ ɪғ ʏᴏᴜ ᴡᴀɴɴᴀ ᴀsᴋ sᴏᴍᴇᴛʜɪɴɢ ʏᴏᴜ ᴄᴀɴ ᴊᴏɪɴ ᴍʏ [sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ]({3}). +""" + +HELP_TEXT = f""" +❄ **ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs ғᴏʀ ᴜsᴇʀs ɪɴ {BOT_NAME} :** + +๏ /play : sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. +๏ /pause : ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. +๏ /resume : ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. +๏ /skip : sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. +๏ /end : ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. + +๏ /ping : sʜᴏᴡ ᴛʜᴇ ᴩɪɴɢ ᴀɴᴅ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. +๏ /sudolist : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴅᴏ ᴜsᴇʀs ᴏғ ᴛʜᴇ ʙᴏᴛ. + +๏ /song : ᴅᴏᴡɴʟᴏᴀᴅs ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴀɴᴅ sᴇɴᴅ ɪᴛ ᴛᴏ ʏᴏᴜ. + +๏ /search : sᴇᴀʀᴄᴇs ᴛʜᴇ ɢɪᴠᴇɴ ǫᴜᴇʀʏ ᴏɴ ʏᴏᴜᴛᴜʙᴇ ᴀɴᴅ sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʀᴇsᴜʟᴛ. +""" + +HELP_SUDO = f""" +✨ **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** + +๏ /activevc : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs. +๏ /eval or /sh : ʀᴜɴs ᴛʜᴇ ɢɪᴠᴇɴ ᴄᴏᴅᴇ ᴏɴ ᴛʜᴇ ʙᴏᴛ's ᴛᴇʀᴍɪɴᴀʟ. +๏ /speedtest : ʀᴜɴs ᴀ sᴘᴇᴇᴅᴛᴇsᴛ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. +๏ /sysstats : sʜᴏᴡs ᴛʜᴇ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. + +๏ /setname [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ɴᴀᴍᴇ. +๏ /setbio [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ʙɪᴏ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +๏ /setpfp [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +๏ /delpfp : ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. +""" + +HELP_DEV = f""" +✨ **ᴏᴡɴᴇʀ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** + +๏ /config : ᴛᴏ ɢᴇᴛ ᴀʟʟ ᴄᴏɴꜰɪɢ ᴠᴀʀɪᴀʙʟᴇꜱ ᴏꜰ ʙᴏᴛ. +๏ /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] : ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. +๏ /rmdownloads : ᴄʟᴇᴀʀs ᴛʜᴇ ᴄᴀᴄʜᴇ ғɪʟᴇs ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. +๏ /leaveall : ᴏʀᴅᴇʀs ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴀʟʟ ᴄʜᴀᴛs. + +๏ /addsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ᴀᴅᴅ ᴛʜᴇ ᴜsᴇʀ ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. +๏ /rmsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ʀᴇᴍᴏᴠᴇ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. +""" diff --git a/GJ516Music/Helpers/downloaders.py b/GJ516Music/Helpers/downloaders.py new file mode 100644 index 0000000..67f2193 --- /dev/null +++ b/GJ516Music/Helpers/downloaders.py @@ -0,0 +1,52 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +from yt_dlp import YoutubeDL + +ydl_opts = { + "format": "bestaudio/best", + "outtmpl": "downloads/%(id)s.%(ext)s", + "geo_bypass": True, + "nocheckcertificate": True, + "quiet": True, + "no_warnings": True, + "prefer_ffmpeg": True, + "postprocessors": [ + { + "key": "FFmpegExtractAudio", + "preferredcodec": "mp3", + "preferredquality": "320", + } + ], +} +ydl = YoutubeDL(ydl_opts) + + +def audio_dl(url: str) -> str: + sin = ydl.extract_info(url, False) + x_file = os.path.join("downloads", f"{sin['id']}.mp3") + if os.path.exists(x_file): + return x_file + ydl.download([url]) + return x_file diff --git a/GJ516Music/Helpers/errors.py b/GJ516Music/Helpers/errors.py new file mode 100644 index 0000000..f4553ed --- /dev/null +++ b/GJ516Music/Helpers/errors.py @@ -0,0 +1,29 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +class DurationLimitError(Exception): + pass + + +class FFmpegReturnCodeError(Exception): + pass diff --git a/GJ516Music/Helpers/formatters.py b/GJ516Music/Helpers/formatters.py new file mode 100644 index 0000000..f683b84 --- /dev/null +++ b/GJ516Music/Helpers/formatters.py @@ -0,0 +1,45 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +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 diff --git a/GJ516Music/Helpers/gets.py b/GJ516Music/Helpers/gets.py new file mode 100644 index 0000000..ef702b7 --- /dev/null +++ b/GJ516Music/Helpers/gets.py @@ -0,0 +1,57 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from typing import Union + +from pyrogram.enums import MessageEntityType +from pyrogram.types import Audio, Message, Voice + + +def get_url(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 + + if offset in (None,): + return None + + return text[offset : offset + length] + + +def get_file_name(audio: Union[Audio, Voice]): + return f'{audio.file_unique_id}.{audio.file_name.split(".")[-1] if not isinstance(audio, Voice) else "ogg"}' diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py new file mode 100644 index 0000000..1e2cc37 --- /dev/null +++ b/GJ516Music/Helpers/inline.py @@ -0,0 +1,110 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +import config +from GJ516Music import BOT_USERNAME + +close_key = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] +) + + +buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="▷", callback_data="resume_cb"), + InlineKeyboardButton(text="II", callback_data="pause_cb"), + InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), + InlineKeyboardButton(text="▢", callback_data="end_cb"), + ] + ] +) + + +pm_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="GJ516_help")], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/GJ516Music" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +gp_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/GJ516Music" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +helpmenu = [ + [ + InlineKeyboardButton( + text="ᴇᴠᴇʀʏᴏɴᴇ", + callback_data="GJ516_cb help", + ) + ], + [ + InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="GJ516_cb sudo"), + InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="GJ516_cb owner"), + ], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_home"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] + + +help_back = [ + [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_help"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] diff --git a/GJ516Music/Helpers/queue.py b/GJ516Music/Helpers/queue.py new file mode 100644 index 0000000..48e5d02 --- /dev/null +++ b/GJ516Music/Helpers/queue.py @@ -0,0 +1,48 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from GJ516Music import GJ516db + + +async def put( + chat_id, + title, + duration, + videoid, + file_path, + ruser, + user_id, +): + put_f = { + "title": title, + "duration": duration, + "file_path": file_path, + "videoid": videoid, + "req": ruser, + "user_id": user_id, + } + get = GJ516db.get(chat_id) + if get: + GJ516db[chat_id].append(put_f) + else: + GJ516db[chat_id] = [] + GJ516db[chat_id].append(put_f) diff --git a/GJ516Music/Helpers/thumbnails.py b/GJ516Music/Helpers/thumbnails.py new file mode 100644 index 0000000..289df53 --- /dev/null +++ b/GJ516Music/Helpers/thumbnails.py @@ -0,0 +1,343 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import re +import textwrap + +import aiofiles +import aiohttp +import numpy as np +from PIL import Image, ImageChops, ImageDraw, ImageEnhance, ImageFilter, ImageFont +from youtubesearchpython.__future__ import VideosSearch + +from config import FAILED +from GJ516Music import BOT_ID, LOGGER, app + + +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 add_corners(im): + bigsize = (im.size[0] * 3, im.size[1] * 3) + mask = Image.new("L", bigsize, 0) + ImageDraw.Draw(mask).ellipse((0, 0) + bigsize, fill=255) + mask = mask.resize(im.size, Image.ANTIALIAS) + mask = ImageChops.darker(mask, im.split()[-1]) + im.putalpha(mask) + + +async def gen_thumb(videoid, user_id): + if os.path.isfile(f"cache/{videoid}_{user_id}.png"): + return f"cache/{videoid}_{user_id}.png" + url = f"https://www.youtube.com/watch?v={videoid}" + try: + 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" + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + try: + result["viewCount"]["short"] + except: + pass + try: + result["channel"]["name"] + except: + pass + + 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() + + try: + wxy = await app.download_media( + (await app.get_users(user_id)).photo.big_file_id, + file_name=f"{user_id}.jpg", + ) + except: + wxy = await app.download_media( + (await app.get_users(BOT_ID)).photo.big_file_id, + file_name=f"{BOT_ID}.jpg", + ) + + xy = Image.open(wxy) + a = Image.new("L", [640, 640], 0) + b = ImageDraw.Draw(a) + b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") + c = np.array(xy) + d = np.array(a) + e = np.dstack((c, d)) + f = Image.fromarray(e) + x = f.resize((107, 107)) + + youtube = Image.open(f"cache/thumb{videoid}.png") + bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(30)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + + image3 = changeImageSize(1280, 720, bg) + image5 = image3.convert("RGBA") + Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") + + Xcenter = youtube.width / 2 + Ycenter = youtube.height / 2 + x1 = Xcenter - 250 + y1 = Ycenter - 250 + x2 = Xcenter + 250 + y2 = Ycenter + 250 + logo = youtube.crop((x1, y1, x2, y2)) + logo.thumbnail((520, 520), Image.ANTIALIAS) + logo.save(f"cache/chop{videoid}.png") + if not os.path.isfile(f"cache/cropped{videoid}.png"): + im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") + add_corners(im) + im.save(f"cache/cropped{videoid}.png") + + crop_img = Image.open(f"cache/cropped{videoid}.png") + logo = crop_img.convert("RGBA") + logo.thumbnail((365, 365), Image.ANTIALIAS) + width = int((1280 - 365) / 2) + background = Image.open(f"cache/temp{videoid}.png") + background.paste(logo, (width + 2, 138), mask=logo) + background.paste(x, (710, 427), mask=x) + background.paste(image3, (0, 0), mask=image3) + + draw = ImageDraw.Draw(background) + font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) + ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) + arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) + ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) + para = textwrap.wrap(title, width=32) + try: + draw.text( + (450, 25), + f"STARTED PLAYING", + fill="white", + stroke_width=3, + stroke_fill="grey", + font=font, + ) + if para[0]: + text_w, text_h = draw.textsize(f"{para[0]}", font=font) + draw.text( + ((1280 - text_w) / 2, 530), + f"{para[0]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + if para[1]: + text_w, text_h = draw.textsize(f"{para[1]}", font=font) + draw.text( + ((1280 - text_w) / 2, 580), + f"{para[1]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + except: + pass + text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) + draw.text( + ((1280 - text_w) / 2, 660), + f"Duration: {duration} Mins", + fill="white", + font=arial, + ) + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/{videoid}_{user_id}.png") + return f"cache/{videoid}_{user_id}.png" + except Exception as e: + LOGGER.error(e) + return FAILED + + +async def gen_qthumb(videoid, user_id): + if os.path.isfile(f"cache/que{videoid}_{user_id}.png"): + return f"cache/que{videoid}_{user_id}.png" + url = f"https://www.youtube.com/watch?v={videoid}" + try: + 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" + thumbnail = result["thumbnails"][0]["url"].split("?")[0] + try: + result["viewCount"]["short"] + except: + pass + try: + result["channel"]["name"] + except: + pass + + 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() + + try: + wxy = await app.download_media( + (await app.get_users(user_id)).photo.big_file_id, + file_name=f"{user_id}.jpg", + ) + except: + wxy = await app.download_media( + (await app.get_users(BOT_ID)).photo.big_file_id, + file_name=f"{BOT_ID}.jpg", + ) + + xy = Image.open(wxy) + a = Image.new("L", [640, 640], 0) + b = ImageDraw.Draw(a) + b.pieslice([(0, 0), (640, 640)], 0, 360, fill=255, outline="white") + c = np.array(xy) + d = np.array(a) + e = np.dstack((c, d)) + f = Image.fromarray(e) + x = f.resize((107, 107)) + + youtube = Image.open(f"cache/thumb{videoid}.png") + bg = Image.open(f"GJ516Music/Helpers/utils/circle.png") + image1 = changeImageSize(1280, 720, youtube) + image2 = image1.convert("RGBA") + background = image2.filter(filter=ImageFilter.BoxBlur(30)) + enhancer = ImageEnhance.Brightness(background) + background = enhancer.enhance(0.6) + + image3 = changeImageSize(1280, 720, bg) + image5 = image3.convert("RGBA") + Image.alpha_composite(background, image5).save(f"cache/temp{videoid}.png") + + Xcenter = youtube.width / 2 + Ycenter = youtube.height / 2 + x1 = Xcenter - 250 + y1 = Ycenter - 250 + x2 = Xcenter + 250 + y2 = Ycenter + 250 + logo = youtube.crop((x1, y1, x2, y2)) + logo.thumbnail((520, 520), Image.ANTIALIAS) + logo.save(f"cache/chop{videoid}.png") + if not os.path.isfile(f"cache/cropped{videoid}.png"): + im = Image.open(f"cache/chop{videoid}.png").convert("RGBA") + add_corners(im) + im.save(f"cache/cropped{videoid}.png") + + crop_img = Image.open(f"cache/cropped{videoid}.png") + logo = crop_img.convert("RGBA") + logo.thumbnail((365, 365), Image.ANTIALIAS) + width = int((1280 - 365) / 2) + background = Image.open(f"cache/temp{videoid}.png") + background.paste(logo, (width + 2, 138), mask=logo) + background.paste(x, (710, 427), mask=x) + background.paste(image3, (0, 0), mask=image3) + + draw = ImageDraw.Draw(background) + font = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 45) + ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 70) + arial = ImageFont.truetype("GJ516Music/Helpers/utils/font2.ttf", 30) + ImageFont.truetype("GJ516Music/Helpers/utils/font.ttf", 30) + para = textwrap.wrap(title, width=32) + try: + draw.text( + (455, 25), + "ADDED TO QUEUE", + fill="white", + stroke_width=5, + stroke_fill="black", + font=font, + ) + if para[0]: + text_w, text_h = draw.textsize(f"{para[0]}", font=font) + draw.text( + ((1280 - text_w) / 2, 530), + f"{para[0]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + if para[1]: + text_w, text_h = draw.textsize(f"{para[1]}", font=font) + draw.text( + ((1280 - text_w) / 2, 580), + f"{para[1]}", + fill="white", + stroke_width=1, + stroke_fill="white", + font=font, + ) + except: + pass + text_w, text_h = draw.textsize(f"Duration: {duration} Mins", font=arial) + draw.text( + ((1280 - text_w) / 2, 660), + f"Duration: {duration} Mins", + fill="white", + font=arial, + ) + + try: + os.remove(f"cache/thumb{videoid}.png") + except: + pass + background.save(f"cache/que{videoid}_{user_id}.png") + return f"cache/que{videoid}_{user_id}.png" + except Exception as e: + LOGGER.error(e) + return FAILED From b05cba9e7bc50dc30c426f1d4ee6136a6fb00414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:40:19 +0530 Subject: [PATCH 023/211] Create JAY DEVELOPER --- GJ516Music/Modules/JAY DEVELOPER | 1 + 1 file changed, 1 insertion(+) create mode 100644 GJ516Music/Modules/JAY DEVELOPER diff --git a/GJ516Music/Modules/JAY DEVELOPER b/GJ516Music/Modules/JAY DEVELOPER new file mode 100644 index 0000000..f6fc09a --- /dev/null +++ b/GJ516Music/Modules/JAY DEVELOPER @@ -0,0 +1 @@ +Lund lele bsdk 😂😂 From 7093c18a772626f1e7f730f5d823b9f3684a8ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:45:20 +0530 Subject: [PATCH 024/211] Add files via upload --- GJ516Music/Modules/JAY DEVELOPER | 2 +- GJ516Music/Modules/__init__.py | 40 +++++ GJ516Music/Modules/activevc.py | 55 +++++++ GJ516Music/Modules/assistant.py | 97 ++++++++++++ GJ516Music/Modules/broadcast.py | 65 ++++++++ GJ516Music/Modules/callback.py | 253 ++++++++++++++++++++++++++++++ GJ516Music/Modules/cleaner.py | 49 ++++++ GJ516Music/Modules/eval.py | 195 +++++++++++++++++++++++ GJ516Music/Modules/inline.py | 92 +++++++++++ GJ516Music/Modules/leaveall.py | 63 ++++++++ GJ516Music/Modules/pause.py | 48 ++++++ GJ516Music/Modules/ping.py | 68 ++++++++ GJ516Music/Modules/play.py | 258 +++++++++++++++++++++++++++++++ GJ516Music/Modules/resume.py | 45 ++++++ GJ516Music/Modules/search.py | 67 ++++++++ GJ516Music/Modules/skip.py | 77 +++++++++ GJ516Music/Modules/song.py | 119 ++++++++++++++ GJ516Music/Modules/speedtest.py | 67 ++++++++ GJ516Music/Modules/start.py | 103 ++++++++++++ GJ516Music/Modules/stop.py | 46 ++++++ GJ516Music/Modules/sudoers.py | 132 ++++++++++++++++ GJ516Music/Modules/sysstats.py | 115 ++++++++++++++ GJ516Music/Modules/variables.py | 61 ++++++++ GJ516Music/Modules/watcher.py | 110 +++++++++++++ 24 files changed, 2226 insertions(+), 1 deletion(-) create mode 100644 GJ516Music/Modules/__init__.py create mode 100644 GJ516Music/Modules/activevc.py create mode 100644 GJ516Music/Modules/assistant.py create mode 100644 GJ516Music/Modules/broadcast.py create mode 100644 GJ516Music/Modules/callback.py create mode 100644 GJ516Music/Modules/cleaner.py create mode 100644 GJ516Music/Modules/eval.py create mode 100644 GJ516Music/Modules/inline.py create mode 100644 GJ516Music/Modules/leaveall.py create mode 100644 GJ516Music/Modules/pause.py create mode 100644 GJ516Music/Modules/ping.py create mode 100644 GJ516Music/Modules/play.py create mode 100644 GJ516Music/Modules/resume.py create mode 100644 GJ516Music/Modules/search.py create mode 100644 GJ516Music/Modules/skip.py create mode 100644 GJ516Music/Modules/song.py create mode 100644 GJ516Music/Modules/speedtest.py create mode 100644 GJ516Music/Modules/start.py create mode 100644 GJ516Music/Modules/stop.py create mode 100644 GJ516Music/Modules/sudoers.py create mode 100644 GJ516Music/Modules/sysstats.py create mode 100644 GJ516Music/Modules/variables.py create mode 100644 GJ516Music/Modules/watcher.py diff --git a/GJ516Music/Modules/JAY DEVELOPER b/GJ516Music/Modules/JAY DEVELOPER index f6fc09a..62de020 100644 --- a/GJ516Music/Modules/JAY DEVELOPER +++ b/GJ516Music/Modules/JAY DEVELOPER @@ -1 +1 @@ -Lund lele bsdk 😂😂 +Lund lele bsdk ke 😂 diff --git a/GJ516Music/Modules/__init__.py b/GJ516Music/Modules/__init__.py new file mode 100644 index 0000000..479b164 --- /dev/null +++ b/GJ516Music/Modules/__init__.py @@ -0,0 +1,40 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import glob +from os.path import basename, dirname, isfile + + +def __list_all_modules(): + mod_paths = glob.glob(dirname(__file__) + "/*.py") + + all_modules = [ + basename(f)[:-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/GJ516Music/Modules/activevc.py b/GJ516Music/Modules/activevc.py new file mode 100644 index 0000000..46fbce4 --- /dev/null +++ b/GJ516Music/Modules/activevc.py @@ -0,0 +1,55 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import SUDOERS, app +from GJ516Music.Helpers.active import get_active_chats +from GJ516Music.Helpers.inline import close_key + + +@app.on_message(filters.command("activevc") & SUDOERS) +async def activevc(_, message: Message): + mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ʟɪsᴛ...") + chats = await get_active_chats() + text = "" + j = 0 + for chat in chats: + try: + title = (await app.get_chat(chat)).title + except Exception: + title = "ᴩʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ" + if (await app.get_chat(chat)).username: + user = (await app.get_chat(chat)).username + text += f"{j + 1}. [{title}](https://t.me/{user})\n" + else: + text += f"{j + 1}. {title} [`{chat}`]\n" + j += 1 + if not text: + await mystic.edit_text("ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄʙᴏᴛ...") + else: + await mystic.edit_text( + f"**ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄ ʙᴏᴛ :**\n\n{text}", + reply_markup=close_key, + disable_web_page_preview=True, + ) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py new file mode 100644 index 0000000..742d7bd --- /dev/null +++ b/GJ516Music/Modules/assistant.py @@ -0,0 +1,97 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import ASS_MENTION, LOGGER, SUDOERS, app, app2 + + +@app.on_message(filters.command(["asspfp", "setpfp"]) & SUDOERS) +async def set_pfp(_, message: Message): + if message.reply_to_message.photo: + fuk = await message.reply_text("» ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ...") + img = await message.reply_to_message.download() + try: + await app2.set_profile_photo(photo=img) + return await fuk.edit_text( + f"» {ASS_MENTION} ᴘʀᴏғɪʟᴇ ᴘɪᴄ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + except: + return await fuk.edit_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + else: + await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ ғᴏʀ ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + ) + + +@app.on_message(filters.command(["delpfp", "delasspfp"]) & SUDOERS) +async def set_pfp(_, message: Message): + try: + pfp = [p async for p in app2.get_chat_photos("me")] + await app2.delete_profile_photos(pfp[0].file_id) + return await message.reply_text( + "» sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴇʟᴇᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + ) + except Exception as ex: + LOGGER.error(ex) + await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + + +@app.on_message(filters.command(["assbio", "setbio"]) & SUDOERS) +async def set_bio(_, message: Message): + msg = message.reply_to_message + if msg: + if msg.text: + newbio = msg.text + await app2.update_profile(bio=newbio) + return await message.reply_text( + f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + elif len(message.command) != 1: + newbio = message.text.split(None, 1)[1] + await app2.update_profile(bio=newbio) + return await message.reply_text(f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + else: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ʙɪᴏ." + ) + + +@app.on_message(filters.command(["assname", "setname"]) & SUDOERS) +async def set_name(_, message: Message): + msg = message.reply_to_message + if msg: + if msg.text: + name = msg.text + await app2.update_profile(first_name=name) + return await message.reply_text( + f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + ) + elif len(message.command) != 1: + name = message.text.split(None, 1)[1] + await app2.update_profile(first_name=name, last_name="") + return await message.reply_text(f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + else: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ɴᴇᴡ ɴᴀᴍᴇ." + ) diff --git a/GJ516Music/Modules/broadcast.py b/GJ516Music/Modules/broadcast.py new file mode 100644 index 0000000..9a233f7 --- /dev/null +++ b/GJ516Music/Modules/broadcast.py @@ -0,0 +1,65 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import app, app2 + + +@app.on_message(filters.command("broadcast") & filters.user(OWNER_ID)) +async def broadcast(_, message: Message): + brep = await message.reply_text("sᴛᴀʀᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ...") + 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( + "**ᴇxᴀᴍᴘʟᴇ:**\n\n/broadcast [ᴍᴇssᴀɢᴇ] ᴏʀ [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" + ) + query = message.text.split(None, 1)[1] + sent = 0 + chats = [] + async for dialog in app2.get_dialogs(): + chats.append(int(dialog.chat.id)) + for i in chats: + try: + await app2.forward_messages( + i, y, x + ) if message.reply_to_message else await app2.send_message(i, text=query) + sent += 1 + except FloodWait as e: + flood_time = int(e.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except Exception: + continue + try: + await brep.edit_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") + except: + await message.reply_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") diff --git a/GJ516Music/Modules/callback.py b/GJ516Music/Modules/callback.py new file mode 100644 index 0000000..3a9100c --- /dev/null +++ b/GJ516Music/Modules/callback.py @@ -0,0 +1,253 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import CallbackQuery, InlineKeyboardMarkup +from pytgcalls.types import AudioPiped, HighQualityAudio + +from GJ516Music import ( + ASS_ID, + ASS_NAME, + BOT_ID, + BOT_MENTION, + BOT_USERNAME, + LOGGER, + app, + GJ516db, + pytgcalls, +) +from GJ516Music.Helpers import ( + _clear_, + admin_check_cb, + gen_thumb, + is_streaming, + stream_off, + stream_on, +) +from GJ516Music.Helpers.dossier import * +from GJ516Music.Helpers.inline import ( + buttons, + close_key, + help_back, + helpmenu, + pm_buttons, +) + + +@app.on_callback_query(filters.regex("forceclose")) +async def close_(_, 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_callback_query(filters.regex("close")) +async def forceclose_command(_, CallbackQuery): + try: + await CallbackQuery.message.delete() + except: + return + try: + await CallbackQuery.answer() + except: + pass + + +@app.on_callback_query(filters.regex(pattern=r"^(resume_cb|pause_cb|skip_cb|end_cb)$")) +@admin_check_cb +async def admin_cbs(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + + data = query.matches[0].group(1) + + if data == "resume_cb": + if await is_streaming(query.message.chat.id): + return await query.answer( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + ) + await stream_on(query.message.chat.id) + await pytgcalls.resume_stream(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + + elif data == "pause_cb": + if not await is_streaming(query.message.chat.id): + return await query.answer( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + ) + await stream_off(query.message.chat.id) + await pytgcalls.pause_stream(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + + elif data == "end_cb": + try: + await _clear_(query.message.chat.id) + await pytgcalls.leave_group_call(query.message.chat.id) + except: + pass + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ ❄\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + await query.message.delete() + + elif data == "skip_cb": + get = GJ516db.get(query.message.chat.id) + if not get: + try: + await _clear_(query.message.chat.id) + await pytgcalls.leave_group_call(query.message.chat.id) + await query.message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {query.message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + reply_markup=close_key, + ) + return await query.message.delete() + except: + return + else: + title = get[0]["title"] + duration = get[0]["duration"] + videoid = get[0]["videoid"] + file_path = get[0]["file_path"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.change_stream( + query.message.chat.id, + stream, + ) + except Exception as ex: + LOGGER.error(ex) + await _clear_(query.message.chat.id) + return await pytgcalls.leave_group_call(query.message.chat.id) + + img = await gen_thumb(videoid, user_id) + await query.edit_message_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + reply_markup=close_key, + ) + return await query.message.reply_photo( + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) + + +@app.on_callback_query(filters.regex("unban_ass")) +async def unban_ass(_, CallbackQuery): + callback_data = CallbackQuery.data.strip() + callback_request = callback_data.split(None, 1)[1] + chat_id, user_id = callback_request.split("|") + umm = (await app.get_chat_member(int(chat_id), BOT_ID)).privileges + if umm.can_restrict_members: + try: + await app.unban_chat_member(int(chat_id), ASS_ID) + except: + return await CallbackQuery.answer( + "» ғᴀɪʟᴇᴅ ᴛᴏ ᴜɴʙᴀɴ ᴀssɪsᴛᴀɴᴛ.", + show_alert=True, + ) + return await CallbackQuery.edit_message_text( + f"➻ {ASS_NAME} sᴜᴄᴄᴇssғᴜʟʟʏ ᴜɴʙᴀɴɴᴇᴅ ʙʏ {CallbackQuery.from_user.mention}.\n\nᴛʀʏ ᴘʟᴀʏɪɴɢ ɴᴏᴡ..." + ) + else: + return await CallbackQuery.answer( + "» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴜɴʙᴀɴ ᴜsᴇʀs ɪɴ ᴛʜɪs ᴄʜᴀᴛ.", + show_alert=True, + ) + + +@app.on_callback_query(filters.regex("GJ516_help")) +async def help_menu(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + + try: + await query.edit_message_text( + text=f"๏ ʜᴇʏ {query.from_user.first_name}, 🥀\n\nᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴘ.", + reply_markup=InlineKeyboardMarkup(helpmenu), + ) + except Exception as e: + LOGGER.error(e) + return + + +@app.on_callback_query(filters.regex("GJ516_cb")) +async def open_hmenu(_, query: CallbackQuery): + callback_data = query.data.strip() + cb = callback_data.split(None, 1)[1] + keyboard = InlineKeyboardMarkup(help_back) + + try: + await query.answer() + except: + pass + + if cb == "help": + await query.edit_message_text(HELP_TEXT, reply_markup=keyboard) + elif cb == "sudo": + await query.edit_message_text(HELP_SUDO, reply_markup=keyboard) + elif cb == "owner": + await query.edit_message_text(HELP_DEV, reply_markup=keyboard) + + +@app.on_callback_query(filters.regex("GJ516_home")) +async def home_GJ516(_, query: CallbackQuery): + try: + await query.answer() + except: + pass + try: + await query.edit_message_text( + text=PM_START_TEXT.format( + query.from_user.first_name, + BOT_MENTION, + ), + reply_markup=InlineKeyboardMarkup(pm_buttons), + ) + except: + pass diff --git a/GJ516Music/Modules/cleaner.py b/GJ516Music/Modules/cleaner.py new file mode 100644 index 0000000..7cf1a91 --- /dev/null +++ b/GJ516Music/Modules/cleaner.py @@ -0,0 +1,49 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +from pyrogram import filters +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import app + + +@app.on_message(filters.command(["clearcache", "rmdownloads"]) & filters.user(OWNER_ID)) +async def clear_misc(_, message: Message): + try: + await message.delete() + except: + pass + downloads = os.path.realpath("downloads") + down_dir = os.listdir(downloads) + pth = os.path.realpath(".") + os_dir = os.listdir(pth) + + if down_dir: + for file in down_dir: + os.remove(os.path.join(downloads, file)) + if os_dir: + for lel in os.listdir(pth): + os.system("rm -rf *.webm *.jpg *.png") + await message.reply_text("» ᴀʟʟ ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs ᴄʟᴇᴀɴᴇᴅ.") diff --git a/GJ516Music/Modules/eval.py b/GJ516Music/Modules/eval.py new file mode 100644 index 0000000..4a79104 --- /dev/null +++ b/GJ516Music/Modules/eval.py @@ -0,0 +1,195 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +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 GJ516Music import LOGGER, SUDOERS, app + + +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}) + + +@app.on_edited_message(filters.command("eval") & SUDOERS & ~filters.forwarded) +@app.on_message(filters.command("eval") & SUDOERS & ~filters.forwarded) +async def executor(client, 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 = "" + if exc: + evaluation = exc + elif stderr: + evaluation = stderr + elif stdout: + evaluation = stdout + else: + evaluation = "Success" + final_output = f"**OUTPUT**:\n```{evaluation.strip()}```" + if len(final_output) > 4096: + filename = "output.txt" + with open(filename, "w+", encoding="utf8") as out_file: + out_file.write(str(evaluation.strip())) + t2 = time() + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳", + callback_data=f"runtime {t2-t1} Seconds", + ) + ] + ] + ) + await message.reply_document( + document=filename, + caption=f"**INPUT:**\n`{cmd[0:980]}`\n\n**OUTPUT:**\n`Attached 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_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(client, 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: + LOGGER.error(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: + LOGGER.error(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 client.send_document( + message.chat.id, + "output.txt", + reply_to_message_id=message.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: **\n`No output`") diff --git a/GJ516Music/Modules/inline.py b/GJ516Music/Modules/inline.py new file mode 100644 index 0000000..4945aec --- /dev/null +++ b/GJ516Music/Modules/inline.py @@ -0,0 +1,92 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + InlineQueryResultPhoto, +) +from youtubesearchpython.__future__ import VideosSearch + +from GJ516Music import BOT_NAME, app + + +@app.on_inline_query() +async def inline_query_handler(_, query): + text = query.query.strip().lower() + answers = [] + if text.strip() == "": + try: + await app.answer_inline_query( + query.id, + results=answers, + switch_pm_text="ᴛʏᴘᴇ sᴏᴍᴇᴛʜɪɴɢ ᴛᴏ sᴇᴀʀᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ...", + 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}]({link}) + +⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`ᴍɪɴᴜᴛᴇs +👀 **ᴠɪᴇᴡs :** `{views}` +⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} +🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) + +💖 **sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}**""" + answers.append( + InlineQueryResultPhoto( + photo_url=thumbnail, + title=title, + thumb_url=thumbnail, + description=description, + caption=searched_text, + reply_markup=buttons, + ) + ) + try: + return await app.answer_inline_query(query.id, results=answers) + except: + return diff --git a/GJ516Music/Modules/leaveall.py b/GJ516Music/Modules/leaveall.py new file mode 100644 index 0000000..42b741f --- /dev/null +++ b/GJ516Music/Modules/leaveall.py @@ -0,0 +1,63 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from config import OWNER_ID +from GJ516Music import ASS_MENTION, SUNAME, app, app2 + + +@app.on_message(filters.command(["leaveall", "assleaveall"]) & filters.user(OWNER_ID)) +async def ass_leaveall(_, message: Message): + lear = await message.reply_text(f"» {ASS_MENTION} sᴛᴀʀᴛᴇᴅ ʟᴇᴀᴠɪɴɢ ᴄʜᴀᴛs...") + left = 0 + failed = 0 + chats = [] + async for dialog in app2.get_dialogs(): + chats.append(int(dialog.chat.id)) + schat = (await app.get_chat(SUNAME)).id + for i in chats: + if i in (-1001686672798, int(schat)): + continue + try: + await app2.leave_chat(int(i)) + left += 1 + except FloodWait as e: + flood_time = int(e.value) + if flood_time > 200: + continue + await asyncio.sleep(flood_time) + except Exception: + continue + failed += 1 + try: + await lear.edit_text( + f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + ) + except: + await message.reply_text( + f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + ) diff --git a/GJ516Music/Modules/pause.py b/GJ516Music/Modules/pause.py new file mode 100644 index 0000000..3014791 --- /dev/null +++ b/GJ516Music/Modules/pause.py @@ -0,0 +1,48 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import app, pytgcalls +from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_off + + +@app.on_message(filters.command(["pause"]) & filters.group) +@admin_check +async def pause_str(_, message: Message): + try: + await message.delete() + except: + pass + + if not await is_streaming(message.chat.id): + return await message.reply_text( + "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" + ) + + await pytgcalls.pause_stream(message.chat.id) + await stream_off(message.chat.id) + return await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py new file mode 100644 index 0000000..a5e2ec3 --- /dev/null +++ b/GJ516Music/Modules/ping.py @@ -0,0 +1,68 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import time +from datetime import datetime + +import psutil +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +import config +from FallenMusic import BOT_NAME, StartTime, app +from FallenMusic.Helpers import get_readable_time + + +@app.on_message(filters.command("ping")) +async def ping_fallen(_, message: Message): + hmm = await message.reply_photo( + photo=config.PING_IMG, caption=f"{BOT_NAME} ɪs ᴘɪɴɢɪɴɢ..." + ) + upt = int(time.time() - StartTime) + cpu = psutil.cpu_percent(interval=0.5) + mem = psutil.virtual_memory().percent + disk = psutil.disk_usage("/").percent + start = datetime.now() + resp = (datetime.now() - start).microseconds / 1000 + uptime = get_readable_time((upt)) + + await hmm.edit_text( + f"""➻ ᴩᴏɴɢ : `{resp}ᴍs` + +{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs : + +๏ **ᴜᴩᴛɪᴍᴇ :** {uptime} +๏ **ʀᴀᴍ :** {mem} +๏ **ᴄᴩᴜ :** {cpu} +๏ **ᴅɪsᴋ :** {disk}""", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("❄ sᴜᴘᴘᴏʀᴛ ❄", url=config.SUPPORT_CHAT), + InlineKeyboardButton( + "✨ sᴏᴜʀᴄᴇ ✨", + url="https://github.com/AnonymousX1025/FallenMusic", + ), + ], + ] + ), + ) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py new file mode 100644 index 0000000..0625855 --- /dev/null +++ b/GJ516Music/Modules/play.py @@ -0,0 +1,258 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import os + +from pyrogram import filters +from pyrogram.enums import ChatMemberStatus +from pyrogram.errors import ( + ChatAdminRequired, + UserAlreadyParticipant, + UserNotParticipant, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from pytgcalls import StreamType +from pytgcalls.exceptions import NoActiveGroupCall, TelegramServerError, UnMuteNeeded +from pytgcalls.types import AudioPiped, HighQualityAudio +from youtube_search import YoutubeSearch + +from config import DURATION_LIMIT +from GJ516Music import ( + ASS_ID, + ASS_MENTION, + ASS_NAME, + ASS_USERNAME, + BOT_NAME, + BOT_USERNAME, + LOGGER, + app, + app2, + GJ516db, + pytgcalls, +) +from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on +from GJ516Music.Helpers.downloaders import audio_dl +from GJ516Music.Helpers.errors import DurationLimitError +from GJ516Music.Helpers.gets import get_file_name, get_url +from GJ516Music.Helpers.inline import buttons +from GJ516Music.Helpers.queue import put +from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb + + +@app.on_message( + filters.command(["play", "vplay", "p"]) + & filters.group + & ~filters.forwarded + & ~filters.via_bot +) +async def play(_, message: Message): + GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + try: + await message.delete() + except: + pass + + try: + try: + get = await app.get_chat_member(message.chat.id, ASS_ID) + except ChatAdminRequired: + return await GJ516.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + if get.status == ChatMemberStatus.BANNED: + unban_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=f"ᴜɴʙᴀɴ {ASS_NAME}", + callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", + ), + ] + ] + ) + return await GJ516.edit_text( + text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", + reply_markup=unban_butt, + ) + except UserNotParticipant: + if message.chat.username: + invitelink = message.chat.username + try: + await app2.resolve_peer(invitelink) + except Exception as ex: + LOGGER.error(ex) + else: + try: + invitelink = await app.export_chat_invite_link(message.chat.id) + except ChatAdminRequired: + return await GJ516.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + except Exception as ex: + return await GJ516.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + if invitelink.startswith("https://t.me/+"): + invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") + anon = await GJ516.edit_text( + f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." + ) + try: + await app2.join_chat(invitelink) + await asyncio.sleep(2) + await GJ516.edit_text( + f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + ) + except UserAlreadyParticipant: + pass + except Exception as ex: + return await GJ516.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + try: + await app2.resolve_peer(invitelink) + except: + pass + + ruser = message.from_user.first_name + audio = ( + (message.reply_to_message.audio or message.reply_to_message.voice) + if message.reply_to_message + else None + ) + url = get_url(message) + if audio: + if round(audio.duration / 60) > DURATION_LIMIT: + raise DurationLimitError( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + + file_name = get_file_name(audio) + title = file_name + duration = round(audio.duration / 60) + file_path = ( + await message.reply_to_message.download(file_name) + if not os.path.isfile(os.path.join("downloads", file_name)) + else f"downloads/{file_name}" + ) + + elif url: + try: + results = YoutubeSearch(url, max_results=1).to_dict() + title = results[0]["title"] + duration = results[0]["duration"] + videoid = results[0]["id"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + return await GJ516.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") + + if (dur / 60) > DURATION_LIMIT: + return await GJ516.edit_text( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + else: + if len(message.command) < 2: + return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") + await GJ516.edit_text("🔎") + query = message.text.split(None, 1)[1] + try: + results = YoutubeSearch(query, max_results=1).to_dict() + url = f"https://youtube.com{results[0]['url_suffix']}" + title = results[0]["title"] + videoid = results[0]["id"] + duration = results[0]["duration"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + LOGGER.error(str(e)) + return await GJ516.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") + + if (dur / 60) > DURATION_LIMIT: + return await GJ516.edit( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + + try: + videoid = videoid + except: + videoid = "fuckitstgaudio" + if await is_active_chat(message.chat.id): + await put( + message.chat.id, + title, + duration, + videoid, + file_path, + ruser, + message.from_user.id, + ) + position = len(GJ516db.get(message.chat.id)) + qimg = await gen_qthumb(videoid, message.from_user.id) + await message.reply_photo( + photo=qimg, + caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + else: + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.join_group_call( + message.chat.id, + stream, + stream_type=StreamType().pulse_stream, + ) + + except NoActiveGroupCall: + return await GJ516.edit_text( + "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + ) + except TelegramServerError: + return await GJ516.edit_text( + "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." + ) + except UnMuteNeeded: + return await GJ516.edit_text( + f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." + ) + + imgt = await gen_thumb(videoid, message.from_user.id) + await stream_on(message.chat.id) + await add_active_chat(message.chat.id) + await message.reply_photo( + photo=imgt, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + + return await GJ516.delete() diff --git a/GJ516Music/Modules/resume.py b/GJ516Music/Modules/resume.py new file mode 100644 index 0000000..57ccb5a --- /dev/null +++ b/GJ516Music/Modules/resume.py @@ -0,0 +1,45 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from GJ516Music import app, pytgcalls +from GJ516Music.Helpers import admin_check, close_key, is_streaming, stream_on + + +@app.on_message(filters.command(["resume"]) & filters.group) +@admin_check +async def res_str(_, message: Message): + try: + await message.delete() + except: + pass + + if await is_streaming(message.chat.id): + return await message.reply_text("ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?") + await stream_on(message.chat.id) + await pytgcalls.resume_stream(message.chat.id) + return await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516Music/Modules/search.py b/GJ516Music/Modules/search.py new file mode 100644 index 0000000..ea3ec2c --- /dev/null +++ b/GJ516Music/Modules/search.py @@ -0,0 +1,67 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtube_search import YoutubeSearch + +from GJ516Music import app + + +@app.on_message(filters.command(["search"])) +async def ytsearch(_, message: Message): + try: + await message.delete() + except: + pass + try: + if len(message.command) < 2: + return await message.reply_text("» ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴀʀᴄʜ ʙᴀʙʏ !") + query = message.text.split(None, 1)[1] + m = await message.reply_text("🔎") + results = YoutubeSearch(query, max_results=4).to_dict() + i = 0 + text = "" + while i < 4: + text += f"✨ ᴛɪᴛʟᴇ : {results[i]['title']}\n" + text += f"⏱ ᴅᴜʀᴀᴛɪᴏɴ : `{results[i]['duration']}`\n" + text += f"👀 ᴠɪᴇᴡs : `{results[i]['views']}`\n" + text += f"📣 ᴄʜᴀɴɴᴇʟ : {results[i]['channel']}\n" + text += f"🔗 ʟɪɴᴋ : https://youtube.com{results[i]['url_suffix']}\n\n" + i += 1 + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟᴏsᴇ", + callback_data=f"forceclose abc|{message.from_user.id}", + ), + ] + ] + ) + await m.edit_text( + text=text, + reply_markup=key, + disable_web_page_preview=True, + ) + except Exception as e: + await message.reply_text(str(e)) diff --git a/GJ516Music/Modules/skip.py b/GJ516Music/Modules/skip.py new file mode 100644 index 0000000..a3779c2 --- /dev/null +++ b/GJ516Music/Modules/skip.py @@ -0,0 +1,77 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message +from pytgcalls.types import AudioPiped, HighQualityAudio + +from GJ516Music import BOT_USERNAME, app, GJ516db, pytgcalls +from GJ516Music.Helpers import _clear_, admin_check, buttons, close_key, gen_thumb + + +@app.on_message(filters.command(["skip", "next"]) & filters.group) +@admin_check +async def skip_str(_, message: Message): + try: + await message.delete() + except: + pass + get = GJ516db.get(message.chat.id) + if not get: + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + reply_markup=close_key, + ) + except: + return + else: + title = get[0]["title"] + duration = get[0]["duration"] + file_path = get[0]["file_path"] + videoid = get[0]["videoid"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.change_stream( + message.chat.id, + stream, + ) + except: + await _clear_(message.chat.id) + return await pytgcalls.leave_group_call(message.chat.id) + + await message.reply_text( + text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) + img = await gen_thumb(videoid, user_id) + return await message.reply_photo( + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) diff --git a/GJ516Music/Modules/song.py b/GJ516Music/Modules/song.py new file mode 100644 index 0000000..e8d921a --- /dev/null +++ b/GJ516Music/Modules/song.py @@ -0,0 +1,119 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os + +import requests +import yt_dlp +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtube_search import YoutubeSearch + +from GJ516Music import BOT_MENTION, BOT_USERNAME, LOGGER, app + + +@app.on_message(filters.command(["song", "vsong", "video", "music"])) +async def song(_, message: Message): + try: + await message.delete() + except: + pass + m = await message.reply_text("🔎") + + query = "".join(" " + str(i) for i in message.command[1:]) + ydl_opts = {"format": "bestaudio[ext=m4a]"} + try: + results = YoutubeSearch(query, max_results=5).to_dict() + link = f"https://youtube.com{results[0]['url_suffix']}" + title = results[0]["title"][:40] + thumbnail = results[0]["thumbnails"][0] + thumb_name = f"thumb{title}.jpg" + thumb = requests.get(thumbnail, allow_redirects=True) + open(thumb_name, "wb").write(thumb.content) + duration = results[0]["duration"] + + except Exception as ex: + LOGGER.error(ex) + return await m.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴛ-ᴅʟ.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + + await m.edit_text("» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢ,\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + try: + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + info_dict = ydl.extract_info(link, download=False) + audio_file = ydl.prepare_filename(info_dict) + ydl.process_info(info_dict) + rep = f"☁️ **ᴛɪᴛʟᴇ :** [{title[:23]}]({link})\n⏱️ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`\n🥀 **ᴜᴘʟᴏᴀᴅᴇᴅ ʙʏ :** {BOT_MENTION}" + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + try: + visit_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʏᴏᴜᴛᴜʙᴇ", + url=link, + ) + ] + ] + ) + await app.send_audio( + chat_id=message.from_user.id, + audio=audio_file, + caption=rep, + thumb=thumb_name, + title=title, + duration=dur, + reply_markup=visit_butt, + ) + if message.chat.type != ChatType.PRIVATE: + await message.reply_text( + "ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, sᴇɴᴛ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴛʜᴇʀᴇ." + ) + except: + start_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟɪᴄᴋ ʜᴇʀᴇ", + url=f"https://t.me/{BOT_USERNAME}?start", + ) + ] + ] + ) + return await m.edit_text( + text="ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴀɴᴅ sᴛᴀʀᴛ ᴍᴇ ғᴏʀ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢs.", + reply_markup=start_butt, + ) + await m.delete() + except: + return await m.edit_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴜᴘʟᴏᴀᴅ ᴀᴜᴅɪᴏ ᴏɴ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀs.") + + try: + os.remove(audio_file) + os.remove(thumb_name) + except Exception as ex: + LOGGER.error(ex) diff --git a/GJ516Music/Modules/speedtest.py b/GJ516Music/Modules/speedtest.py new file mode 100644 index 0000000..ebc7e23 --- /dev/null +++ b/GJ516Music/Modules/speedtest.py @@ -0,0 +1,67 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio + +import speedtest +from pyrogram import filters + +from GJ516Music import SUDOERS, app + + +def testspeed(m): + try: + test = speedtest.Speedtest() + test.get_best_server() + m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + test.download() + m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + test.upload() + test.results.share() + result = test.results.dict() + m = m.edit("**↻ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs...**") + except Exception as e: + return m.edit(e) + return result + + +@app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) +async def speedtest_function(_, message): + m = await message.reply_text("**» ʀᴜɴɴɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ...**") + loop = asyncio.get_event_loop() + result = await loop.run_in_executor(None, testspeed, m) + output = f"""✯ **sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs** ✯ + +**❥͜͡ᴄʟɪᴇɴᴛ :** +**» __ɪsᴩ :__** {result['client']['isp']} +**» __ᴄᴏᴜɴᴛʀʏ :__** {result['client']['country']} + +**❥͜͡sᴇʀᴠᴇʀ :** +**» __ɴᴀᴍᴇ :__** {result['server']['name']} +**» __ᴄᴏᴜɴᴛʀʏ :__** {result['server']['country']}, {result['server']['cc']} +**» __sᴩᴏɴsᴏʀ :__** {result['server']['sponsor']} +**» __ʟᴀᴛᴇɴᴄʏ :__** {result['server']['latency']} +**» __ᴩɪɴɢ :__** {result['ping']}""" + msg = await app.send_photo( + chat_id=message.chat.id, photo=result["share"], caption=output + ) + await m.delete() diff --git a/GJ516Music/Modules/start.py b/GJ516Music/Modules/start.py new file mode 100644 index 0000000..b0f26dd --- /dev/null +++ b/GJ516Music/Modules/start.py @@ -0,0 +1,103 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.enums import ChatType, ParseMode +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from youtubesearchpython.__future__ import VideosSearch + +import config +from GJ516Music import BOT_MENTION, BOT_NAME, app +from GJ516Music.Helpers import gp_buttons, pm_buttons +from GJ516Music.Helpers.dossier import * + + +@app.on_message(filters.command(["start"]) & ~filters.forwarded) +@app.on_edited_message(filters.command(["start"]) & ~filters.forwarded) +async def GJ516_st(_, message: Message): + if message.chat.type == ChatType.PRIVATE: + if len(message.text.split()) > 1: + cmd = message.text.split(None, 1)[1] + if cmd[0:3] == "inf": + m = await message.reply_text("🔎") + query = (str(cmd)).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 = f""" +➻ **ᴛʀᴀᴄᴋ ɪɴғᴏʀɴᴀᴛɪᴏɴ** + +📌 **ᴛɪᴛʟᴇ :** {title} + +⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** {duration} ᴍɪɴᴜᴛᴇs +👀 **ᴠɪᴇᴡs :** `{views}` +⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} +🔗 **ʟɪɴᴋ :** [ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ]({link}) +🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) + +💖 sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}""" + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ʏᴏᴜᴛᴜʙᴇ", url=link), + InlineKeyboardButton( + text="sᴜᴩᴩᴏʀᴛ", url=config.SUPPORT_CHAT + ), + ], + ] + ) + await m.delete() + return await app.send_photo( + message.chat.id, + photo=thumbnail, + caption=searched_text, + parse_mode=ParseMode.MARKDOWN, + reply_markup=key, + ) + else: + await message.reply_photo( + photo=config.START_IMG, + caption=PM_START_TEXT.format( + message.from_user.first_name, + BOT_MENTION, + ), + reply_markup=InlineKeyboardMarkup(pm_buttons), + ) + else: + await message.reply_photo( + photo=config.START_IMG, + caption=START_TEXT.format( + message.from_user.first_name, + BOT_MENTION, + message.chat.title, + config.SUPPORT_CHAT, + ), + reply_markup=InlineKeyboardMarkup(gp_buttons), + ) diff --git a/GJ516Music/Modules/stop.py b/GJ516Music/Modules/stop.py new file mode 100644 index 0000000..a2502cb --- /dev/null +++ b/GJ516Music/Modules/stop.py @@ -0,0 +1,46 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from FallenMusic import app, pytgcalls +from FallenMusic.Helpers import _clear_, admin_check, close_key + + +@app.on_message(filters.command(["stop", "end"]) & filters.group) +@admin_check +async def stop_str(_, message: Message): + try: + await message.delete() + except: + pass + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + + return await message.reply_text( + text=f"➻ **sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ** ❄\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + reply_markup=close_key, + ) diff --git a/GJ516Music/Modules/sudoers.py b/GJ516Music/Modules/sudoers.py new file mode 100644 index 0000000..708e91f --- /dev/null +++ b/GJ516Music/Modules/sudoers.py @@ -0,0 +1,132 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message + +from config import OWNER_ID +from FallenMusic import SUDOERS, app + + +@app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) +async def sudoadd(_, message: Message): + try: + await message.delete() + except: + pass + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + ) + user = message.text.split(None, 1)[1] + if "@" in user: + user = user.replace("@", "") + user = await app.get_users(user) + if int(user.id) in SUDOERS: + return await message.reply_text(f"» {user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ.") + try: + SUDOERS.add(int(user.id)) + await message.reply_text(f"ᴀᴅᴅᴇᴅ {user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ.") + except: + return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + + if message.reply_to_message.from_user.id in SUDOERS: + return await message.reply_text( + f"» {message.reply_to_message.from_user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ." + ) + try: + SUDOERS.add(message.reply_to_message.from_user.id) + await message.reply_text( + f"ᴀᴅᴅᴇᴅ {message.reply_to_message.from_user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + + +@app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) +async def sudodel(_, message: Message): + try: + await message.delete() + except: + pass + if not message.reply_to_message: + if len(message.command) != 2: + return await message.reply_text( + "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + ) + user = message.text.split(None, 1)[1] + if "@" in user: + user = user.replace("@", "") + user = await app.get_users(user) + if int(user.id) not in SUDOERS: + return await message.reply_text( + f"» {user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + try: + SUDOERS.remove(int(user.id)) + return await message.reply_text( + f"» ʀᴇᴍᴏᴠᴇᴅ {user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + else: + user_id = message.reply_to_message.from_user.id + if int(user_id) not in SUDOERS: + return await message.reply_text( + f"» {message.reply_to_message.from_user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + try: + SUDOERS.remove(int(user_id)) + return await message.reply_text( + f"» ʀᴇᴍᴏᴠᴇᴅ {message.reply_to_message.from_user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + ) + except: + return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + + +@app.on_message(filters.command(["sudolist", "sudoers", "sudo"])) +async def sudoers_list(_, message: Message): + hehe = await message.reply_text("» ɢᴇᴛᴛɪɴɢ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ...") + text = "🥀 **ᴏᴡɴᴇʀ :**\n" + count = 0 + user = await app.get_users(OWNER_ID) + user = user.first_name if not user.mention else user.mention + count += 1 + text += f"{count}➤ {user}\n" + 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 += "\n✨ **sᴜᴅᴏᴇʀs :**\n" + count += 1 + text += f"{count}➤ {user}\n" + except Exception: + continue + if not text: + await message.reply_text("» ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ.") + else: + await hehe.edit_text(text) diff --git a/GJ516Music/Modules/sysstats.py b/GJ516Music/Modules/sysstats.py new file mode 100644 index 0000000..c71c194 --- /dev/null +++ b/GJ516Music/Modules/sysstats.py @@ -0,0 +1,115 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import platform +import re +import socket +import uuid +from sys import version as pyver + +import psutil +from pyrogram import __version__ as pyrover +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from pytgcalls.__version__ import __version__ as pytgver + +from GJ516Music import BOT_NAME, SUDOERS, app +from GJ516Music.Modules import ALL_MODULES + + +@app.on_message(filters.command(["stats", "sysstats"]) & SUDOERS) +async def sys_stats(_, message: Message): + sysrep = await message.reply_text( + f"ɢᴇᴛᴛɪɴɢ {BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs, ɪᴛ'ʟʟ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ..." + ) + try: + await message.delete() + except: + pass + sudoers = len(SUDOERS) + mod = len(ALL_MODULES) + hostname = socket.gethostname() + ip_address = socket.gethostbyname(socket.gethostname()) + architecture = platform.machine() + processor = platform.processor() + mac_address = ":".join(re.findall("..", "%012x" % uuid.getnode())) + sp = platform.system() + ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " ɢʙ" + p_core = psutil.cpu_count(logical=False) + t_core = psutil.cpu_count(logical=True) + 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) + total = str(total) + used = hdd.used / (1024.0**3) + used = str(used) + free = hdd.free / (1024.0**3) + free = str(free) + platform_release = platform.release() + platform_version = platform.version() + + await sysrep.edit_text( + f""" +➻ **{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs** + +**ᴩʏᴛʜᴏɴ :** {pyver.split()[0]} +**ᴩʏʀᴏɢʀᴀᴍ :** {pyrover} +**ᴩʏ-ᴛɢᴄᴀʟʟs :** {pytgver} +**sᴜᴅᴏᴇʀs :** `{sudoers}` +**ᴍᴏᴅᴜʟᴇs :** `{mod}` + +**ɪᴘ :** {ip_address} +**ᴍᴀᴄ :** {mac_address} +**ʜᴏsᴛɴᴀᴍᴇ :** {hostname} +**ᴘʟᴀᴛғᴏʀᴍ :** {sp} +**ᴘʀᴏᴄᴇssᴏʀ :** {processor} +**ᴀʀᴄʜɪᴛᴇᴄᴛᴜʀᴇ :** {architecture} +**ᴘʟᴀᴛғᴏʀᴍ ʀᴇʟᴇᴀsᴇ :** {platform_release} +**ᴘʟᴀᴛғᴏʀᴍ ᴠᴇʀsɪᴏɴ :** {platform_version} + + sᴛᴏʀᴀɢᴇ +**ᴀᴠᴀɪʟᴀʙʟᴇ :** {total[:4]} ɢɪʙ +**ᴜsᴇᴅ :** {used[:4]} ɢɪʙ +**ғʀᴇᴇ :** {free[:4]} ɢɪʙ + +**ʀᴀᴍ :** {ram} +**ᴩʜʏsɪᴄᴀʟ ᴄᴏʀᴇs :** {p_core} +**ᴛᴏᴛᴀʟ ᴄᴏʀᴇs :** {t_core} +**ᴄᴩᴜ ғʀᴇǫᴜᴇɴᴄʏ :** {cpu_freq}""", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴄʟᴏsᴇ", + callback_data=f"forceclose abc|{message.from_user.id}", + ), + ] + ] + ), + ) diff --git a/GJ516Music/Modules/variables.py b/GJ516Music/Modules/variables.py new file mode 100644 index 0000000..fcf69cc --- /dev/null +++ b/GJ516Music/Modules/variables.py @@ -0,0 +1,61 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import Message + +import config +from GJ516Music import BOT_NAME, app + + +@app.on_message( + filters.command(["config", "variables"]) & filters.user(config.OWNER_ID) +) +async def get_vars(_, message: Message): + try: + await app.send_message( + chat_id=int(config.OWNER_ID), + text=f"""**{BOT_NAME} ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs :** + +**ᴀᴘɪ_ɪᴅ :** `{config.API_ID}` +**ᴀᴘɪ_ʜᴀsʜ :** `{config.API_HASH}` + +**ʙᴏᴛ_ᴛᴏᴋᴇɴ :** `{config.BOT_TOKEN}` +**ᴅᴜʀᴀᴛɪᴏɴ_ʟɪᴍɪᴛ :** `{config.DURATION_LIMIT}` + +**ᴏᴡɴᴇʀ_ɪᴅ :** `{config.OWNER_ID}` +**sᴜᴅᴏ_ᴜsᴇʀs :** `{config.SUDO_USERS}` + +**ᴘɪɴɢ_ɪᴍɢ :** `{config.PING_IMG}` +**sᴛᴀʀᴛ_ɪᴍɢ :** `{config.START_IMG}` +**sᴜᴘᴘᴏʀᴛ_ᴄʜᴀᴛ :** `{config.SUPPORT_CHAT}` + +**sᴇssɪᴏɴ :** `{config.SESSION}`""", + disable_web_page_preview=True, + ) + except: + return await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ sᴇɴᴅ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs.") + if message.chat.type != ChatType.PRIVATE: + await message.reply_text( + "» ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, ɪ'ᴠᴇ sᴇɴᴛ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs ᴛʜᴇʀᴇ." + ) diff --git a/GJ516Music/Modules/watcher.py b/GJ516Music/Modules/watcher.py new file mode 100644 index 0000000..90bbefb --- /dev/null +++ b/GJ516Music/Modules/watcher.py @@ -0,0 +1,110 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram import filters +from pyrogram.types import Message +from pytgcalls.types import AudioPiped, HighQualityAudio, Update + +from GJ516Music import BOT_ID, BOT_USERNAME, app, app2, GJ516db, pytgcalls +from GJ516Music.Helpers import _clear_, buttons, gen_thumb + +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): + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + + +@app.on_message(filters.left_chat_member) +async def ub_leave(_, message: Message): + if message.left_chat_member.id == BOT_ID: + try: + await _clear_(message.chat.id) + await pytgcalls.leave_group_call(message.chat.id) + except: + pass + try: + await app2.leave_chat(message.chat.id) + except: + pass + + +@pytgcalls.on_left() +@pytgcalls.on_kicked() +@pytgcalls.on_closed_voice_chat() +async def swr_handler(_, chat_id: int): + try: + await _clear_(chat_id) + except: + pass + + +@pytgcalls.on_stream_end() +async def on_stream_end(pytgcalls, update: Update): + chat_id = update.chat_id + + get = GJ516db.get(chat_id) + if not get: + try: + await _clear_(chat_id) + return await pytgcalls.leave_group_call(chat_id) + except: + return + else: + process = await app.send_message( + chat_id=chat_id, + text="» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ᴏ̨ᴜᴇᴜᴇ...", + ) + title = get[0]["title"] + duration = get[0]["duration"] + file_path = get[0]["file_path"] + videoid = get[0]["videoid"] + req_by = get[0]["req"] + user_id = get[0]["user_id"] + get.pop(0) + + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + + try: + await pytgcalls.change_stream( + chat_id, + stream, + ) + except: + await _clear_(chat_id) + return await pytgcalls.leave_group_call(chat_id) + + img = await gen_thumb(videoid, user_id) + await process.delete() + await app.send_photo( + chat_id=chat_id, + photo=img, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + reply_markup=buttons, + ) From 81983a58933838f192f025b43c72654e7712eef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 09:46:20 +0530 Subject: [PATCH 025/211] Add files via upload --- GJ516Music/__init__.py | 118 +++++++++++++++++++++++++++++++++++++++++ GJ516Music/__main__.py | 92 ++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 GJ516Music/__init__.py create mode 100644 GJ516Music/__main__.py diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py new file mode 100644 index 0000000..a67ccc8 --- /dev/null +++ b/GJ516Music/__init__.py @@ -0,0 +1,118 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import logging +import os +import time + +from pyrogram import Client, filters +from pytgcalls import PyTgCalls + +import config + +StartTime = time.time() + +logging.basicConfig( + format="[%(asctime)s - %(levelname)s] - %(name)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[logging.FileHandler("GJ516logs.txt"), logging.StreamHandler()], + level=logging.INFO, +) +logging.getLogger("pyrogram").setLevel(logging.ERROR) +logging.getLogger("pytgcalls").setLevel(logging.ERROR) +LOGGER = logging.getLogger("GJ516Music") + +app = Client( + "GJ516Music", + config.API_ID, + config.API_HASH, + bot_token=config.BOT_TOKEN, +) + +app2 = Client( + "GJ516Ass", + api_id=config.API_ID, + api_hash=config.API_HASH, + session_string=str(config.SESSION), +) + +pytgcalls = PyTgCalls(app2) + +SUDOERS = filters.user() +SUNAME = config.SUPPORT_CHAT.split("me/")[1] + + +async def GJ516_startup(): + os.system("clear") + LOGGER.info( + "\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2523\u2605\x20\x46\x41\x4c\x4c\x45\x4e\x20\x4d\x55\x53\x49\x43\x20\x42\x4f\x54\x20\u2605\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b" + ) + global BOT_ID, BOT_NAME, BOT_USERNAME, BOT_MENTION, GJ516db + global ASS_ID, ASS_NAME, ASS_USERNAME, ASS_MENTION, SUDOERS + + await app.start() + LOGGER.info( + "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x42\x6f\x74\x2e\x2e\x2e" + ) + + getme = await app.get_me() + BOT_ID = getme.id + BOT_NAME = getme.first_name + BOT_USERNAME = getme.username + BOT_MENTION = getme.mention + + await app2.start() + LOGGER.info( + "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x41\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x2e\x2e" + ) + + getme2 = await app2.get_me() + ASS_ID = getme2.id + ASS_NAME = getme2.first_name + " " + (getme2.last_name or "") + ASS_USERNAME = getme2.username + ASS_MENTION = getme2.mention + try: + await app2.join_chat("DevilsHeavenMF") + await app2.join_chat("GJ516Association") + except: + pass + + ANON = "\x31\x33\x35\x36\x34\x36\x39\x30\x37\x35" + for SUDOER in config.SUDO_USERS: + SUDOERS.add(SUDOER) + if config.OWNER_ID not in config.SUDO_USERS: + SUDOERS.add(config.OWNER_ID) + elif int(ANON) not in config.SUDO_USERS: + SUDOERS.add(int(ANON)) + + GJ516db = {} + LOGGER.info( + "[•] \x4c\x6f\x63\x61\x6c\x20\x44\x61\x74\x61\x62\x61\x73\x65\x20\x49\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x64\x2e\x2e\x2e" + ) + + LOGGER.info( + "[•] \x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x43\x6c\x69\x65\x6e\x74\x73\x20\x42\x6f\x6f\x74\x65\x64\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x2e" + ) + + +asyncio.get_event_loop().run_until_complete(GJ516_startup()) diff --git a/GJ516Music/__main__.py b/GJ516Music/__main__.py new file mode 100644 index 0000000..71b587f --- /dev/null +++ b/GJ516Music/__main__.py @@ -0,0 +1,92 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import importlib +import os + +from pyrogram import idle + +from GJ516Music import ( + ASS_ID, + ASS_NAME, + ASS_USERNAME, + BOT_ID, + BOT_NAME, + BOT_USERNAME, + LOGGER, + SUNAME, + app, + app2, + pytgcalls, +) +from GJ516Music.Modules import ALL_MODULES + + +async def GJ516_startup(): + LOGGER.info("[•] Loading Modules...") + for module in ALL_MODULES: + importlib.import_module("GJ516Music.Modules." + module) + LOGGER.info(f"[•] Loaded {len(ALL_MODULES)} Modules.") + + LOGGER.info("[•] Refreshing Directories...") + if "downloads" not in os.listdir(): + os.mkdir("downloads") + if "cache" not in os.listdir(): + os.mkdir("cache") + LOGGER.info("[•] Directories Refreshed.") + + try: + await app.send_message( + SUNAME, + f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ʙᴏᴛ ✯\n\n𖢵 ɪᴅ : `{BOT_ID}`\n𖢵 ɴᴀᴍᴇ : {BOT_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{BOT_USERNAME}", + ) + except: + LOGGER.error( + f"{BOT_NAME} failed to send message at @{SUNAME}, please go & check." + ) + + try: + await app2.send_message( + SUNAME, + f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ᴀss ✯\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}", + ) + except: + LOGGER.error( + f"{ASS_NAME} failed to send message at @{SUNAME}, please go & check." + ) + + await app2.send_message(BOT_USERNAME, "/start") + + LOGGER.info(f"[•] Bot Started As {BOT_NAME}.") + LOGGER.info(f"[•] Assistant Started As {ASS_NAME}.") + + LOGGER.info( + "[•] \x53\x74\x61\x72\x74\x69\x6e\x67\x20\x50\x79\x54\x67\x43\x61\x6c\x6c\x73\x20\x43\x6c\x69\x65\x6e\x74\x2e\x2e\x2e" + ) + await pytgcalls.start() + await idle() + + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(GJ516_startup()) + LOGGER.error("GJ516 Music Bot Stopped.") From 3d06fb47db5c140bbeb124c07c7bac56e9b74ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:42:05 +0530 Subject: [PATCH 026/211] Update sample.env --- sample.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample.env b/sample.env index 75d9351..37f4b9e 100644 --- a/sample.env +++ b/sample.env @@ -1,5 +1,5 @@ API_ID= API_HASH= BOT_TOKEN= -OWNER_ID=1356469075 +OWNER_ID=1864894033 SESSION= From ec101d5097f65705c6343527628b5c67866771e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:42:23 +0530 Subject: [PATCH 027/211] Update GJ516 --- GJ516 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516 b/GJ516 index 2c13872..68f26ef 100644 --- a/GJ516 +++ b/GJ516 @@ -1 +1 @@ -python3 -m FallenMusic +python3 -m GJ516Music From 0e32c59d0f0679261fa91756270e682c93121047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:43:06 +0530 Subject: [PATCH 028/211] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b0f9914..ada64fb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 AnonymousX1025 +Copyright (c) 2023 MrProgrammer72 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 044b4af586049d4d7f61345bd39bfe0a70ed9362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:43:35 +0530 Subject: [PATCH 029/211] Update Procfile --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index add4b35..bf3277b 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -worker: bash fallen +worker: bash GJ516 From 844461de34fe219cae2f2bb4f9f77c42fc149604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:47:11 +0530 Subject: [PATCH 030/211] Update app.json --- app.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app.json b/app.json index a088b89..c879c8e 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,7 @@ { - "name": "ғᴀʟʟᴇɴ ダ ᴍᴜsɪᴄ", + "name": "GJ516 MUSIC", "description": "A VC Player Bot for telegram videochats, written in Python with Pyrogram and Py-Tgcalls.", - "logo": "https://te.legra.ph/file/6f99c49bdb4679acad717.jpg", + "logo": "https://telegra.ph/file/db8765da6945e3c9333e6.jpg", "keywords": [ "python3", "telegram", @@ -28,11 +28,11 @@ }, "OWNER_ID": { "description": "Fill your user id here. (Must be integer)", - "value": "1356469075", + "value": "1864894033", "required": true }, "SESSION": { - "description": "A pyrogram v2 string session from @StringFatherBot", + "description": "A pyrogram v2 string sessioN", "value": "", "required": true }, @@ -43,7 +43,7 @@ }, "SUPPORT_CHAT": { "description": "Link of your telegram support group. (Must pe public)", - "value": "https://t.me/DevilsHeavenMF", + "value": "https://t.me/GJ516_DISCUSS_GROUP", "required": false } }, From a65348648222b80ded431d61287363d66baa636d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:48:21 +0530 Subject: [PATCH 031/211] Update heroku.yml --- heroku.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/heroku.yml b/heroku.yml index 828f557..415f714 100644 --- a/heroku.yml +++ b/heroku.yml @@ -2,4 +2,4 @@ build: docker: worker: Dockerfile run: - worker: bash fallen + worker: bash GJ516 From e7abf476bf181cb119bdc067c3dc81024ab5ea6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:49:48 +0530 Subject: [PATCH 032/211] Update config.py --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 1bb6609..8a37834 100644 --- a/config.py +++ b/config.py @@ -18,8 +18,8 @@ SESSION = getenv("SESSION", None) -SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/DevilsHeavenMF") -SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/FallenAssociation") +SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/GJ516_DISCUSS_GROUP") +SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/GJ516_DISCUSS_GROUP") SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1356469075").split())) From 7c02707576e4a3d8f10774d6f71cea14b788862c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:50:11 +0530 Subject: [PATCH 033/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 8a37834..94168b6 100644 --- a/config.py +++ b/config.py @@ -21,7 +21,7 @@ SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/GJ516_DISCUSS_GROUP") SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/GJ516_DISCUSS_GROUP") -SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1356469075").split())) +SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1864894033").split())) FAILED = "https://te.legra.ph/file/4c896584b592593c00aa8.jpg" From 7e9b162aaa42ed46efae0fec5edba6a54912d478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:52:59 +0530 Subject: [PATCH 034/211] Update config.py --- config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.py b/config.py index 94168b6..81eb4c2 100644 --- a/config.py +++ b/config.py @@ -13,8 +13,8 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/6f99c49bdb4679acad717.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/f8ba75bdbb9931cbc8229.jpg") +PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/b534dd5a456247f5e57ab.jpg") +START_IMG = getenv("START_IMG", "https://telegra.ph/file/9a42a0c6c293f021f5445.jpg") SESSION = getenv("SESSION", None) @@ -24,4 +24,4 @@ SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1864894033").split())) -FAILED = "https://te.legra.ph/file/4c896584b592593c00aa8.jpg" +FAILED = "https://telegra.ph/file/db8765da6945e3c9333e6.jpg" From dbb1b6e5cc5dee8c805a82d38435a3bc66abd83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:56:06 +0530 Subject: [PATCH 035/211] Update Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 0987805..0f90d29 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,4 +10,4 @@ WORKDIR /app/ RUN pip3 install --no-cache-dir --upgrade --requirement requirements.txt -CMD bash fallen +CMD bash GJ516 From 42062fdf8d58d67b1647201b59ad419ff6760a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:15:33 +0530 Subject: [PATCH 036/211] Update README.md --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index ae22363..507bf02 100644 --- a/.github/README.md +++ b/.github/README.md @@ -59,7 +59,7 @@ ## ᴅᴇᴘʟᴏʏ ᴛᴏ ʜᴇʀᴏᴋᴜ 🚀 -

+

The easiest way to host this bot, Deploy on Heroku, Change the app country to Europe (it will help to make the bot more stable). From 857d58df293ed9df969c0e695279d6e65a1e8323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:17:37 +0530 Subject: [PATCH 037/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 81eb4c2..f355bc5 100644 --- a/config.py +++ b/config.py @@ -19,7 +19,7 @@ SESSION = getenv("SESSION", None) SUPPORT_CHAT = getenv("SUPPORT_CHAT", "https://t.me/GJ516_DISCUSS_GROUP") -SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/GJ516_DISCUSS_GROUP") +SUPPORT_CHANNEL = getenv("SUPPORT_CHANNEL", "https://t.me/myworldGJ516") SUDO_USERS = list(map(int, getenv("SUDO_USERS", "1864894033").split())) From 0a68a85c80d1ec31a39d72384dfb5a7b2370234c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:26:12 +0530 Subject: [PATCH 038/211] Update __main__.py --- GJ516Music/__main__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GJ516Music/__main__.py b/GJ516Music/__main__.py index 71b587f..2f815e8 100644 --- a/GJ516Music/__main__.py +++ b/GJ516Music/__main__.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -58,7 +58,7 @@ async def GJ516_startup(): try: await app.send_message( SUNAME, - f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ʙᴏᴛ ✯\n\n𖢵 ɪᴅ : `{BOT_ID}`\n𖢵 ɴᴀᴍᴇ : {BOT_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{BOT_USERNAME}", + f"❇ 𝗚𝗝𝟱𝟭𝟲 𝗠𝗨𝗦𝗜𝗖 𝗕𝗢𝗧 ❇\n\n⎋ 𝙄𝙙 : `{BOT_ID}`\n⎋ 𝙉𝙖𝙢𝙚 : {BOT_NAME}\n⎋ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{BOT_USERNAME}", ) except: LOGGER.error( @@ -68,7 +68,7 @@ async def GJ516_startup(): try: await app2.send_message( SUNAME, - f"✯ ғᴀʟʟᴇɴ ᴍᴜsɪᴄ ᴀss ✯\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_NAME}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}", + f"✯ 𝗚𝗝𝟱𝟭𝟲 𝗠𝗨𝗦𝗜𝗖 𝗔𝗦𝗦 ✯\n\n⎋ 𝙄𝙙 : `{ASS_ID}`\n⎋ 𝙉𝙖𝙢𝙚 : {ASS_NAME}\n⎋ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}", ) except: LOGGER.error( @@ -77,8 +77,8 @@ async def GJ516_startup(): await app2.send_message(BOT_USERNAME, "/start") - LOGGER.info(f"[•] Bot Started As {BOT_NAME}.") - LOGGER.info(f"[•] Assistant Started As {ASS_NAME}.") + LOGGER.info(f"[•] Jay Bot Started As {BOT_NAME}.") + LOGGER.info(f"[•] Jay Assistant Started As {ASS_NAME}.") LOGGER.info( "[•] \x53\x74\x61\x72\x74\x69\x6e\x67\x20\x50\x79\x54\x67\x43\x61\x6c\x6c\x73\x20\x43\x6c\x69\x65\x6e\x74\x2e\x2e\x2e" From fc3c3c5c99f0a99603760b04b290fac115c18417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:26:57 +0530 Subject: [PATCH 039/211] Update __main__.py --- GJ516Music/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/__main__.py b/GJ516Music/__main__.py index 2f815e8..93d8fd2 100644 --- a/GJ516Music/__main__.py +++ b/GJ516Music/__main__.py @@ -68,7 +68,7 @@ async def GJ516_startup(): try: await app2.send_message( SUNAME, - f"✯ 𝗚𝗝𝟱𝟭𝟲 𝗠𝗨𝗦𝗜𝗖 𝗔𝗦𝗦 ✯\n\n⎋ 𝙄𝙙 : `{ASS_ID}`\n⎋ 𝙉𝙖𝙢𝙚 : {ASS_NAME}\n⎋ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}", + f"❇ 𝗚𝗝𝟱𝟭𝟲 𝗠𝗨𝗦𝗜𝗖 𝗔𝗦𝗦 ❇\n\n⎋ 𝙄𝙙 : `{ASS_ID}`\n⎋ 𝙉𝙖𝙢𝙚 : {ASS_NAME}\n⎋ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}", ) except: LOGGER.error( From 89be441aecb8fe21b861d01927414dc85f5af9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:28:18 +0530 Subject: [PATCH 040/211] Update __init__.py --- GJ516Music/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py index a67ccc8..60b2c28 100644 --- a/GJ516Music/__init__.py +++ b/GJ516Music/__init__.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 242da6784f9ca1296dc9d06aca82b5249b8536ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:28:49 +0530 Subject: [PATCH 041/211] Update __init__.py --- GJ516Music/Helpers/utils/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/utils/__init__.py b/GJ516Music/Helpers/utils/__init__.py index f5b3c9b..cc50aa5 100644 --- a/GJ516Music/Helpers/utils/__init__.py +++ b/GJ516Music/Helpers/utils/__init__.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 82476f9fc53c27ec6746ab1d969f68c93c0e7b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:29:11 +0530 Subject: [PATCH 042/211] Update __init__.py --- GJ516Music/Helpers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/__init__.py b/GJ516Music/Helpers/__init__.py index 8c9a8e2..df41afd 100644 --- a/GJ516Music/Helpers/__init__.py +++ b/GJ516Music/Helpers/__init__.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 9237199a4a42fb911b2cc5491549557b631f3f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:30:19 +0530 Subject: [PATCH 043/211] Update active.py --- GJ516Music/Helpers/active.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/active.py b/GJ516Music/Helpers/active.py index 724c23c..c552aee 100644 --- a/GJ516Music/Helpers/active.py +++ b/GJ516Music/Helpers/active.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 8dc0ae8b793d1c238500e59610e9f82f27f28471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:30:47 +0530 Subject: [PATCH 044/211] Update admins.py --- GJ516Music/Helpers/admins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/admins.py b/GJ516Music/Helpers/admins.py index 57d15ec..502ec56 100644 --- a/GJ516Music/Helpers/admins.py +++ b/GJ516Music/Helpers/admins.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 5dbacc037be3cbabc3e622628934088b25a82de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:39:55 +0530 Subject: [PATCH 045/211] Update admins.py --- GJ516Music/Helpers/admins.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GJ516Music/Helpers/admins.py b/GJ516Music/Helpers/admins.py index 502ec56..432667b 100644 --- a/GJ516Music/Helpers/admins.py +++ b/GJ516Music/Helpers/admins.py @@ -33,7 +33,7 @@ def admin_check(func: Callable) -> Callable: async def non_admin(_, message: Message): if not await is_active_chat(message.chat.id): - return await message.reply_text("ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.") + return await message.reply_text("𝘽𝙤𝙩 𝙞𝙨 𝙉𝙤𝙩 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝙘𝙝𝙖𝙩") if message.from_user.id in SUDOERS: return await func(_, message) @@ -41,7 +41,7 @@ async def non_admin(_, message: Message): check = await app.get_chat_member(message.chat.id, message.from_user.id) if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: return await message.reply_text( - "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + "𝙔𝙤𝙪 ' 𝙖𝙧𝙚 𝙉𝙤𝙩 𝘼𝙣 𝙅𝙖𝙮 𝘼𝙙𝙢𝙞𝙣, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨." ) admin = ( @@ -51,7 +51,7 @@ async def non_admin(_, message: Message): return await func(_, message) else: return await message.reply_text( - "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs." + "𝙔𝙤𝙪 𝘿𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙈𝙖𝙣𝙖𝙜𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩𝙨, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨" ) return non_admin @@ -61,7 +61,7 @@ def admin_check_cb(func: Callable) -> Callable: async def cb_non_admin(_, query: CallbackQuery): if not await is_active_chat(query.message.chat.id): return await query.answer( - "ʙᴏᴛ ɪsɴ'ᴛ sᴛʀᴇᴀᴍɪɴɢ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ.", show_alert=True + "𝘽𝙤𝙩 𝙞𝙨 𝙉𝙤𝙩 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝙘𝙝𝙖𝙩", show_alert=True ) if query.from_user.id in SUDOERS: @@ -73,7 +73,7 @@ async def cb_non_admin(_, query: CallbackQuery): return if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: return await query.answer( - "» ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ʙᴀʙʏ, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + "𝙔𝙤𝙪'𝙖𝙧𝙚 𝙉𝙤𝙩 𝘼𝙣 𝙅𝙖𝙮 𝘼𝙙𝙢𝙞𝙣, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨.", show_alert=True, ) @@ -84,7 +84,7 @@ async def cb_non_admin(_, query: CallbackQuery): return await func(_, query) else: return await query.answer( - "» ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴍᴀɴᴀɢᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛs, ᴘʟᴇᴀsᴇ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs.", + "𝙔𝙤𝙪 𝘿𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙈𝙖𝙣𝙖𝙜𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩𝙨, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨", show_alert=True, ) From 435813d1af777eff33fae1c3a6b04c2ae59e3b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:40:34 +0530 Subject: [PATCH 046/211] Update admins.py --- GJ516Music/Helpers/admins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/admins.py b/GJ516Music/Helpers/admins.py index 432667b..7c76d56 100644 --- a/GJ516Music/Helpers/admins.py +++ b/GJ516Music/Helpers/admins.py @@ -41,7 +41,7 @@ async def non_admin(_, message: Message): check = await app.get_chat_member(message.chat.id, message.from_user.id) if check.status not in [ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR]: return await message.reply_text( - "𝙔𝙤𝙪 ' 𝙖𝙧𝙚 𝙉𝙤𝙩 𝘼𝙣 𝙅𝙖𝙮 𝘼𝙙𝙢𝙞𝙣, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨." + "𝙔𝙤𝙪'𝙖𝙧𝙚 𝙉𝙤𝙩 𝘼𝙣 𝙅𝙖𝙮 𝘼𝙙𝙢𝙞𝙣, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙔𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨." ) admin = ( From 9dfa2c494a28bff250d64e0973c6d9cc983e0bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:41:10 +0530 Subject: [PATCH 047/211] Update clear.py --- GJ516Music/Helpers/clear.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/clear.py b/GJ516Music/Helpers/clear.py index 605339d..e565c9c 100644 --- a/GJ516Music/Helpers/clear.py +++ b/GJ516Music/Helpers/clear.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From f9eff08554dcb09ad44c5ac8d86fbdef71204f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:55:09 +0530 Subject: [PATCH 048/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 64c30eb..33610a4 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,24 +23,25 @@ from GJ516Music import BOT_NAME PM_START_TEXT = """ -ʜᴇʏ {0}, 🥀 -๏ ᴛʜɪs ɪs** {1} ! +𝙃𝙚𝙮 {0}, + 𝙏𝙝𝙞𝙨 𝙞𝙨** {1} ! -➻ ᴀ ғᴀsᴛ ᴀɴᴅ ᴘᴏᴡᴇʀғᴜʟ ᴍᴜsɪᴄ ᴘʟᴀʏᴇʀ ʙᴏᴛ. +𝘼 𝙁𝙖𝙨𝙩 𝘼𝙣𝙙 𝙋𝙤𝙬𝙚𝙧𝙛𝙪𝙡 𝙈𝙪𝙨𝙞𝙘 𝙋𝙡𝙖𝙮𝙚𝙧 𝘽𝙤𝙩. """ START_TEXT = """ -**ʜᴇʏ** {0}, 🥀 - {1} ᴄᴀɴ ɴᴏᴡ ᴩʟᴀʏ sᴏɴɢs ɪɴ {2}. +**𝙃𝙚𝙮** {0}, 🥀 + {1} 𝘾𝙖𝙣 𝙉𝙤𝙬 𝙋𝙡𝙖𝙮 𝙎𝙤𝙣𝙜 𝙄𝙣 {2}. ────────────────── -➻ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʜᴇʟᴘ ᴀʙᴏᴜᴛ ᴍᴇ ᴏʀ ɪғ ʏᴏᴜ ᴡᴀɴɴᴀ ᴀsᴋ sᴏᴍᴇᴛʜɪɴɢ ʏᴏᴜ ᴄᴀɴ ᴊᴏɪɴ ᴍʏ [sᴜᴘᴘᴏʀᴛ ᴄʜᴀᴛ]({3}). +➻ 𝙁𝙤𝙧 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙃𝙚𝙡𝙥 𝘼𝙗𝙤𝙪𝙩 𝙈𝙚 𝙊𝙧 𝙄𝙛 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝘼𝙨𝙠 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙔𝙤𝙪 𝘾𝙖𝙣 𝙅𝙤𝙞𝙣 𝙈𝙮 [𝙂𝙧𝙤𝙪𝙥] +({3}). """ HELP_TEXT = f""" -❄ **ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs ғᴏʀ ᴜsᴇʀs ɪɴ {BOT_NAME} :** + **𝗔𝘃𝗮𝗶𝗹𝗮𝗯𝗹𝗲 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 𝗙𝗼𝗿 𝗨𝘀𝗲𝗿𝘀 𝗜𝗻 {BOT_NAME} :** -๏ /play : sᴛᴀʀᴛs sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ ᴛʀᴀᴄᴋ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ. +๏ /play : 𝙎𝙩𝙖𝙧𝙩𝙨 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙏𝙧𝙖𝙘𝙠 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩. ๏ /pause : ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. ๏ /resume : ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. ๏ /skip : sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. From 3ba50e14f737a81cb30e6ae117a11c7460a72581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:55:54 +0530 Subject: [PATCH 049/211] Update downloaders.py --- GJ516Music/Helpers/downloaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/downloaders.py b/GJ516Music/Helpers/downloaders.py index 67f2193..0289604 100644 --- a/GJ516Music/Helpers/downloaders.py +++ b/GJ516Music/Helpers/downloaders.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 1d9cf05efa5d7e9dc3039b796f98bf80d625b14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:56:12 +0530 Subject: [PATCH 050/211] Update errors.py --- GJ516Music/Helpers/errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/errors.py b/GJ516Music/Helpers/errors.py index f4553ed..ef8707c 100644 --- a/GJ516Music/Helpers/errors.py +++ b/GJ516Music/Helpers/errors.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 819d006e9bb47a445a02f3ce72876cffa90b045e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:58:22 +0530 Subject: [PATCH 051/211] Update formatters.py --- GJ516Music/Helpers/formatters.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/formatters.py b/GJ516Music/Helpers/formatters.py index f683b84..f8a65a6 100644 --- a/GJ516Music/Helpers/formatters.py +++ b/GJ516Music/Helpers/formatters.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -25,7 +25,7 @@ def get_readable_time(seconds: int) -> str: count = 0 ping_time = "" time_list = [] - time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + time_suffix_list = ["𝙎", "𝙈", "𝙃","𝘿𝘼𝙔𝙎"] while count < 4: count += 1 if count < 3: From 0ab8a37c915f0c8cda814edc62365ec38b847a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 22:58:51 +0530 Subject: [PATCH 052/211] Update gets.py --- GJ516Music/Helpers/gets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/gets.py b/GJ516Music/Helpers/gets.py index ef702b7..53803b9 100644 --- a/GJ516Music/Helpers/gets.py +++ b/GJ516Music/Helpers/gets.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From a0efd1d5ba3f6d32ceb808fe395385d85060db33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:03:02 +0530 Subject: [PATCH 053/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 1e2cc37..834ba38 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -26,7 +26,7 @@ from GJ516Music import BOT_USERNAME close_key = InlineKeyboardMarkup( - [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] + [[InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close")]] ) From 589c457c8f64f821f6509a5757e1a2679efcfbb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:21:15 +0530 Subject: [PATCH 054/211] Update inline.py --- GJ516Music/Helpers/inline.py | 47 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 834ba38..9fd0aaf 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -33,10 +33,9 @@ buttons = InlineKeyboardMarkup( [ [ - InlineKeyboardButton(text="▷", callback_data="resume_cb"), - InlineKeyboardButton(text="II", callback_data="pause_cb"), - InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), - InlineKeyboardButton(text="▢", callback_data="end_cb"), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",User_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", Url=config.SUPPORT_CHAT), + ] ] ) @@ -45,20 +44,17 @@ pm_buttons = [ [ InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕", url=f"https://t.me/{BOT_USERNAME}?startgroup=true", ) ], - [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="GJ516_help")], + [InlineKeyboardButton(text="❰𝘾𝙤𝙢𝙢𝙖𝙣𝙙𝙨❱", callback_data="GJ516_help")], [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝗨𝗽𝗱𝗮𝘁𝗲𝘀❱", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), ], [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/GJ516Music" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱ ", user_id=config.OWNER_ID), ], ] @@ -66,19 +62,16 @@ gp_buttons = [ [ InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕ ", url=f"https://t.me/{BOT_USERNAME}?startgroup=true", ) ], [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝗨𝗽𝗱𝗮𝘁𝗲𝘀❱", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), ], [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/GJ516Music" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱ ", user_id=config.OWNER_ID), ], ] @@ -86,25 +79,25 @@ helpmenu = [ [ InlineKeyboardButton( - text="ᴇᴠᴇʀʏᴏɴᴇ", + text="𝗔𝗱𝗺𝗶𝗻'𝘀", callback_data="GJ516_cb help", ) ], [ - InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="GJ516_cb owner"), + InlineKeyboardButton(text="𝙎𝙪𝙙𝙤", callback_data="GJ516_cb sudo"), + InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤", callback_data="GJ516_cb owner"), ], [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_home"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_home"), + InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close"), ], ] help_back = [ - [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], + [InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT)], [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="GJ516_help"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_help"), + InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close"), ], ] From cca3a0207307cb4efe8ebea76f2c1cce00035ca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:23:21 +0530 Subject: [PATCH 055/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 9fd0aaf..159fa10 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -85,7 +85,7 @@ ], [ InlineKeyboardButton(text="𝙎𝙪𝙙𝙤", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤", callback_data="GJ516_cb owner"), + InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤", Url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_home"), From 4594214fa191272fbe0558a50c0ba1455a33f269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:24:19 +0530 Subject: [PATCH 056/211] Update thumbnails.py --- GJ516Music/Helpers/thumbnails.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/thumbnails.py b/GJ516Music/Helpers/thumbnails.py index 289df53..1476cb5 100644 --- a/GJ516Music/Helpers/thumbnails.py +++ b/GJ516Music/Helpers/thumbnails.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 115a40b7086ea0356fab9c991f5b49961b48a3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:24:33 +0530 Subject: [PATCH 057/211] Update queue.py --- GJ516Music/Helpers/queue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/queue.py b/GJ516Music/Helpers/queue.py index 48e5d02..224e755 100644 --- a/GJ516Music/Helpers/queue.py +++ b/GJ516Music/Helpers/queue.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 29ec2a8b93341277a505addf7da4f172fbcbee75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:29:59 +0530 Subject: [PATCH 058/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 159fa10..80bad75 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -85,7 +85,7 @@ ], [ InlineKeyboardButton(text="𝙎𝙪𝙙𝙤", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤", Url=f"https://github.com/MrProgrammer72/GJ516Music"), + InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤",Url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_home"), From 97ceb5a366a9302c76419bdbf67549e88573c5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:30:27 +0530 Subject: [PATCH 059/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 80bad75..2512ca6 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -85,7 +85,7 @@ ], [ InlineKeyboardButton(text="𝙎𝙪𝙙𝙤", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤",Url=f"https://github.com/MrProgrammer72/GJ516Music"), + InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤",url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_home"), From b95edfd383ae4a6a259d5a46ac6766beef269e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:40:33 +0530 Subject: [PATCH 060/211] Update inline.py --- GJ516Music/Helpers/inline.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 2512ca6..572469d 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -41,6 +41,20 @@ ) +jaybuttons = InlineKeyboardMarkup( + [ + [ + +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/export_gabbar"), + +InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=f"https://t.me/GJ516_DISCUSS_GROUP"), + + ] + ] +) + + + pm_buttons = [ [ InlineKeyboardButton( From b2b29bdc50ad631ad27237803aa9f81b5bd227e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:43:23 +0530 Subject: [PATCH 061/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 0625855..a050bd5 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -222,7 +222,7 @@ async def play(_, message: Message): await message.reply_photo( photo=qimg, caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", - reply_markup=buttons, + reply_markup=jaybuttons, ) else: stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) From a920c3132ce80575d6ad9a40a3ebdd3bc3ea1493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:54:06 +0530 Subject: [PATCH 062/211] Update play.py --- GJ516Music/Modules/play.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index a050bd5..5bf2f36 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -221,7 +221,7 @@ async def play(_, message: Message): qimg = await gen_qthumb(videoid, message.from_user.id) await message.reply_photo( photo=qimg, - caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + caption=f"**⏳ 𝘼𝙙𝙙𝙚𝙙 𝙩𝙤 𝙌𝙪𝙚𝙪𝙚 𝙖𝙩 #{position}**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**⏱𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣:** `{duration}`\n**👤𝘼𝙙𝙙𝙚𝙙 𝘽𝙮:** {ruser}", reply_markup=jaybuttons, ) else: @@ -251,7 +251,7 @@ async def play(_, message: Message): await add_active_chat(message.chat.id) await message.reply_photo( photo=imgt, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮:** {ruser}", reply_markup=buttons, ) From 470ab7abf07bd281413daf6ab7228ba68e222345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:55:14 +0530 Subject: [PATCH 063/211] Update __init__.py --- GJ516Music/Modules/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/__init__.py b/GJ516Music/Modules/__init__.py index 479b164..1a6ac00 100644 --- a/GJ516Music/Modules/__init__.py +++ b/GJ516Music/Modules/__init__.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 4cd0822447233bc665b7bb64f1c80fee48c11c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 27 Apr 2023 23:59:28 +0530 Subject: [PATCH 064/211] Update activevc.py --- GJ516Music/Modules/activevc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/activevc.py b/GJ516Music/Modules/activevc.py index 46fbce4..78fca00 100644 --- a/GJ516Music/Modules/activevc.py +++ b/GJ516Music/Modules/activevc.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 29e4d536a55711aedb202e3650e73af3308b9af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:05:51 +0530 Subject: [PATCH 065/211] Update activevc.py --- GJ516Music/Modules/activevc.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Modules/activevc.py b/GJ516Music/Modules/activevc.py index 78fca00..32738b0 100644 --- a/GJ516Music/Modules/activevc.py +++ b/GJ516Music/Modules/activevc.py @@ -30,7 +30,7 @@ @app.on_message(filters.command("activevc") & SUDOERS) async def activevc(_, message: Message): - mystic = await message.reply_text("» ɢᴇᴛᴛɪɴɢ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ʟɪsᴛ...") + mystic = await message.reply_text("𝙅𝙖𝙮 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩𝙨 𝙇𝙞𝙨𝙩... ☘") chats = await get_active_chats() text = "" j = 0 @@ -38,7 +38,7 @@ async def activevc(_, message: Message): try: title = (await app.get_chat(chat)).title except Exception: - title = "ᴩʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ" + title = "𝙋𝙧𝙞𝙫𝙖𝙩𝙚 𝘾𝙝𝙖𝙩 " if (await app.get_chat(chat)).username: user = (await app.get_chat(chat)).username text += f"{j + 1}. [{title}](https://t.me/{user})\n" @@ -46,10 +46,11 @@ async def activevc(_, message: Message): text += f"{j + 1}. {title} [`{chat}`]\n" j += 1 if not text: - await mystic.edit_text("ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄʙᴏᴛ...") + await mystic.edit_text("𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤 𝘾𝙝𝙖𝙩 𝙊𝙣 𝙈𝙪𝙨𝙞𝙘𝘽𝙤𝙩.... ❊ +") else: await mystic.edit_text( - f"**ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ᴍᴜsɪᴄ ʙᴏᴛ :**\n\n{text}", + f"**𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚 𝙘𝙝𝙖𝙩 𝙊𝙣 𝙈𝙪𝙨𝙞𝙘 𝘽𝙤𝙩 :**\n\n{text}", reply_markup=close_key, disable_web_page_preview=True, ) From e525303d739fde41aa0cbf93d9eeed1fe2e2904a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:06:30 +0530 Subject: [PATCH 066/211] Update activevc.py --- GJ516Music/Modules/activevc.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GJ516Music/Modules/activevc.py b/GJ516Music/Modules/activevc.py index 32738b0..9092453 100644 --- a/GJ516Music/Modules/activevc.py +++ b/GJ516Music/Modules/activevc.py @@ -46,8 +46,7 @@ async def activevc(_, message: Message): text += f"{j + 1}. {title} [`{chat}`]\n" j += 1 if not text: - await mystic.edit_text("𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤 𝘾𝙝𝙖𝙩 𝙊𝙣 𝙈𝙪𝙨𝙞𝙘𝘽𝙤𝙩.... ❊ -") + await mystic.edit_text("𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤 𝘾𝙝𝙖𝙩 𝙊𝙣 𝙈𝙪𝙨𝙞𝙘𝘽𝙤𝙩.") else: await mystic.edit_text( f"**𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚 𝙘𝙝𝙖𝙩 𝙊𝙣 𝙈𝙪𝙨𝙞𝙘 𝘽𝙤𝙩 :**\n\n{text}", From ba0b7a9bdf3343bbc2b6c3fc34481875b2f9b182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:10:58 +0530 Subject: [PATCH 067/211] Update assistant.py --- GJ516Music/Modules/assistant.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py index 742d7bd..aff3af1 100644 --- a/GJ516Music/Modules/assistant.py +++ b/GJ516Music/Modules/assistant.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -29,12 +29,12 @@ @app.on_message(filters.command(["asspfp", "setpfp"]) & SUDOERS) async def set_pfp(_, message: Message): if message.reply_to_message.photo: - fuk = await message.reply_text("» ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ...") + fuk = await message.reply_text("𝙉𝙤 𝘾𝙝𝙖𝙣𝙜𝙞𝙣𝙜 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘...") img = await message.reply_to_message.download() try: await app2.set_profile_photo(photo=img) return await fuk.edit_text( - f"» {ASS_MENTION} ᴘʀᴏғɪʟᴇ ᴘɪᴄ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + f"» {ASS_MENTION} 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮.." ) except: return await fuk.edit_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") From 143ac446418ade1b8364c24fd8055ead100ceaf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:21:57 +0530 Subject: [PATCH 068/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 572469d..09edfd4 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -85,7 +85,7 @@ InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), ], [ - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱ ", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙂𝙞𝙩𝙍𝙚𝙥𝙤❱ ", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], ] From 85a39310d7cf9416e2b1ef8c53e3057708e19a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:33:39 +0530 Subject: [PATCH 069/211] Update ping.py --- GJ516Music/Modules/ping.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index a5e2ec3..e08c37c 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -57,10 +57,10 @@ async def ping_fallen(_, message: Message): reply_markup=InlineKeyboardMarkup( [ [ - InlineKeyboardButton("❄ sᴜᴘᴘᴏʀᴛ ❄", url=config.SUPPORT_CHAT), + InlineKeyboardButton("❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), InlineKeyboardButton( - "✨ sᴏᴜʀᴄᴇ ✨", - url="https://github.com/AnonymousX1025/FallenMusic", + "❰𝙂𝙞𝙩𝙍𝙚𝙥𝙤❱ ", + url="https://github.com/MrProgrammer72/GJ516Music", ), ], ] From a44856d2ee0afd80ab185897075b5889b9c73bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:34:50 +0530 Subject: [PATCH 070/211] Update ping.py --- GJ516Music/Modules/ping.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index e08c37c..de6731c 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -28,8 +28,8 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message import config -from FallenMusic import BOT_NAME, StartTime, app -from FallenMusic.Helpers import get_readable_time +from GJ516Music import BOT_NAME, StartTime, app +from GJ516Music.Helpers import get_readable_time @app.on_message(filters.command("ping")) From 7b6146c1803d88ee7ddc6347676bf0532cc3ee1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:35:53 +0530 Subject: [PATCH 071/211] Update sudoers.py --- GJ516Music/Modules/sudoers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/sudoers.py b/GJ516Music/Modules/sudoers.py index 708e91f..5776bfc 100644 --- a/GJ516Music/Modules/sudoers.py +++ b/GJ516Music/Modules/sudoers.py @@ -24,7 +24,7 @@ from pyrogram.types import Message from config import OWNER_ID -from FallenMusic import SUDOERS, app +from GJ516Music import SUDOERS, app @app.on_message(filters.command(["addsudo"]) & filters.user(OWNER_ID)) From 436552019bd348012d66eb5b78fc9919288b250c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 00:36:30 +0530 Subject: [PATCH 072/211] Update stop.py --- GJ516Music/Modules/stop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/stop.py b/GJ516Music/Modules/stop.py index a2502cb..231b847 100644 --- a/GJ516Music/Modules/stop.py +++ b/GJ516Music/Modules/stop.py @@ -23,8 +23,8 @@ from pyrogram import filters from pyrogram.types import Message -from FallenMusic import app, pytgcalls -from FallenMusic.Helpers import _clear_, admin_check, close_key +from GJ516Music import app, pytgcalls +from GJ516Music.Helpers import _clear_, admin_check, close_key @app.on_message(filters.command(["stop", "end"]) & filters.group) From bf8f54ba7abb28829aaf67b2c244c6a9e1a14010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 07:43:08 +0530 Subject: [PATCH 073/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 33610a4..f533c08 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -42,21 +42,21 @@ **𝗔𝘃𝗮𝗶𝗹𝗮𝗯𝗹𝗲 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 𝗙𝗼𝗿 𝗨𝘀𝗲𝗿𝘀 𝗜𝗻 {BOT_NAME} :** ๏ /play : 𝙎𝙩𝙖𝙧𝙩𝙨 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙏𝙧𝙖𝙘𝙠 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩. -๏ /pause : ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. -๏ /resume : ʀᴇsᴜᴍᴇ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. -๏ /skip : sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ ᴀɴᴅ sᴛᴀʀᴛ sᴛʀᴇᴀᴍɪɴɢ ᴛʜᴇ ɴᴇxᴛ ᴛʀᴀᴄᴋ ɪɴ ǫᴜᴇᴜᴇ. -๏ /end : ᴄʟᴇᴀʀs ᴛʜᴇ ǫᴜᴇᴜᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴩʟᴀʏɪɴɢ sᴛʀᴇᴀᴍ. +๏ /pause : 𝙋𝙖𝙪𝙨𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. +๏ /resume : 𝙍𝙚𝙨𝙪𝙢𝙚 𝙩𝙝𝙚 𝙋𝙖𝙪𝙨𝙚𝙙 𝙨𝙩𝙧𝙚𝙖𝙢. +๏ /skip : 𝙎𝙠𝙞𝙥 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢 𝘼𝙣𝙙 𝙎𝙩𝙖𝙧𝙩 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙉𝙚𝙭𝙩 𝙏𝙧𝙖𝙘𝙠 𝙄𝙣 𝙌𝙪𝙚𝙪𝙚. +๏ /end : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝙌𝙪𝙚𝙪𝙚 𝘼𝙣𝙙 𝙏𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. -๏ /ping : sʜᴏᴡ ᴛʜᴇ ᴩɪɴɢ ᴀɴᴅ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. -๏ /sudolist : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴅᴏ ᴜsᴇʀs ᴏғ ᴛʜᴇ ʙᴏᴛ. +๏ /ping : 𝙎𝙝𝙤𝙬 𝙩𝙝𝙚 𝙋𝙞𝙣𝙜 𝘼𝙣𝙙 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙤𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩. +๏ /sudolist : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩. -๏ /song : ᴅᴏᴡɴʟᴏᴀᴅs ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴀɴᴅ sᴇɴᴅ ɪᴛ ᴛᴏ ʏᴏᴜ. +๏ /song : 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙𝙨 𝙩𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙎𝙤𝙣𝙜 𝘼𝙣𝙙 𝙎𝙚𝙣𝙙 𝙞𝙩 𝙏𝙤 𝙮𝙤𝙪 -๏ /search : sᴇᴀʀᴄᴇs ᴛʜᴇ ɢɪᴠᴇɴ ǫᴜᴇʀʏ ᴏɴ ʏᴏᴜᴛᴜʙᴇ ᴀɴᴅ sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʀᴇsᴜʟᴛ. +๏ /search : 𝙎𝙚𝙖𝙧𝙘𝙝 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝙌𝙪𝙚𝙧𝙮 𝙊𝙣 𝙔𝙤𝙪𝙏𝙪𝙗𝙚 𝙖𝙣𝙙 𝙎𝙝𝙤𝙬 𝙮𝙤𝙪 𝙏𝙝𝙚 𝙍𝙚𝙨𝙪𝙡𝙩𝙨 """ HELP_SUDO = f""" -✨ **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** + **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** ๏ /activevc : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs. ๏ /eval or /sh : ʀᴜɴs ᴛʜᴇ ɢɪᴠᴇɴ ᴄᴏᴅᴇ ᴏɴ ᴛʜᴇ ʙᴏᴛ's ᴛᴇʀᴍɪɴᴀʟ. From e48132a1999b07c18d728e1a66b818694344ee9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 07:47:55 +0530 Subject: [PATCH 074/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index f533c08..a8ee359 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -56,17 +56,19 @@ """ HELP_SUDO = f""" - **sᴜᴅᴏ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** - -๏ /activevc : sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs. -๏ /eval or /sh : ʀᴜɴs ᴛʜᴇ ɢɪᴠᴇɴ ᴄᴏᴅᴇ ᴏɴ ᴛʜᴇ ʙᴏᴛ's ᴛᴇʀᴍɪɴᴀʟ. -๏ /speedtest : ʀᴜɴs ᴀ sᴘᴇᴇᴅᴛᴇsᴛ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. -๏ /sysstats : sʜᴏᴡs ᴛʜᴇ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. - -๏ /setname [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ɴᴀᴍᴇ. -๏ /setbio [ᴛᴇxᴛ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ʙɪᴏ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. -๏ /setpfp [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ] : ᴄʜᴀɴɢᴇ ᴛʜᴇ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. -๏ /delpfp : ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘғᴘ ᴏғ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. + **𝗦𝘂𝗱𝗼 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 𝗜𝗻 {BOT_NAME} :** + +๏ /activevc : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚 𝙘𝙝𝙖𝙩. 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮. +๏ /eval or /sh : 𝙍𝙪𝙣𝙨 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝘾𝙤𝙙𝙚 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙏𝙚𝙧𝙢𝙞𝙣𝙖𝙡 +๏ /speedtest : 𝙍𝙪𝙣𝙨 𝘼 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. +๏ /sysstats : 𝙎𝙝𝙤𝙬𝙨 𝙏𝙝𝙚 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨. + + +๏ /setname : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙉𝙖𝙢𝙚. +๏ /setbio : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘽𝙞𝙤 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. +๏ /setpfp [𝙍𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙋𝙝𝙤𝙩𝙤 ] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝙋𝙛𝙋 𝙤𝙛 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. + +๏ /delpfp : 𝘿𝙚𝙡𝙚𝙩𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙛𝙋 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. """ HELP_DEV = f""" From cb1e9ecf5d07aa0c886b3891dccb47c43ce3fa0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 07:53:00 +0530 Subject: [PATCH 075/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index a8ee359..1e9d1dc 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -72,13 +72,12 @@ """ HELP_DEV = f""" -✨ **ᴏᴡɴᴇʀ ᴄᴏᴍᴍᴀɴᴅs ɪɴ {BOT_NAME} :** - -๏ /config : ᴛᴏ ɢᴇᴛ ᴀʟʟ ᴄᴏɴꜰɪɢ ᴠᴀʀɪᴀʙʟᴇꜱ ᴏꜰ ʙᴏᴛ. -๏ /broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] : ʙʀᴏᴀᴅᴄᴀsᴛ ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. -๏ /rmdownloads : ᴄʟᴇᴀʀs ᴛʜᴇ ᴄᴀᴄʜᴇ ғɪʟᴇs ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ ᴏɴ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ. -๏ /leaveall : ᴏʀᴅᴇʀs ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴀʟʟ ᴄʜᴀᴛs. - -๏ /addsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ᴀᴅᴅ ᴛʜᴇ ᴜsᴇʀ ᴛᴏ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. -๏ /rmsudo [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] : ʀᴇᴍᴏᴠᴇ ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ. +**𝗢𝘄𝗻𝗲𝗿 𝗖𝗼𝗺𝗺𝗮𝗻𝘀 𝗶𝗻 {BOT_NAME} :** + +๏ /config : 𝙏𝙤 𝙜𝙚𝙩 𝘼𝙡𝙡 𝘾𝙤𝙣𝙛𝙞𝙜 𝙑𝙖𝙧𝙞𝙖𝙗𝙡𝙚𝙨 𝙊𝙧 𝘽𝙤𝙩. +๏ /broadcast : [𝙈𝙚𝙨𝙨𝙖𝙜𝙚 𝙤𝙛 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙈𝙖𝙨𝙨𝙖𝙜𝙚] : 𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙩𝙝𝙚 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙏𝙤 𝙎𝙚𝙧𝙫𝙚𝙙 𝘾𝙝𝙖𝙩𝙨 𝙊𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩𝙨. +๏ /rmdownloads : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝘾𝙖𝙘𝙝𝙚 𝙁𝙞𝙡𝙚𝙨 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. +๏ /leaveall : 𝙊𝙧𝙙𝙚𝙧𝙨 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙏𝙤 𝙇𝙚𝙖𝙫𝙚 𝘼𝙡𝙡 𝘾𝙝𝙖𝙩𝙨. +๏ /addsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝘼𝙙𝙙 𝙏𝙝𝙚 𝙐𝙨𝙚𝙧 𝙩𝙤 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. +๏ /rmsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝙍𝙚𝙢𝙤𝙫𝙚 𝙩𝙝𝙚 𝙐𝙨𝙚𝙧 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. """ From 4035b0d4caf9c873b597547210c7c6dd4ed7f635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 07:55:47 +0530 Subject: [PATCH 076/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 1e9d1dc..6f05c7d 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -41,43 +41,43 @@ HELP_TEXT = f""" **𝗔𝘃𝗮𝗶𝗹𝗮𝗯𝗹𝗲 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 𝗙𝗼𝗿 𝗨𝘀𝗲𝗿𝘀 𝗜𝗻 {BOT_NAME} :** -๏ /play : 𝙎𝙩𝙖𝙧𝙩𝙨 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙏𝙧𝙖𝙘𝙠 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩. -๏ /pause : 𝙋𝙖𝙪𝙨𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. -๏ /resume : 𝙍𝙚𝙨𝙪𝙢𝙚 𝙩𝙝𝙚 𝙋𝙖𝙪𝙨𝙚𝙙 𝙨𝙩𝙧𝙚𝙖𝙢. -๏ /skip : 𝙎𝙠𝙞𝙥 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢 𝘼𝙣𝙙 𝙎𝙩𝙖𝙧𝙩 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙉𝙚𝙭𝙩 𝙏𝙧𝙖𝙘𝙠 𝙄𝙣 𝙌𝙪𝙚𝙪𝙚. -๏ /end : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝙌𝙪𝙚𝙪𝙚 𝘼𝙣𝙙 𝙏𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. +❏ /play : 𝙎𝙩𝙖𝙧𝙩𝙨 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙏𝙧𝙖𝙘𝙠 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩. +❏ /pause : 𝙋𝙖𝙪𝙨𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. +❏ /resume : 𝙍𝙚𝙨𝙪𝙢𝙚 𝙩𝙝𝙚 𝙋𝙖𝙪𝙨𝙚𝙙 𝙨𝙩𝙧𝙚𝙖𝙢. +❏ /skip : 𝙎𝙠𝙞𝙥 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢 𝘼𝙣𝙙 𝙎𝙩𝙖𝙧𝙩 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 𝙏𝙝𝙚 𝙉𝙚𝙭𝙩 𝙏𝙧𝙖𝙘𝙠 𝙄𝙣 𝙌𝙪𝙚𝙪𝙚. +❏ /end : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝙌𝙪𝙚𝙪𝙚 𝘼𝙣𝙙 𝙏𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢. -๏ /ping : 𝙎𝙝𝙤𝙬 𝙩𝙝𝙚 𝙋𝙞𝙣𝙜 𝘼𝙣𝙙 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙤𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩. -๏ /sudolist : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩. +❏ /ping : 𝙎𝙝𝙤𝙬 𝙩𝙝𝙚 𝙋𝙞𝙣𝙜 𝘼𝙣𝙙 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙤𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩. +❏ /sudolist : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩. -๏ /song : 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙𝙨 𝙩𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙎𝙤𝙣𝙜 𝘼𝙣𝙙 𝙎𝙚𝙣𝙙 𝙞𝙩 𝙏𝙤 𝙮𝙤𝙪 +❏ /song : 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙𝙨 𝙩𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙎𝙤𝙣𝙜 𝘼𝙣𝙙 𝙎𝙚𝙣𝙙 𝙞𝙩 𝙏𝙤 𝙮𝙤𝙪 -๏ /search : 𝙎𝙚𝙖𝙧𝙘𝙝 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝙌𝙪𝙚𝙧𝙮 𝙊𝙣 𝙔𝙤𝙪𝙏𝙪𝙗𝙚 𝙖𝙣𝙙 𝙎𝙝𝙤𝙬 𝙮𝙤𝙪 𝙏𝙝𝙚 𝙍𝙚𝙨𝙪𝙡𝙩𝙨 +❏ /search : 𝙎𝙚𝙖𝙧𝙘𝙝 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝙌𝙪𝙚𝙧𝙮 𝙊𝙣 𝙔𝙤𝙪𝙏𝙪𝙗𝙚 𝙖𝙣𝙙 𝙎𝙝𝙤𝙬 𝙮𝙤𝙪 𝙏𝙝𝙚 𝙍𝙚𝙨𝙪𝙡𝙩𝙨 """ HELP_SUDO = f""" **𝗦𝘂𝗱𝗼 𝗖𝗼𝗺𝗺𝗮𝗻𝗱𝘀 𝗜𝗻 {BOT_NAME} :** -๏ /activevc : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚 𝙘𝙝𝙖𝙩. 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮. -๏ /eval or /sh : 𝙍𝙪𝙣𝙨 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝘾𝙤𝙙𝙚 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙏𝙚𝙧𝙢𝙞𝙣𝙖𝙡 -๏ /speedtest : 𝙍𝙪𝙣𝙨 𝘼 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. -๏ /sysstats : 𝙎𝙝𝙤𝙬𝙨 𝙏𝙝𝙚 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨. +❏ /activevc : 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚 𝙘𝙝𝙖𝙩. 𝙎𝙝𝙤𝙬𝙨 𝙩𝙝𝙚 𝙇𝙞𝙨𝙩 𝙤𝙛 𝘾𝙪𝙧𝙧𝙚𝙣𝙩𝙡𝙮. +❏ /eval or /sh : 𝙍𝙪𝙣𝙨 𝙩𝙝𝙚 𝙂𝙞𝙫𝙚𝙣 𝘾𝙤𝙙𝙚 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙏𝙚𝙧𝙢𝙞𝙣𝙖𝙡 +❏ /speedtest : 𝙍𝙪𝙣𝙨 𝘼 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. +❏ /sysstats : 𝙎𝙝𝙤𝙬𝙨 𝙏𝙝𝙚 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 𝙊𝙛 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨. -๏ /setname : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙉𝙖𝙢𝙚. -๏ /setbio : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘽𝙞𝙤 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. -๏ /setpfp [𝙍𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙋𝙝𝙤𝙩𝙤 ] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝙋𝙛𝙋 𝙤𝙛 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. +❏ /setname : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙉𝙖𝙢𝙚. +❏ /setbio : [𝙏𝙚𝙭𝙩 𝙊𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙩𝙚𝙭𝙩] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝘽𝙞𝙤 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. +❏ /setpfp [𝙍𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙋𝙝𝙤𝙩𝙤 ] : 𝘾𝙝𝙖𝙣𝙜𝙚 𝙩𝙝𝙚 𝙋𝙛𝙋 𝙤𝙛 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. -๏ /delpfp : 𝘿𝙚𝙡𝙚𝙩𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙛𝙋 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. +❏ /delpfp : 𝘿𝙚𝙡𝙚𝙩𝙚 𝙩𝙝𝙚 𝘾𝙪𝙧𝙧𝙚𝙣𝙩 𝙋𝙛𝙋 𝙤𝙛 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩. """ HELP_DEV = f""" **𝗢𝘄𝗻𝗲𝗿 𝗖𝗼𝗺𝗺𝗮𝗻𝘀 𝗶𝗻 {BOT_NAME} :** -๏ /config : 𝙏𝙤 𝙜𝙚𝙩 𝘼𝙡𝙡 𝘾𝙤𝙣𝙛𝙞𝙜 𝙑𝙖𝙧𝙞𝙖𝙗𝙡𝙚𝙨 𝙊𝙧 𝘽𝙤𝙩. -๏ /broadcast : [𝙈𝙚𝙨𝙨𝙖𝙜𝙚 𝙤𝙛 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙈𝙖𝙨𝙨𝙖𝙜𝙚] : 𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙩𝙝𝙚 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙏𝙤 𝙎𝙚𝙧𝙫𝙚𝙙 𝘾𝙝𝙖𝙩𝙨 𝙊𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩𝙨. -๏ /rmdownloads : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝘾𝙖𝙘𝙝𝙚 𝙁𝙞𝙡𝙚𝙨 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. -๏ /leaveall : 𝙊𝙧𝙙𝙚𝙧𝙨 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙏𝙤 𝙇𝙚𝙖𝙫𝙚 𝘼𝙡𝙡 𝘾𝙝𝙖𝙩𝙨. -๏ /addsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝘼𝙙𝙙 𝙏𝙝𝙚 𝙐𝙨𝙚𝙧 𝙩𝙤 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. -๏ /rmsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝙍𝙚𝙢𝙤𝙫𝙚 𝙩𝙝𝙚 𝙐𝙨𝙚𝙧 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. +❏ /config : 𝙏𝙤 𝙜𝙚𝙩 𝘼𝙡𝙡 𝘾𝙤𝙣𝙛𝙞𝙜 𝙑𝙖𝙧𝙞𝙖𝙗𝙡𝙚𝙨 𝙊𝙧 𝘽𝙤𝙩. +❏ /broadcast : [𝙈𝙚𝙨𝙨𝙖𝙜𝙚 𝙤𝙛 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙈𝙖𝙨𝙨𝙖𝙜𝙚] : 𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙩𝙝𝙚 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙏𝙤 𝙎𝙚𝙧𝙫𝙚𝙙 𝘾𝙝𝙖𝙩𝙨 𝙊𝙛 𝙏𝙝𝙚 𝘽𝙤𝙩𝙨. +❏ /rmdownloads : 𝘾𝙡𝙚𝙖𝙧𝙨 𝙩𝙝𝙚 𝘾𝙖𝙘𝙝𝙚 𝙁𝙞𝙡𝙚𝙨 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙤𝙩'𝙨 𝙎𝙚𝙧𝙫𝙚𝙧. +❏ /leaveall : 𝙊𝙧𝙙𝙚𝙧𝙨 𝙩𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙘𝙘𝙤𝙪𝙣𝙩 𝙏𝙤 𝙇𝙚𝙖𝙫𝙚 𝘼𝙡𝙡 𝘾𝙝𝙖𝙩𝙨. +❏ /addsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝘼𝙙𝙙 𝙏𝙝𝙚 𝙐𝙨𝙚𝙧 𝙩𝙤 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. +❏ /rmsudo : [𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 𝙤𝙧 𝙧𝙚𝙥𝙡𝙮 𝙩𝙤 𝘼 𝙐𝙨𝙚𝙧] : 𝙍𝙚𝙢𝙤𝙫𝙚 𝙩𝙝𝙚 𝙐𝙨𝙚𝙧 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩. """ From 37f06ab7a3f0d3782b5d007633305affec916f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 07:59:40 +0530 Subject: [PATCH 077/211] Update __init__.py --- GJ516Music/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py index 60b2c28..c776dcf 100644 --- a/GJ516Music/__init__.py +++ b/GJ516Music/__init__.py @@ -97,13 +97,13 @@ async def GJ516_startup(): except: pass - ANON = "\x31\x33\x35\x36\x34\x36\x39\x30\x37\x35" + JAY = "\x31\x33\x35\x36\x34\x36\x39\x30\x37\x35" for SUDOER in config.SUDO_USERS: SUDOERS.add(SUDOER) if config.OWNER_ID not in config.SUDO_USERS: SUDOERS.add(config.OWNER_ID) - elif int(ANON) not in config.SUDO_USERS: - SUDOERS.add(int(ANON)) + elif int(JAY) not in config.SUDO_USERS: + SUDOERS.add(int(JAY)) GJ516db = {} LOGGER.info( From 5d9fb8c9a09ea7bbb4f2efa4c7c5e21640886eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:00:54 +0530 Subject: [PATCH 078/211] Update __init__.py --- GJ516Music/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py index c776dcf..8379eb2 100644 --- a/GJ516Music/__init__.py +++ b/GJ516Music/__init__.py @@ -92,8 +92,8 @@ async def GJ516_startup(): ASS_USERNAME = getme2.username ASS_MENTION = getme2.mention try: - await app2.join_chat("DevilsHeavenMF") - await app2.join_chat("GJ516Association") + await app2.join_chat("GJ516_DISCUSS_GROUP") + await app2.join_chat("GJ516_DISCUSS_GROUP") except: pass From 641990a42d4052bc21d620edbc81d4e0d4e8fb4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 08:01:54 +0530 Subject: [PATCH 079/211] Update __init__.py --- GJ516Music/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py index 8379eb2..b363740 100644 --- a/GJ516Music/__init__.py +++ b/GJ516Music/__init__.py @@ -93,7 +93,7 @@ async def GJ516_startup(): ASS_MENTION = getme2.mention try: await app2.join_chat("GJ516_DISCUSS_GROUP") - await app2.join_chat("GJ516_DISCUSS_GROUP") + await app2.join_chat("myworldGJ516") except: pass From 3756e95d89015224ad589ffe7e1ca9efc9bc4aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 12:22:46 +0530 Subject: [PATCH 080/211] Update assistant.py --- GJ516Music/Modules/assistant.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py index aff3af1..44bace3 100644 --- a/GJ516Music/Modules/assistant.py +++ b/GJ516Music/Modules/assistant.py @@ -37,10 +37,10 @@ async def set_pfp(_, message: Message): f"» {ASS_MENTION} 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮.." ) except: - return await fuk.edit_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴄʜᴀɴɢᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + return await fuk.edit_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝘾𝙝𝙖𝙣𝙜𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘.") else: await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴘʜᴏᴛᴏ ғᴏʀ ᴄʜᴀɴɢɪɴɢ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + "𝙍𝙚𝙥𝙡𝙮 𝙏𝙤 𝘼 𝙋𝙝𝙤𝙩𝙤 𝙁𝙤𝙧 𝘾𝙝𝙖𝙣𝙜𝙞𝙣𝙜 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘.." ) @@ -50,11 +50,12 @@ async def set_pfp(_, message: Message): pfp = [p async for p in app2.get_chat_photos("me")] await app2.delete_profile_photos(pfp[0].file_id) return await message.reply_text( - "» sᴜᴄᴄᴇssғᴜʟʟʏ ᴅᴇʟᴇᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ." + "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘. +        " ) except Exception as ex: LOGGER.error(ex) - await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴀssɪsᴛᴀɴᴛ's ᴘʀᴏғɪʟᴇ ᴘɪᴄ.") + await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝘿𝙚𝙡𝙚𝙩𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘.") @app.on_message(filters.command(["assbio", "setbio"]) & SUDOERS) @@ -65,15 +66,15 @@ async def set_bio(_, message: Message): newbio = msg.text await app2.update_profile(bio=newbio) return await message.reply_text( - f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + f"» {ASS_MENTION} 𝘽𝙞𝙤 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮." ) elif len(message.command) != 1: newbio = message.text.split(None, 1)[1] await app2.update_profile(bio=newbio) - return await message.reply_text(f"» {ASS_MENTION} ʙɪᴏ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + return await message.reply_text(f"» {ASS_MENTION} 𝘽𝙞𝙤 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮.") else: return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ʙɪᴏ." + "𝙍𝙚𝙥𝙡𝙮 𝙏𝙤 𝘼 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙊𝙧 𝙂𝙞𝙫𝙚 𝙎𝙤𝙢𝙚 𝙏𝙚𝙭𝙩 𝙏𝙤 𝙎𝙚𝙩 𝙄𝙩 𝘼𝙨 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝘽𝙞𝙤." ) @@ -85,13 +86,13 @@ async def set_name(_, message: Message): name = msg.text await app2.update_profile(first_name=name) return await message.reply_text( - f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ." + f"» {ASS_MENTION} 𝙉𝙖𝙢𝙚 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮." ) elif len(message.command) != 1: name = message.text.split(None, 1)[1] await app2.update_profile(first_name=name, last_name="") - return await message.reply_text(f"» {ASS_MENTION} ɴᴀᴍᴇ ᴄʜᴀɴɢᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.") + return await message.reply_text(f"» {ASS_MENTION} 𝙉𝙖𝙢𝙚 𝘾𝙝𝙖𝙣𝙜𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮.") else: return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴛ ɪᴛ ᴀs ᴀssɪsᴛᴀɴᴛ's ɴᴇᴡ ɴᴀᴍᴇ." + "𝙍𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙤𝙧 𝙂𝙞𝙫𝙚 𝙎𝙤𝙢𝙚 𝙏𝙚𝙭𝙩 𝙏𝙤 𝙎𝙚𝙩 𝙄𝙩 𝘼𝙨 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙉𝙚𝙬 𝙉𝙖𝙢𝙚" ) From d0e4083b6d419df14532e546b5ae29d9d2bae75d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:31:16 +0530 Subject: [PATCH 081/211] Update broadcast.py --- GJ516Music/Modules/broadcast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/broadcast.py b/GJ516Music/Modules/broadcast.py index 9a233f7..c95c60a 100644 --- a/GJ516Music/Modules/broadcast.py +++ b/GJ516Music/Modules/broadcast.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From ead5dc5716398fcd028c87afbb86aacacc8d1c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 21:38:27 +0530 Subject: [PATCH 082/211] Update broadcast.py --- GJ516Music/Modules/broadcast.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Modules/broadcast.py b/GJ516Music/Modules/broadcast.py index c95c60a..6a30f78 100644 --- a/GJ516Music/Modules/broadcast.py +++ b/GJ516Music/Modules/broadcast.py @@ -32,14 +32,14 @@ @app.on_message(filters.command("broadcast") & filters.user(OWNER_ID)) async def broadcast(_, message: Message): - brep = await message.reply_text("sᴛᴀʀᴛᴇᴅ ᴀssɪsᴛᴀɴᴛ ʙʀᴏᴀᴅᴄᴀsᴛ...") + brep = await message.reply_text("𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩....") 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( - "**ᴇxᴀᴍᴘʟᴇ:**\n\n/broadcast [ᴍᴇssᴀɢᴇ] ᴏʀ [ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ]" + "**ᴇxᴀᴍᴘʟᴇ:**\n\n/broadcast [𝙈𝙖𝙨𝙨𝙖𝙜𝙚] 𝙤𝙧 [𝙍𝙚𝙥𝙡𝙮 𝙩𝙤 𝙖 𝙈𝙖𝙨𝙨𝙖𝙜𝙚]" ) query = message.text.split(None, 1)[1] sent = 0 @@ -60,6 +60,8 @@ async def broadcast(_, message: Message): except Exception: continue try: - await brep.edit_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") + await brep.edit_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘 +.**") except: - await message.reply_text(f"**ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ ɪɴ {sent} ᴄʜᴀᴛs.**") + await message.reply_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘 +.**") From aa70af9a34c9414e82234356455d8793e5d3f851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:22:24 +0530 Subject: [PATCH 083/211] Update callback.py --- GJ516Music/Modules/callback.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/GJ516Music/Modules/callback.py b/GJ516Music/Modules/callback.py index 3a9100c..4bb1274 100644 --- a/GJ516Music/Modules/callback.py +++ b/GJ516Music/Modules/callback.py @@ -61,7 +61,7 @@ async def close_(_, CallbackQuery): if CallbackQuery.from_user.id != int(user_id): try: return await CallbackQuery.answer( - "» ɪᴛ'ʟʟ ʙᴇ ʙᴇᴛᴛᴇʀ ɪғ ʏᴏᴜ sᴛᴀʏ ɪɴ ʏᴏᴜʀ ʟɪᴍɪᴛs ʙᴀʙʏ.", show_alert=True + "𝙄𝙩'𝙡𝙡 𝙗𝙚 𝘽𝙚𝙩𝙩𝙚𝙧 𝙞𝙛 𝙔𝙤𝙪 𝙎𝙩𝙖𝙮 𝙄𝙣 𝙮𝙤𝙪𝙧 𝙇𝙞𝙢𝙞𝙩𝙨.", show_alert=True ) except: return @@ -97,24 +97,24 @@ async def admin_cbs(_, query: CallbackQuery): if data == "resume_cb": if await is_streaming(query.message.chat.id): return await query.answer( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + "𝘿𝙞𝙙 𝙮𝙤𝙪 𝙍𝙚𝙢𝙚𝙢𝙗𝙚𝙧 𝙏𝙝𝙖𝙩 𝙮𝙤𝙪 𝙋𝙖𝙪𝙨𝙚𝙙 𝙩𝙝𝙚 𝙎𝙩𝙧𝙚𝙖𝙢 ?", show_alert=True ) await stream_on(query.message.chat.id) await pytgcalls.resume_stream(query.message.chat.id) await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙍𝙚𝙨𝙪𝙢𝙚𝙙\n│ \n└𝘽𝙮 : {query.from_user.mention} ", reply_markup=close_key, ) elif data == "pause_cb": if not await is_streaming(query.message.chat.id): return await query.answer( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?", show_alert=True + "𝘿𝙞𝙙 𝙮𝙤𝙪 𝙍𝙚𝙢𝙚𝙢𝙗𝙚𝙧 𝙏𝙝𝙖𝙩 𝙮𝙤𝙪 𝙍𝙚𝙨𝙪𝙢𝙚𝙙 𝙩𝙝𝙚 𝙎𝙩𝙧𝙚𝙖𝙢 ?", show_alert=True ) await stream_off(query.message.chat.id) await pytgcalls.pause_stream(query.message.chat.id) await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙋𝙖𝙪𝙨𝙚𝙙 \n│ \n└𝘽𝙮 : {query.from_user.mention} ", reply_markup=close_key, ) @@ -125,7 +125,7 @@ async def admin_cbs(_, query: CallbackQuery): except: pass await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ ❄\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + text=f"➻ 𝙎𝙩𝙧𝙚𝙖𝙢 𝙀𝙣𝙙𝙚𝙙/𝙎𝙩𝙤𝙥𝙥𝙚𝙙 \n│ \n└𝘽𝙮 : {query.from_user.mention} ", reply_markup=close_key, ) await query.message.delete() @@ -137,7 +137,7 @@ async def admin_cbs(_, query: CallbackQuery): await _clear_(query.message.chat.id) await pytgcalls.leave_group_call(query.message.chat.id) await query.message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {query.message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙎𝙠𝙞𝙥𝙥𝙚𝙙\n│ \n└𝘽𝙮 : {query.from_user.mention} \n\n**𝙉𝙤 𝙈𝙤𝙧𝙚 𝙌𝙪𝙚𝙪𝙚𝙙 𝙏𝙧𝙖𝙘𝙠𝙨 𝙞𝙣** {query.message.chat.title}, **𝙡𝙚𝙖𝙫𝙞𝙣𝙜 𝙑𝙞𝙙𝙚𝙤𝙘𝙝𝙖𝙩.**", reply_markup=close_key, ) return await query.message.delete() @@ -165,12 +165,12 @@ async def admin_cbs(_, query: CallbackQuery): img = await gen_thumb(videoid, user_id) await query.edit_message_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {query.from_user.mention} 🥀", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙎𝙠𝙞𝙥𝙥𝙚𝙙\n│ \n└𝘽𝙮 : {query.from_user.mention} ", reply_markup=close_key, ) return await query.message.reply_photo( photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n‣ **💡𝙏𝙞𝙩𝙡𝙚 :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n ***👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮 :** {req_by}", reply_markup=buttons, ) @@ -186,15 +186,15 @@ async def unban_ass(_, CallbackQuery): await app.unban_chat_member(int(chat_id), ASS_ID) except: return await CallbackQuery.answer( - "» ғᴀɪʟᴇᴅ ᴛᴏ ᴜɴʙᴀɴ ᴀssɪsᴛᴀɴᴛ.", + "𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝙐𝙣𝙗𝙖𝙣 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩.", show_alert=True, ) return await CallbackQuery.edit_message_text( - f"➻ {ASS_NAME} sᴜᴄᴄᴇssғᴜʟʟʏ ᴜɴʙᴀɴɴᴇᴅ ʙʏ {CallbackQuery.from_user.mention}.\n\nᴛʀʏ ᴘʟᴀʏɪɴɢ ɴᴏᴡ..." + f" {ASS_NAME} 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝙐𝙣𝙗𝙖𝙣𝙣𝙚𝙙 𝘽𝙮 {CallbackQuery.from_user.mention}.\n\nᴛʀʏ ᴘʟᴀʏɪɴɢ ɴᴏᴡ..." ) else: return await CallbackQuery.answer( - "» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ᴜɴʙᴀɴ ᴜsᴇʀs ɪɴ ᴛʜɪs ᴄʜᴀᴛ.", + "𝘿𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙐𝙣𝙗𝙖𝙣 𝙐𝙨𝙚𝙧𝙨 𝙄𝙣 𝙏𝙝𝙞𝙨 𝘾𝙝𝙖𝙩.", show_alert=True, ) @@ -208,7 +208,8 @@ async def help_menu(_, query: CallbackQuery): try: await query.edit_message_text( - text=f"๏ ʜᴇʏ {query.from_user.first_name}, 🥀\n\nᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ғᴏʀ ᴡʜɪᴄʜ ʏᴏᴜ ᴡᴀɴɴᴀ ɢᴇᴛ ʜᴇʟᴘ.", + text=f"𝙃𝙚𝙮 {query.from_user.first_name}, 🥀 +\n\n 𝙋𝙡𝙚𝙖𝙨𝙚 𝘾𝙡𝙞𝙘𝙠 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙪𝙩𝙩𝙤𝙣 𝘽𝙚𝙡𝙤𝙬 𝙁𝙤𝙧 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝙂𝙚𝙩 𝙃𝙚𝙡𝙥.", reply_markup=InlineKeyboardMarkup(helpmenu), ) except Exception as e: From 04dfb29042ee8f57f297d288d0c0ed903d0b3c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:23:22 +0530 Subject: [PATCH 084/211] Update callback.py --- GJ516Music/Modules/callback.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/callback.py b/GJ516Music/Modules/callback.py index 4bb1274..2ac271a 100644 --- a/GJ516Music/Modules/callback.py +++ b/GJ516Music/Modules/callback.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 3522856495aa2d0923b76ce472cadef8b5c5a0c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:24:21 +0530 Subject: [PATCH 085/211] Update callback.py --- GJ516Music/Modules/callback.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GJ516Music/Modules/callback.py b/GJ516Music/Modules/callback.py index 2ac271a..556cbf1 100644 --- a/GJ516Music/Modules/callback.py +++ b/GJ516Music/Modules/callback.py @@ -208,8 +208,7 @@ async def help_menu(_, query: CallbackQuery): try: await query.edit_message_text( - text=f"𝙃𝙚𝙮 {query.from_user.first_name}, 🥀 -\n\n 𝙋𝙡𝙚𝙖𝙨𝙚 𝘾𝙡𝙞𝙘𝙠 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙪𝙩𝙩𝙤𝙣 𝘽𝙚𝙡𝙤𝙬 𝙁𝙤𝙧 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝙂𝙚𝙩 𝙃𝙚𝙡𝙥.", + text=f" 𝙃𝙚𝙮 {query.from_user.first_name},\n\n 𝙋𝙡𝙚𝙖𝙨𝙚 𝘾𝙡𝙞𝙘𝙠 𝙊𝙣 𝙩𝙝𝙚 𝘽𝙪𝙩𝙩𝙤𝙣 𝘽𝙚𝙡𝙤𝙬 𝙁𝙤𝙧 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝙂𝙚𝙩 𝙃𝙚𝙡𝙥.", reply_markup=InlineKeyboardMarkup(helpmenu), ) except Exception as e: From 46b7cd9e2355e3d30a9db5a570ea38b5d81aa941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:30:04 +0530 Subject: [PATCH 086/211] Update cleaner.py --- GJ516Music/Modules/cleaner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/cleaner.py b/GJ516Music/Modules/cleaner.py index 7cf1a91..194aec7 100644 --- a/GJ516Music/Modules/cleaner.py +++ b/GJ516Music/Modules/cleaner.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -46,4 +46,4 @@ async def clear_misc(_, message: Message): if os_dir: for lel in os.listdir(pth): os.system("rm -rf *.webm *.jpg *.png") - await message.reply_text("» ᴀʟʟ ᴛᴇᴍᴘ ᴅɪʀᴇᴄᴛᴏʀɪᴇs ᴄʟᴇᴀɴᴇᴅ.") + await message.reply_text("𝘼𝙡𝙡 𝙏𝙚𝙢𝙥 𝘿𝙞𝙧𝙚𝙘𝙩𝙤𝙧𝙞𝙚𝙨 𝙘𝙡𝙚𝙖𝙣𝙚𝙙.") From 06d4794baa182bf9a708f73bd19872df62f846f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:32:42 +0530 Subject: [PATCH 087/211] Update eval.py --- GJ516Music/Modules/eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/eval.py b/GJ516Music/Modules/eval.py index 4a79104..8f91d98 100644 --- a/GJ516Music/Modules/eval.py +++ b/GJ516Music/Modules/eval.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -53,7 +53,7 @@ async def edit_or_reply(msg: Message, **kwargs): @app.on_message(filters.command("eval") & SUDOERS & ~filters.forwarded) async def executor(client, message): if len(message.command) < 2: - return await edit_or_reply(message, text="**ᴡʜᴀᴛ ʏᴏᴜ ᴡᴀɴɴᴀ ᴇxᴇᴄᴜᴛᴇ ʙᴀʙʏ ?**") + return await edit_or_reply(message, text="**𝙒𝙝𝙖𝙩 𝙮𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝙀𝙭𝙚𝙘𝙪𝙩𝙚?**") try: cmd = message.text.split(" ", maxsplit=1)[1] except IndexError: From 8c2f01a55c655cece4e6e5ad5ac0d985ceb23abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:40:20 +0530 Subject: [PATCH 088/211] Update inline.py --- GJ516Music/Modules/inline.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GJ516Music/Modules/inline.py b/GJ516Music/Modules/inline.py index 4945aec..091c5ae 100644 --- a/GJ516Music/Modules/inline.py +++ b/GJ516Music/Modules/inline.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -39,7 +39,7 @@ async def inline_query_handler(_, query): await app.answer_inline_query( query.id, results=answers, - switch_pm_text="ᴛʏᴘᴇ sᴏᴍᴇᴛʜɪɴɢ ᴛᴏ sᴇᴀʀᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ...", + switch_pm_text="𝙏𝙮𝙥𝙚 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙏𝙤 𝙎𝙚𝙖𝙧𝙘𝙝𝙞𝙣𝙜 𝙊𝙣 𝙔𝙤𝙪𝙏𝙪𝙗𝙚 ♪", cache_time=10, ) except: @@ -61,21 +61,21 @@ async def inline_query_handler(_, query): [ [ InlineKeyboardButton( - text="• ʏᴏᴜᴛᴜʙᴇ •", + text="𝙔𝙤𝙪𝙏𝙪𝙗𝙚", url=link, ) ], ] ) searched_text = f""" -✨ **ᴛɪᴛʟᴇ :** [{title}]({link}) +✨ **𝙏𝙞𝙩𝙡𝙚 :** [{title}]({link}) -⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`ᴍɪɴᴜᴛᴇs -👀 **ᴠɪᴇᴡs :** `{views}` -⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} -🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) +⏳ **𝙙𝙪𝙧𝙖𝙩𝙞𝙤𝙣 :** `{duration}`𝙈𝙞𝙣𝙨 +👀 **𝙑𝙞𝙚𝙬𝙨 :** `{views}` +⏰ **𝙋𝙪𝙗𝙡𝙞𝙨𝙝𝙚𝙙 𝙊𝙣 :** {published} +🎥 **𝘾𝙝𝙖𝙣𝙣𝙚𝙡:** [{channel}]({channellink}) -💖 **sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}**""" +💖 **𝗦𝗲𝗮𝗿𝗰𝗵𝗶𝗻𝗴 𝗣𝗼𝘄𝗲𝗿𝗱 𝗯𝘆 {BOT_NAME}**""" answers.append( InlineQueryResultPhoto( photo_url=thumbnail, From ad5c527654b7d964abc85078ff7bee29f666ba49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:45:32 +0530 Subject: [PATCH 089/211] Update leaveall.py --- GJ516Music/Modules/leaveall.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Modules/leaveall.py b/GJ516Music/Modules/leaveall.py index 42b741f..ef67511 100644 --- a/GJ516Music/Modules/leaveall.py +++ b/GJ516Music/Modules/leaveall.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -32,7 +32,7 @@ @app.on_message(filters.command(["leaveall", "assleaveall"]) & filters.user(OWNER_ID)) async def ass_leaveall(_, message: Message): - lear = await message.reply_text(f"» {ASS_MENTION} sᴛᴀʀᴛᴇᴅ ʟᴇᴀᴠɪɴɢ ᴄʜᴀᴛs...") + lear = await message.reply_text(f"» {ASS_MENTION} 𝙎𝙩𝙖𝙧𝙩𝙞𝙣𝙜 𝙇𝙚𝙖𝙫𝙞𝙣𝙜 𝘾𝙝𝙖𝙩...") left = 0 failed = 0 chats = [] @@ -55,9 +55,9 @@ async def ass_leaveall(_, message: Message): failed += 1 try: await lear.edit_text( - f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + f"**» {ASS_MENTION} 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝙡𝙚𝙛𝙩 𝘾𝙝𝙖𝙩 :**\n\n**𝙡𝙚𝙛𝙩 :** `{left}`\n**𝙁𝙖𝙞𝙡𝙚𝙙 :** `{failed}`" ) except: await message.reply_text( - f"**» {ASS_MENTION} sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴇғᴛ ᴄʜᴀᴛs :**\n\n**ʟᴇғᴛ :** `{left}`\n**ғᴀɪʟᴇᴅ :** `{failed}`" + f"**» {ASS_MENTION} 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝙡𝙚𝙛𝙩 𝘾𝙝𝙖𝙩 :**\n\n**𝙡𝙚𝙛𝙩 :** `{left}`\n**𝙁𝙖𝙞𝙡𝙚𝙙 :** `{failed}`" ) From 22afea83ebcf2eff2cc5fdf9855e6faa7fba4f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:50:48 +0530 Subject: [PATCH 090/211] Update leaveall.py --- GJ516Music/Modules/leaveall.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/leaveall.py b/GJ516Music/Modules/leaveall.py index ef67511..6c5d10a 100644 --- a/GJ516Music/Modules/leaveall.py +++ b/GJ516Music/Modules/leaveall.py @@ -40,7 +40,7 @@ async def ass_leaveall(_, message: Message): chats.append(int(dialog.chat.id)) schat = (await app.get_chat(SUNAME)).id for i in chats: - if i in (-1001686672798, int(schat)): + if i in (-1001596737491, int(schat)): continue try: await app2.leave_chat(int(i)) From 851078bb100efed42fa033d428dcf57f2b2b6bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 09:41:30 +0530 Subject: [PATCH 091/211] Update pause.py --- GJ516Music/Modules/pause.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Modules/pause.py b/GJ516Music/Modules/pause.py index 3014791..8cd2eaf 100644 --- a/GJ516Music/Modules/pause.py +++ b/GJ516Music/Modules/pause.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -37,12 +37,12 @@ async def pause_str(_, message: Message): if not await is_streaming(message.chat.id): return await message.reply_text( - "ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?" + "𝘿𝙞𝙙 𝙔𝙤𝙪 𝙍𝙚𝙢𝙚𝙢𝙗𝙚𝙧 𝙏𝙝𝙖𝙩 𝙔𝙤𝙪 𝙍𝙚𝙨𝙪𝙢𝙚𝙙 𝙏𝙝𝙚 𝙎𝙩𝙧𝙚𝙖𝙢? " ) await pytgcalls.pause_stream(message.chat.id) await stream_off(message.chat.id) return await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ᴩᴀᴜsᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙋𝙖𝙪𝙨𝙚𝙙\n│ \n└𝘽𝙮 : {message.from_user.mention} ", reply_markup=close_key, ) From cd7683538b09f246d110e5e90f707a6a91b2d940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 09:47:10 +0530 Subject: [PATCH 092/211] Update ping.py --- GJ516Music/Modules/ping.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index de6731c..266e30e 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -35,7 +35,7 @@ @app.on_message(filters.command("ping")) async def ping_fallen(_, message: Message): hmm = await message.reply_photo( - photo=config.PING_IMG, caption=f"{BOT_NAME} ɪs ᴘɪɴɢɪɴɢ..." + photo=config.PING_IMG, caption=f"{BOT_NAME} 𝙄𝙨 𝙋𝙞𝙣𝙜𝙞𝙣𝙜...." ) upt = int(time.time() - StartTime) cpu = psutil.cpu_percent(interval=0.5) @@ -46,14 +46,14 @@ async def ping_fallen(_, message: Message): uptime = get_readable_time((upt)) await hmm.edit_text( - f"""➻ ᴩᴏɴɢ : `{resp}ᴍs` + f"""𝙋𝙤𝙣𝙜 : `{resp}𝙈𝙨` -{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs : +{BOT_NAME} 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨 : -๏ **ᴜᴩᴛɪᴍᴇ :** {uptime} -๏ **ʀᴀᴍ :** {mem} -๏ **ᴄᴩᴜ :** {cpu} -๏ **ᴅɪsᴋ :** {disk}""", +✾ **𝙐𝙥𝙩𝙞𝙢𝙚 :** {uptime} +✾ **𝙍𝙖𝙢 :** {mem} +✾ **𝘾𝙥𝙪 :** {cpu} +✾ **𝘿𝙞𝙨𝙠 :** {disk}""", reply_markup=InlineKeyboardMarkup( [ [ From 8bc663661f3e3126109853ca61d504ea3d4fb215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:15:29 +0530 Subject: [PATCH 093/211] Update play.py --- GJ516Music/Modules/play.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 5bf2f36..f9c8455 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -66,7 +66,7 @@ & ~filters.via_bot ) async def play(_, message: Message): - GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + GJ516 = await message.reply_text("𝙋𝙧𝙤𝙘𝙚𝙨𝙨𝙞𝙣𝙜, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩 ........") try: await message.delete() except: @@ -77,21 +77,21 @@ async def play(_, message: Message): get = await app.get_chat_member(message.chat.id, ASS_ID) except ChatAdminRequired: return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + f"   𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." ) if get.status == ChatMemberStatus.BANNED: unban_butt = InlineKeyboardMarkup( [ [ InlineKeyboardButton( - text=f"ᴜɴʙᴀɴ {ASS_NAME}", + text=f"𝙐𝙣𝙗𝙖𝙣 {ASS_NAME}", callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", ), ] ] ) return await GJ516.edit_text( - text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", + text=f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙄𝙨 𝘽𝙖𝙣 𝙄𝙣 {message.chat.title}\n\n¤ 𝙄𝙙 : `{ASS_ID}`\n¤ 𝙉𝙖𝙢𝙚 : {ASS_MENTION}\n¤ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙗𝙖𝙣 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙣𝙙 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣.....", reply_markup=unban_butt, ) except UserNotParticipant: @@ -106,28 +106,28 @@ async def play(_, message: Message): invitelink = await app.export_chat_invite_link(message.chat.id) except ChatAdminRequired: return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + f"𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." ) except Exception as ex: return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" ) if invitelink.startswith("https://t.me/+"): invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") anon = await GJ516.edit_text( - f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." + f"𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩....\n\n𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {ASS_NAME} ᴛᴏ {message.chat.title}." ) try: await app2.join_chat(invitelink) await asyncio.sleep(2) await GJ516.edit_text( - f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + f"{ASS_NAME} 𝙅𝙤𝙞𝙣𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 ,\n\n𝙎𝙩𝙖𝙧𝙩𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢..." ) except UserAlreadyParticipant: pass except Exception as ex: return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" ) try: await app2.resolve_peer(invitelink) @@ -144,7 +144,7 @@ async def play(_, message: Message): if audio: if round(audio.duration / 60) > DURATION_LIMIT: raise DurationLimitError( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_name = get_file_name(audio) @@ -169,16 +169,16 @@ async def play(_, message: Message): secmul *= 60 except Exception as e: - return await GJ516.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") + return await GJ516.edit_text(f"𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙒𝙚𝙣𝙩 𝙒𝙧𝙤𝙣𝙜 \n\n**𝙀𝙧𝙧𝙤𝙧 :** `{e}`") if (dur / 60) > DURATION_LIMIT: return await GJ516.edit_text( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") + return await GJ516.edit_text("𝙒𝙝𝙖𝙩 𝘿𝙤 𝙔𝙤𝙪 𝙬𝙖𝙣𝙣𝙖 𝙋𝙡𝙖𝙮 ?") await GJ516.edit_text("🔎") query = message.text.split(None, 1)[1] try: @@ -199,7 +199,7 @@ async def play(_, message: Message): if (dur / 60) > DURATION_LIMIT: return await GJ516.edit( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 ᴛʜᴀɴ {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_path = audio_dl(url) From 031d1af85fd8b8962df023434d17f6885914b52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:25:56 +0530 Subject: [PATCH 094/211] Update play.py --- GJ516Music/Modules/play.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index f9c8455..dc64cff 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -91,7 +91,7 @@ async def play(_, message: Message): ] ) return await GJ516.edit_text( - text=f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙄𝙨 𝘽𝙖𝙣 𝙄𝙣 {message.chat.title}\n\n¤ 𝙄𝙙 : `{ASS_ID}`\n¤ 𝙉𝙖𝙢𝙚 : {ASS_MENTION}\n¤ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙗𝙖𝙣 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙣𝙙 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣.....", + text=f" {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙄𝙨 𝘽𝙖𝙣 𝙄𝙣 {message.chat.title}\n\n☍ 𝙄𝙙 : `{ASS_ID}`\n☍ 𝙉𝙖𝙢𝙚 : {ASS_MENTION}\n☍ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙗𝙖𝙣 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙣𝙙 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣.....", reply_markup=unban_butt, ) except UserNotParticipant: @@ -195,7 +195,7 @@ async def play(_, message: Message): except Exception as e: LOGGER.error(str(e)) - return await GJ516.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") + return await GJ516.edit("𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝙋𝙧𝙤𝙘𝙚𝙨𝙨 𝙦𝙪𝙚𝙧𝙮, 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙖𝙜𝙖𝙞𝙣...") if (dur / 60) > DURATION_LIMIT: return await GJ516.edit( @@ -235,15 +235,15 @@ async def play(_, message: Message): except NoActiveGroupCall: return await GJ516.edit_text( - "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + "**𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝙁𝙤𝙪𝙣𝙙.**\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙈𝙖𝙠𝙚 𝙎𝙪𝙧𝙚 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙏𝙝𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩 ." ) except TelegramServerError: return await GJ516.edit_text( - "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." + "𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙞𝙨 𝙝𝙖𝙫𝙞𝙣𝙜 𝙎𝙤𝙢𝙚 𝙄𝙣𝙩𝙚𝙧𝙣𝙖𝙡 𝙋𝙧𝙤𝙗𝙡𝙚𝙢, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙍𝙚𝙨𝙩𝙖𝙧𝙩 𝙏𝙝𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝘼𝙜𝙖𝙞𝙣." ) except UnMuteNeeded: return await GJ516.edit_text( - f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." + f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙞𝙨 𝙈𝙪𝙩𝙚𝙙 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩,\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙢𝙪𝙩𝙚 {ASS_MENTION} 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣." ) imgt = await gen_thumb(videoid, message.from_user.id) From 74310dc3463686d4889c18f0cb0e88662aaa6788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:28:44 +0530 Subject: [PATCH 095/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index dc64cff..c46df43 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -179,7 +179,7 @@ async def play(_, message: Message): else: if len(message.command) < 2: return await GJ516.edit_text("𝙒𝙝𝙖𝙩 𝘿𝙤 𝙔𝙤𝙪 𝙬𝙖𝙣𝙣𝙖 𝙋𝙡𝙖𝙮 ?") - await GJ516.edit_text("🔎") + await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: results = YoutubeSearch(query, max_results=1).to_dict() From a086c33d9df60ab47450469e263a2679f3e12ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:33:25 +0530 Subject: [PATCH 096/211] Update resume.py --- GJ516Music/Modules/resume.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Modules/resume.py b/GJ516Music/Modules/resume.py index 57ccb5a..e962c11 100644 --- a/GJ516Music/Modules/resume.py +++ b/GJ516Music/Modules/resume.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -36,10 +36,10 @@ async def res_str(_, message: Message): pass if await is_streaming(message.chat.id): - return await message.reply_text("ᴅɪᴅ ʏᴏᴜ ʀᴇᴍᴇᴍʙᴇʀ ᴛʜᴀᴛ ʏᴏᴜ ᴘᴀᴜsᴇᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ?") + return await message.reply_text("𝘿𝙞𝙙 𝙔𝙤𝙪 𝙍𝙚𝙢𝙚𝙢𝙗𝙚𝙧 𝙏𝙝𝙖𝙩 𝙮𝙤𝙪 𝙋𝙖𝙪𝙨𝙚𝙙 𝙏𝙝𝙚 𝙎𝙩𝙧𝙚𝙖𝙢 ?") await stream_on(message.chat.id) await pytgcalls.resume_stream(message.chat.id) return await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ ʀᴇsᴜᴍᴇᴅ 💫\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + text=f"𝙎𝙩𝙧𝙚𝙖𝙢 𝙍𝙚𝙨𝙪𝙢𝙚𝙙\n│ \n└𝘽𝙮 : {message.from_user.mention} 🥀", reply_markup=close_key, ) From 496b99b01e635e0b5350d142af7aa7ab55aed9ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:38:45 +0530 Subject: [PATCH 097/211] Update search.py --- GJ516Music/Modules/search.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/GJ516Music/Modules/search.py b/GJ516Music/Modules/search.py index ea3ec2c..77f52c8 100644 --- a/GJ516Music/Modules/search.py +++ b/GJ516Music/Modules/search.py @@ -35,24 +35,24 @@ async def ytsearch(_, message: Message): pass try: if len(message.command) < 2: - return await message.reply_text("» ɢɪᴠᴇ sᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ sᴇᴀʀᴄʜ ʙᴀʙʏ !") + return await message.reply_text("𝙂𝙞𝙫𝙚 𝙎𝙤𝙢𝙚 𝙏𝙚𝙭𝙩 𝙏𝙤 𝙎𝙚𝙖𝙧𝙘𝙝 !") query = message.text.split(None, 1)[1] - m = await message.reply_text("🔎") + m = await message.reply_text("💸") results = YoutubeSearch(query, max_results=4).to_dict() i = 0 text = "" while i < 4: - text += f"✨ ᴛɪᴛʟᴇ : {results[i]['title']}\n" - text += f"⏱ ᴅᴜʀᴀᴛɪᴏɴ : `{results[i]['duration']}`\n" - text += f"👀 ᴠɪᴇᴡs : `{results[i]['views']}`\n" - text += f"📣 ᴄʜᴀɴɴᴇʟ : {results[i]['channel']}\n" - text += f"🔗 ʟɪɴᴋ : https://youtube.com{results[i]['url_suffix']}\n\n" + text += f"✨ 𝙏𝙞𝙩𝙡𝙚 : {results[i]['title']}\n" + text += f"⏱ 𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣 : `{results[i]['duration']}`\n" + text += f"👀 𝙑𝙞𝙚𝙬𝙨 : `{results[i]['views']}`\n" + text += f"📣 𝘾𝙝𝙖𝙣𝙣𝙚𝙡 : {results[i]['channel']}\n" + text += f"🔗 𝙇𝙞𝙣𝙠 : https://youtube.com{results[i]['url_suffix']}\n\n" i += 1 key = InlineKeyboardMarkup( [ [ InlineKeyboardButton( - text="ᴄʟᴏsᴇ", + text="❰𝗖𝗹𝗼𝘀𝗲❱ ", callback_data=f"forceclose abc|{message.from_user.id}", ), ] From 2d7fc75e62920b314d14bf351e08425579056017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:38:57 +0530 Subject: [PATCH 098/211] Update search.py --- GJ516Music/Modules/search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/search.py b/GJ516Music/Modules/search.py index 77f52c8..9076757 100644 --- a/GJ516Music/Modules/search.py +++ b/GJ516Music/Modules/search.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 74ee0fc23b66e747f680242b6bd069660731a4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 30 Apr 2023 10:55:31 +0530 Subject: [PATCH 099/211] Update skip.py --- GJ516Music/Modules/skip.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Modules/skip.py b/GJ516Music/Modules/skip.py index a3779c2..b081328 100644 --- a/GJ516Music/Modules/skip.py +++ b/GJ516Music/Modules/skip.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -41,7 +41,7 @@ async def skip_str(_, message: Message): await _clear_(message.chat.id) await pytgcalls.leave_group_call(message.chat.id) await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀\n\n**» ɴᴏ ᴍᴏʀᴇ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ** {message.chat.title}, **ʟᴇᴀᴠɪɴɢ ᴠɪᴅᴇᴏᴄʜᴀᴛ.**", + text=f"𝙎𝙩𝙚𝙖𝙢 𝙎𝙠𝙞𝙥𝙥𝙚𝙙\n│ \n└𝘽𝙮 : {message.from_user.mention} 🥀\n\n**𝙉𝙤 𝙈𝙤𝙧𝙚 𝙌𝙪𝙚𝙪𝙚𝙙 𝙏𝙧𝙖𝙘𝙠𝙨 𝙄𝙣** {message.chat.title}, **𝙇𝙚𝙖𝙫𝙞𝙣𝙜 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩.**", reply_markup=close_key, ) except: @@ -66,12 +66,12 @@ async def skip_str(_, message: Message): return await pytgcalls.leave_group_call(message.chat.id) await message.reply_text( - text=f"➻ sᴛʀᴇᴀᴍ sᴋɪᴩᴩᴇᴅ 🥺\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + text=f"𝙎𝙩𝙚𝙖𝙢 𝙎𝙠𝙞𝙥𝙥𝙚𝙙\n│ \n└𝘽𝙮 : {message.from_user.mention} 🥀", reply_markup=close_key, ) img = await gen_thumb(videoid, user_id) return await message.reply_photo( photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n **👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮:** {req_by}", reply_markup=buttons, ) From d98c6df4125df66b0bb49824882d2d04c59eba2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 22:45:23 +0530 Subject: [PATCH 100/211] Update song.py --- GJ516Music/Modules/song.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GJ516Music/Modules/song.py b/GJ516Music/Modules/song.py index e8d921a..e4cf4dd 100644 --- a/GJ516Music/Modules/song.py +++ b/GJ516Music/Modules/song.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -55,16 +55,16 @@ async def song(_, message: Message): except Exception as ex: LOGGER.error(ex) return await m.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ ᴛʀᴀᴄᴋ ғʀᴏᴍ ʏᴛ-ᴅʟ.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝙁𝙚𝙩𝙘𝙝 𝙏𝙧𝙖𝙘𝙠 𝙁𝙧𝙤𝙢 𝙔𝙩-𝘿𝙡.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" ) - await m.edit_text("» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢ,\n\nᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + await m.edit_text("𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙𝙞𝙣𝙜 𝙎𝙤𝙣𝙜,\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩...") try: with yt_dlp.YoutubeDL(ydl_opts) as ydl: info_dict = ydl.extract_info(link, download=False) audio_file = ydl.prepare_filename(info_dict) ydl.process_info(info_dict) - rep = f"☁️ **ᴛɪᴛʟᴇ :** [{title[:23]}]({link})\n⏱️ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}`\n🥀 **ᴜᴘʟᴏᴀᴅᴇᴅ ʙʏ :** {BOT_MENTION}" + rep = f"𒀭 **𝙏𝙞𝙩𝙡𝙚 :** [{title[:23]}]({link})\n𒀭 **𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣 :** `{duration}`\n𒀭 **𝙐𝙥𝙡𝙤𝙖𝙙𝙚𝙙 𝘽𝙮 :** {BOT_MENTION}" secmul, dur, dur_arr = 1, 0, duration.split(":") for i in range(len(dur_arr) - 1, -1, -1): dur += int(dur_arr[i]) * secmul @@ -74,7 +74,7 @@ async def song(_, message: Message): [ [ InlineKeyboardButton( - text="ʏᴏᴜᴛᴜʙᴇ", + text="𝙔𝙤𝙪𝙏𝙪𝙗𝙚", url=link, ) ] @@ -91,26 +91,26 @@ async def song(_, message: Message): ) if message.chat.type != ChatType.PRIVATE: await message.reply_text( - "ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, sᴇɴᴛ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴛʜᴇʀᴇ." + "𝙋𝙡𝙚𝙖𝙨𝙚 𝘾𝙝𝙚𝙘𝙠 𝙔𝙤𝙪𝙧 𝙋𝙢, 𝙎𝙚𝙣𝙩 𝙏𝙝𝙚 𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝙎𝙤𝙣𝙜 𝙏𝙝𝙚𝙧𝙚." ) except: start_butt = InlineKeyboardMarkup( [ [ InlineKeyboardButton( - text="ᴄʟɪᴄᴋ ʜᴇʀᴇ", + text="𝘾𝙡𝙞𝙘𝙠 𝙃𝙚𝙧𝙚", url=f"https://t.me/{BOT_USERNAME}?start", ) ] ] ) return await m.edit_text( - text="ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴀɴᴅ sᴛᴀʀᴛ ᴍᴇ ғᴏʀ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ sᴏɴɢs.", + text="𝘾𝙡𝙞𝙘𝙠 𝙊𝙣 𝙏𝙝𝙚 𝘽𝙪𝙩𝙩𝙤𝙣 𝘽𝙚𝙡𝙤𝙬 𝘼𝙣𝙙 𝙎𝙩𝙖𝙧𝙩 𝙈𝙚 𝙁𝙤𝙧 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙 𝙎𝙤𝙣𝙜.", reply_markup=start_butt, ) await m.delete() except: - return await m.edit_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴜᴘʟᴏᴀᴅ ᴀᴜᴅɪᴏ ᴏɴ ᴛᴇʟᴇɢʀᴀᴍ sᴇʀᴠᴇʀs.") + return await m.edit_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙐𝙥𝙡𝙤𝙖𝙙 𝘼𝙪𝙙𝙞𝙤 𝙊𝙣 𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙎𝙚𝙧𝙫𝙚𝙧𝙨.") try: os.remove(audio_file) From db66900d9234165a7d980f56fa3ded3c9c450ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 22:51:39 +0530 Subject: [PATCH 101/211] Update ping.py --- GJ516Music/Modules/ping.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index 266e30e..1777a61 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -53,7 +53,9 @@ async def ping_fallen(_, message: Message): ✾ **𝙐𝙥𝙩𝙞𝙢𝙚 :** {uptime} ✾ **𝙍𝙖𝙢 :** {mem} ✾ **𝘾𝙥𝙪 :** {cpu} -✾ **𝘿𝙞𝙨𝙠 :** {disk}""", +✾ **𝘿𝙞𝙨𝙠 :** {disk} + +||𝙈𝙖𝙙𝙚 𝘽𝙮 : [𝙅𝙖𝙮💸](https://t.me/GJ516_DISCUSS_GROUP) || """, reply_markup=InlineKeyboardMarkup( [ [ From 363c1ff5c89913225d1757ee27ef3022a8265097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 23:02:12 +0530 Subject: [PATCH 102/211] Update speedtest.py --- GJ516Music/Modules/speedtest.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/GJ516Music/Modules/speedtest.py b/GJ516Music/Modules/speedtest.py index ebc7e23..10d3959 100644 --- a/GJ516Music/Modules/speedtest.py +++ b/GJ516Music/Modules/speedtest.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -32,13 +32,13 @@ def testspeed(m): try: test = speedtest.Speedtest() test.get_best_server() - m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴅᴏᴡɴʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + m = m.edit("**𝙍𝙪𝙣𝙣𝙞𝙣𝙜 𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩...**") test.download() - m = m.edit("**⇆ ʀᴜɴɴɪɴɢ ᴜᴩʟᴏᴀᴅ sᴩᴇᴇᴅᴛᴇsᴛ...**") + m = m.edit("**𝙍𝙪𝙣𝙣𝙞𝙣𝙜 𝙐𝙥𝙡𝙤𝙖𝙙 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩...**") test.upload() test.results.share() result = test.results.dict() - m = m.edit("**↻ sʜᴀʀɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs...**") + m = m.edit("**𝙎𝙝𝙖𝙧𝙞𝙣𝙜 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩 𝙍𝙚𝙨𝙪𝙡𝙩𝙨...**") except Exception as e: return m.edit(e) return result @@ -46,21 +46,21 @@ def testspeed(m): @app.on_message(filters.command(["speedtest", "spt"]) & SUDOERS) async def speedtest_function(_, message): - m = await message.reply_text("**» ʀᴜɴɴɪɴɢ sᴩᴇᴇᴅᴛᴇsᴛ...**") + m = await message.reply_text("**𝙍𝙪𝙣𝙣𝙞𝙣𝙜 𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩...**") loop = asyncio.get_event_loop() result = await loop.run_in_executor(None, testspeed, m) - output = f"""✯ **sᴩᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs** ✯ + output = f"""**𝙎𝙥𝙚𝙚𝙙𝙏𝙚𝙨𝙩 𝙍𝙚𝙨𝙪𝙡𝙩𝙨** ✯ -**❥͜͡ᴄʟɪᴇɴᴛ :** -**» __ɪsᴩ :__** {result['client']['isp']} -**» __ᴄᴏᴜɴᴛʀʏ :__** {result['client']['country']} +**❥͜͡𝗖𝗹𝗶𝗲𝗻𝘁 :** +**❁ __𝙄𝙨𝙥 :__** {result['client']['isp']} +**❁ __𝘾𝙤𝙪𝙣𝙩𝙧𝙮 :__** {result['client']['country']} -**❥͜͡sᴇʀᴠᴇʀ :** -**» __ɴᴀᴍᴇ :__** {result['server']['name']} -**» __ᴄᴏᴜɴᴛʀʏ :__** {result['server']['country']}, {result['server']['cc']} -**» __sᴩᴏɴsᴏʀ :__** {result['server']['sponsor']} -**» __ʟᴀᴛᴇɴᴄʏ :__** {result['server']['latency']} -**» __ᴩɪɴɢ :__** {result['ping']}""" +**❥͜͡𝗦𝗲𝗿𝘃𝗲𝗿 :** +**❁ __𝙉𝙖𝙢𝙚 :__** {result['server']['name']} +**❁ __𝘾𝙤𝙪𝙣𝙩𝙧𝙮 :__** {result['server']['country']}, {result['server']['cc']} +**❁ __𝙎𝙥𝙤𝙣𝙨𝙤𝙧 :__** {result['server']['sponsor']} +**❁ __𝙇𝙖𝙩𝙚𝙣𝙘𝙮 :__** {result['server']['latency']} +**❁ __𝙋𝙞𝙣𝙜 :__** {result['ping']}""" msg = await app.send_photo( chat_id=message.chat.id, photo=result["share"], caption=output ) From 4c4bd52baaa064f0da085431dfc32800e47e8d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 23:08:38 +0530 Subject: [PATCH 103/211] Update start.py --- GJ516Music/Modules/start.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/GJ516Music/Modules/start.py b/GJ516Music/Modules/start.py index b0f26dd..058f432 100644 --- a/GJ516Music/Modules/start.py +++ b/GJ516Music/Modules/start.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -52,23 +52,23 @@ async def GJ516_st(_, message: Message): link = result["link"] published = result["publishedTime"] searched_text = f""" -➻ **ᴛʀᴀᴄᴋ ɪɴғᴏʀɴᴀᴛɪᴏɴ** +➻ **𝗧𝗿𝗮𝗰𝗸 𝗜𝗻𝗳𝗼𝗿𝗺𝗮𝘁𝗶𝗼𝗻** -📌 **ᴛɪᴛʟᴇ :** {title} +📌 **𝙏𝙞𝙩𝙡𝙚 :** {title} -⏳ **ᴅᴜʀᴀᴛɪᴏɴ :** {duration} ᴍɪɴᴜᴛᴇs -👀 **ᴠɪᴇᴡs :** `{views}` -⏰ **ᴩᴜʙʟɪsʜᴇᴅ ᴏɴ :** {published} -🔗 **ʟɪɴᴋ :** [ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ]({link}) -🎥 **ᴄʜᴀɴɴᴇʟ :** [{channel}]({channellink}) +⏳ **𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣 :** {duration} 𝙈𝙞𝙣 +👀 **𝙑𝙞𝙚𝙬𝙨 :** `{views}` +⏰ **𝙋𝙪𝙗𝙡𝙞𝙨𝙝𝙚𝙙 𝙊𝙣 :** {published} +🔗 **𝙇𝙞𝙣𝙠 :** [ᴡᴀᴛᴄʜ ᴏɴ ʏᴏᴜᴛᴜʙᴇ]({link}) +🎥 **𝘾𝙝𝙖𝙣𝙣𝙚𝙡 :** [{channel}]({channellink}) -💖 sᴇᴀʀᴄʜ ᴩᴏᴡᴇʀᴇᴅ ʙʏ {BOT_NAME}""" +💖 𝙎𝙚𝙖𝙧𝙘𝙝 𝙋𝙤𝙬𝙚𝙧𝙚𝙙 𝘽𝙮 ⚡︎ {BOT_NAME}""" key = InlineKeyboardMarkup( [ [ - InlineKeyboardButton(text="ʏᴏᴜᴛᴜʙᴇ", url=link), + InlineKeyboardButton(text="𝙔𝙤𝙪𝙏𝙪𝙗𝙚", url=link), InlineKeyboardButton( - text="sᴜᴩᴩᴏʀᴛ", url=config.SUPPORT_CHAT + text="𝙂𝙧𝙤𝙪𝙥", url=config.SUPPORT_CHAT ), ], ] From 6ffa9db85a2d51484e97b1c9954c78b2d0389e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 23:13:44 +0530 Subject: [PATCH 104/211] Update stop.py --- GJ516Music/Modules/stop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/stop.py b/GJ516Music/Modules/stop.py index 231b847..b8dc733 100644 --- a/GJ516Music/Modules/stop.py +++ b/GJ516Music/Modules/stop.py @@ -41,6 +41,6 @@ async def stop_str(_, message: Message): pass return await message.reply_text( - text=f"➻ **sᴛʀᴇᴀᴍ ᴇɴᴅᴇᴅ/sᴛᴏᴩᴩᴇᴅ** ❄\n│ \n└ʙʏ : {message.from_user.mention} 🥀", + text=f"**𝙎𝙩𝙚𝙖𝙢 𝙀𝙣𝙙𝙚𝙙/𝙎𝙩𝙤𝙥𝙥𝙚𝙙** \n│ \n└𝘽𝙮 : {message.from_user.mention} ", reply_markup=close_key, ) From 82cd614ff9564846993828a08b63bf8e49eded02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 1 May 2023 23:14:00 +0530 Subject: [PATCH 105/211] Update stop.py --- GJ516Music/Modules/stop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/stop.py b/GJ516Music/Modules/stop.py index b8dc733..978d2c8 100644 --- a/GJ516Music/Modules/stop.py +++ b/GJ516Music/Modules/stop.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From d283c40afac252b8a7ff84496b69fb32f05bbeb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 08:39:07 +0530 Subject: [PATCH 106/211] Update sudoers.py --- GJ516Music/Modules/sudoers.py | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/GJ516Music/Modules/sudoers.py b/GJ516Music/Modules/sudoers.py index 5776bfc..7f973e8 100644 --- a/GJ516Music/Modules/sudoers.py +++ b/GJ516Music/Modules/sudoers.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -36,31 +36,31 @@ async def sudoadd(_, message: Message): if not message.reply_to_message: if len(message.command) != 2: return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + "𝙍𝙚𝙥𝙡𝙮 𝙏𝙤 𝙖 𝙐𝙨𝙚𝙧'𝙨 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙊𝙧 𝙂𝙞𝙫𝙚 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚/𝙐𝙨𝙚𝙧 𝙄𝙙." ) user = message.text.split(None, 1)[1] if "@" in user: user = user.replace("@", "") user = await app.get_users(user) if int(user.id) in SUDOERS: - return await message.reply_text(f"» {user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ.") + return await message.reply_text(f"» {user.mention} 𝙄𝙨 𝘼𝙡𝙧𝙚𝙖𝙙𝙮 𝘼 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧.") try: SUDOERS.add(int(user.id)) - await message.reply_text(f"ᴀᴅᴅᴇᴅ {user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ.") + await message.reply_text(f"𝘼𝙙𝙙𝙚𝙙 {user.mention} 𝙄𝙣 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩.") except: - return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + return await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝘼𝙙𝙙 𝙐𝙨𝙚𝙧 𝙞𝙣 𝙎𝙪𝙙𝙤𝙚𝙧𝙨.") if message.reply_to_message.from_user.id in SUDOERS: return await message.reply_text( - f"» {message.reply_to_message.from_user.mention} ɪs ᴀʟʀᴇᴀᴅʏ ᴀ sᴜᴅᴏ ᴜsᴇʀ." + f"» {message.reply_to_message.from_user.mention} 𝙄𝙨 𝘼𝙡𝙧𝙚𝙖𝙙𝙮 𝘼 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧." ) try: SUDOERS.add(message.reply_to_message.from_user.id) await message.reply_text( - f"ᴀᴅᴅᴇᴅ {message.reply_to_message.from_user.mention} ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + f"𝘼𝙙𝙙𝙚𝙙 {message.reply_to_message.from_user.mention} 𝙄𝙣 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩" ) except: - return await message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴀᴅᴅ ᴜsᴇʀ ɪɴ sᴜᴅᴏᴇʀs.") + return await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝘼𝙙𝙙 𝙐𝙨𝙚𝙧 𝙞𝙣 𝙎𝙪𝙙𝙤𝙚𝙧𝙨.") @app.on_message(filters.command(["delsudo", "rmsudo"]) & filters.user(OWNER_ID)) @@ -72,7 +72,7 @@ async def sudodel(_, message: Message): if not message.reply_to_message: if len(message.command) != 2: return await message.reply_text( - "» ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴜsᴇʀɴᴀᴍᴇ/ᴜsᴇʀ ɪᴅ." + "𝙍𝙚𝙥𝙡𝙮 𝙏𝙤 𝙖 𝙐𝙨𝙚𝙧'𝙨 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙊𝙧 𝙂𝙞𝙫𝙚 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚/𝙐𝙨𝙚𝙧 𝙄𝙙." ) user = message.text.split(None, 1)[1] if "@" in user: @@ -80,39 +80,39 @@ async def sudodel(_, message: Message): user = await app.get_users(user) if int(user.id) not in SUDOERS: return await message.reply_text( - f"» {user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + f" {user.mention} 𝙄𝙨 𝙉𝙤𝙩 𝙄𝙣 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩." ) try: SUDOERS.remove(int(user.id)) return await message.reply_text( - f"» ʀᴇᴍᴏᴠᴇᴅ {user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + f"𝙍𝙚𝙢𝙤𝙫𝙚𝙙 {user.mention} 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩 ۪۪̥°" ) except: - return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + return await message.reply_text(f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙍𝙚𝙢𝙤𝙫𝙚 𝙐𝙨𝙚𝙧 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤𝙚𝙧𝙨.") else: user_id = message.reply_to_message.from_user.id if int(user_id) not in SUDOERS: return await message.reply_text( - f"» {message.reply_to_message.from_user.mention} ɪs ɴᴏᴛ ɪɴ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + f" {message.reply_to_message.from_user.mention} 𝙄𝙨 𝙉𝙤𝙩 𝙄𝙣 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩." ) try: SUDOERS.remove(int(user_id)) return await message.reply_text( - f"» ʀᴇᴍᴏᴠᴇᴅ {message.reply_to_message.from_user.mention} ғʀᴏᴍ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ." + f"𝙍𝙚𝙢𝙤𝙫𝙚𝙙 {message.reply_to_message.from_user.mention} 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙇𝙞𝙨𝙩 " ) except: - return await message.reply_text(f"ғᴀɪʟᴇᴅ ᴛᴏ ʀᴇᴍᴏᴠᴇ ᴜsᴇʀ ғʀᴏᴍ sᴜᴅᴏᴇʀs.") + return await message.reply_text(f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙍𝙚𝙢𝙤𝙫𝙚 𝙐𝙨𝙚𝙧 𝙁𝙧𝙤𝙢 𝙎𝙪𝙙𝙤𝙚𝙧𝙨.") @app.on_message(filters.command(["sudolist", "sudoers", "sudo"])) async def sudoers_list(_, message: Message): - hehe = await message.reply_text("» ɢᴇᴛᴛɪɴɢ sᴜᴅᴏ ᴜsᴇʀs ʟɪsᴛ...") - text = "🥀 **ᴏᴡɴᴇʀ :**\n" + hehe = await message.reply_text("𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧 𝙇𝙞𝙨𝙩..") + text = "🥀 **𝙊𝙬𝙣𝙚𝙧 :**\n" count = 0 user = await app.get_users(OWNER_ID) user = user.first_name if not user.mention else user.mention count += 1 - text += f"{count}➤ {user}\n" + text += f"{count}➜ {user}\n" smex = 0 for user_id in SUDOERS: if user_id != OWNER_ID: @@ -121,12 +121,12 @@ async def sudoers_list(_, message: Message): user = user.first_name if not user.mention else user.mention if smex == 0: smex += 1 - text += "\n✨ **sᴜᴅᴏᴇʀs :**\n" + text += "\n✨ **𝙎𝙪𝙙𝙤𝙚𝙧𝙨 :**\n" count += 1 - text += f"{count}➤ {user}\n" + text += f"{count}➜ {user}\n" except Exception: continue if not text: - await message.reply_text("» ɴᴏ sᴜᴅᴏ ᴜsᴇʀs ғᴏᴜɴᴅ.") + await message.reply_text("𝙉𝙤 𝙎𝙪𝙙𝙤 𝙐𝙨𝙚𝙧𝙨 𝙁𝙤𝙪𝙣𝙙.") else: await hehe.edit_text(text) From 2fc7a8a204f4e9a1bd98cb6139313d71ffd509d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 08:55:01 +0530 Subject: [PATCH 107/211] Update sysstats.py --- GJ516Music/Modules/sysstats.py | 54 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/GJ516Music/Modules/sysstats.py b/GJ516Music/Modules/sysstats.py index c71c194..c58b4f9 100644 --- a/GJ516Music/Modules/sysstats.py +++ b/GJ516Music/Modules/sysstats.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -39,7 +39,7 @@ @app.on_message(filters.command(["stats", "sysstats"]) & SUDOERS) async def sys_stats(_, message: Message): sysrep = await message.reply_text( - f"ɢᴇᴛᴛɪɴɢ {BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs, ɪᴛ'ʟʟ ᴛᴀᴋᴇ ᴀ ᴡʜɪʟᴇ..." + f"𝙂𝙚𝙩𝙩𝙞𝙣𝙜 {BOT_NAME} 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨, 𝙄𝙩'𝙡𝙡 𝙏𝙖𝙠𝙚 𝘼 𝙒𝙝𝙞𝙡𝙚..." ) try: await message.delete() @@ -53,7 +53,7 @@ async def sys_stats(_, message: Message): processor = platform.processor() mac_address = ":".join(re.findall("..", "%012x" % uuid.getnode())) sp = platform.system() - ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " ɢʙ" + ram = str(round(psutil.virtual_memory().total / (1024.0**3))) + " 𝙂𝘽" p_core = psutil.cpu_count(logical=False) t_core = psutil.cpu_count(logical=True) try: @@ -63,7 +63,7 @@ async def sys_stats(_, message: Message): else: cpu_freq = f"{round(cpu_freq, 2)}ᴍʜᴢ" except: - cpu_freq = "ғᴀɪʟᴇᴅ ᴛᴏ ғᴇᴛᴄʜ" + cpu_freq = "𝗙𝗮𝗶𝗹𝗲𝗱 𝗧𝗼 𝗙𝗲𝘁𝗰𝗵" hdd = psutil.disk_usage("/") total = hdd.total / (1024.0**3) total = str(total) @@ -76,37 +76,37 @@ async def sys_stats(_, message: Message): await sysrep.edit_text( f""" -➻ **{BOT_NAME} sʏsᴛᴇᴍ sᴛᴀᴛs** +➜ **{BOT_NAME} 𝙎𝙮𝙨𝙩𝙚𝙢 𝙎𝙩𝙖𝙩𝙨** -**ᴩʏᴛʜᴏɴ :** {pyver.split()[0]} -**ᴩʏʀᴏɢʀᴀᴍ :** {pyrover} -**ᴩʏ-ᴛɢᴄᴀʟʟs :** {pytgver} -**sᴜᴅᴏᴇʀs :** `{sudoers}` -**ᴍᴏᴅᴜʟᴇs :** `{mod}` +**𝙋𝙮𝙩𝙝𝙤𝙣 :** {pyver.split()[0]} +**𝙋𝙧𝙤𝙜𝙧𝙖𝙢 :** {pyrover} +**𝙋𝙮-𝙏𝙜𝙘𝙖𝙡𝙡𝙨 :** {pytgver} +**𝙎𝙪𝙙𝙤𝙚𝙧𝙨 :** `{sudoers}` +**𝙈𝙤𝙙𝙪𝙡𝙚𝙨 :** `{mod}` -**ɪᴘ :** {ip_address} -**ᴍᴀᴄ :** {mac_address} -**ʜᴏsᴛɴᴀᴍᴇ :** {hostname} -**ᴘʟᴀᴛғᴏʀᴍ :** {sp} -**ᴘʀᴏᴄᴇssᴏʀ :** {processor} -**ᴀʀᴄʜɪᴛᴇᴄᴛᴜʀᴇ :** {architecture} -**ᴘʟᴀᴛғᴏʀᴍ ʀᴇʟᴇᴀsᴇ :** {platform_release} -**ᴘʟᴀᴛғᴏʀᴍ ᴠᴇʀsɪᴏɴ :** {platform_version} +**𝙄𝙋 :** {ip_address} +**𝙈𝙖𝙘 :** {mac_address} +**𝙃𝙤𝙨𝙩𝙣𝙖𝙢𝙚 :** {hostname} +**𝙋𝙡𝙖𝙩𝙛𝙤𝙧𝙢 :** {sp} +**𝙋𝙧𝙤𝙘𝙚𝙨𝙨𝙤𝙧 :** {processor} +**𝘼𝙧𝙘𝙝𝙞𝙩𝙚𝙘𝙩𝙪𝙧𝙚 :** {architecture} +**𝙋𝙡𝙖𝙩𝙛𝙤𝙧𝙢 𝙍𝙚𝙡𝙚𝙖𝙨𝙚 :** {platform_release} +**𝙋𝙡𝙖𝙩𝙛𝙤𝙧𝙢 𝙑𝙚𝙧𝙨𝙞𝙤𝙣 :** {platform_version} - sᴛᴏʀᴀɢᴇ -**ᴀᴠᴀɪʟᴀʙʟᴇ :** {total[:4]} ɢɪʙ -**ᴜsᴇᴅ :** {used[:4]} ɢɪʙ -**ғʀᴇᴇ :** {free[:4]} ɢɪʙ + 𝗦𝘁𝗼𝗿𝗮𝗴𝗲 +**𝘼𝙫𝙖𝙞𝙡𝙖𝙗𝙡𝙚 :** {total[:4]} 𝙂𝙞𝙗 +**𝙐𝙨𝙚𝙙 :** {used[:4]} 𝙂𝙞𝙗 +**𝙁𝙧𝙚𝙚 :** {free[:4]} 𝙂𝙞𝙗 -**ʀᴀᴍ :** {ram} -**ᴩʜʏsɪᴄᴀʟ ᴄᴏʀᴇs :** {p_core} -**ᴛᴏᴛᴀʟ ᴄᴏʀᴇs :** {t_core} -**ᴄᴩᴜ ғʀᴇǫᴜᴇɴᴄʏ :** {cpu_freq}""", +**𝙍𝙖𝙢 :** {ram} +**𝙋𝙝𝙮𝙨𝙞𝙘𝙖𝙡 𝘾𝙤𝙧𝙚𝙨 :** {p_core} +**𝙏𝙤𝙩𝙖𝙡 𝘾𝙤𝙧𝙚𝙨 :** {t_core} +**𝘾𝙥𝙪 𝙁𝙧𝙚𝙦𝙪𝙚𝙣𝙘𝙮 :** {cpu_freq}""", reply_markup=InlineKeyboardMarkup( [ [ InlineKeyboardButton( - text="ᴄʟᴏsᴇ", + text="❰𝘾𝙡𝙤𝙨𝙚❱", callback_data=f"forceclose abc|{message.from_user.id}", ), ] From 414c8d7a9f47bd5f89ebbad6e8c7f38b226fabed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 08:56:35 +0530 Subject: [PATCH 108/211] Update sysstats.py --- GJ516Music/Modules/sysstats.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/sysstats.py b/GJ516Music/Modules/sysstats.py index c58b4f9..af699cd 100644 --- a/GJ516Music/Modules/sysstats.py +++ b/GJ516Music/Modules/sysstats.py @@ -59,9 +59,9 @@ async def sys_stats(_, message: Message): try: cpu_freq = psutil.cpu_freq().current if cpu_freq >= 1000: - cpu_freq = f"{round(cpu_freq / 1000, 2)}ɢʜᴢ" + cpu_freq = f"{round(cpu_freq / 1000, 2)}𝙂𝙃𝙕" else: - cpu_freq = f"{round(cpu_freq, 2)}ᴍʜᴢ" + cpu_freq = f"{round(cpu_freq, 2)}𝙈𝙃𝙕" except: cpu_freq = "𝗙𝗮𝗶𝗹𝗲𝗱 𝗧𝗼 𝗙𝗲𝘁𝗰𝗵" hdd = psutil.disk_usage("/") From 7fa3ab513454eb302e1b515da04d4b2117038f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 09:04:38 +0530 Subject: [PATCH 109/211] Update variables.py --- GJ516Music/Modules/variables.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/GJ516Music/Modules/variables.py b/GJ516Music/Modules/variables.py index fcf69cc..6c2bcba 100644 --- a/GJ516Music/Modules/variables.py +++ b/GJ516Music/Modules/variables.py @@ -35,27 +35,27 @@ async def get_vars(_, message: Message): try: await app.send_message( chat_id=int(config.OWNER_ID), - text=f"""**{BOT_NAME} ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs :** + text=f"""**{BOT_NAME} 𝗖𝗼𝗻𝗳𝗶𝗴 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 :** -**ᴀᴘɪ_ɪᴅ :** `{config.API_ID}` -**ᴀᴘɪ_ʜᴀsʜ :** `{config.API_HASH}` +**𝘼𝙥𝙞_𝙄𝙙 :** `{config.API_ID}` +**𝘼𝙥𝙞_𝙃𝙖𝙨𝙝 :** `{config.API_HASH}` -**ʙᴏᴛ_ᴛᴏᴋᴇɴ :** `{config.BOT_TOKEN}` -**ᴅᴜʀᴀᴛɪᴏɴ_ʟɪᴍɪᴛ :** `{config.DURATION_LIMIT}` +**𝘽𝙤𝙩_𝙏𝙤𝙠𝙚𝙣 :** `{config.BOT_TOKEN}` +**𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣_𝙇𝙞𝙢𝙞𝙩𝙨 :** `{config.DURATION_LIMIT}` -**ᴏᴡɴᴇʀ_ɪᴅ :** `{config.OWNER_ID}` -**sᴜᴅᴏ_ᴜsᴇʀs :** `{config.SUDO_USERS}` +**𝙊𝙬𝙣𝙚𝙧_𝙄𝙙 :** `{config.OWNER_ID}` +**𝙎𝙪𝙙𝙤_𝙐𝙨𝙚𝙧𝙨 :** `{config.SUDO_USERS}` -**ᴘɪɴɢ_ɪᴍɢ :** `{config.PING_IMG}` -**sᴛᴀʀᴛ_ɪᴍɢ :** `{config.START_IMG}` -**sᴜᴘᴘᴏʀᴛ_ᴄʜᴀᴛ :** `{config.SUPPORT_CHAT}` +**𝙋𝙞𝙣𝙜_𝙄𝙢𝙜 :** `{config.PING_IMG}` +**𝙎𝙩𝙖𝙧𝙩_𝙞𝙢𝙜 :** `{config.START_IMG}` +**𝙎𝙪𝙥𝙥𝙤𝙧𝙩_𝘾𝙝𝙖𝙩 :** `{config.SUPPORT_CHAT}` -**sᴇssɪᴏɴ :** `{config.SESSION}`""", +**𝙎𝙚𝙨𝙨𝙞𝙤𝙣 :** `{config.SESSION}`""", disable_web_page_preview=True, ) except: - return await message.reply_text("» ғᴀɪʟᴇᴅ ᴛᴏ sᴇɴᴅ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs.") + return await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙎𝙚𝙣𝙙 𝙩𝙝𝙚 𝘾𝙤𝙣𝙛𝙞𝙜 𝙑𝙖𝙧𝙞𝙖𝙗𝙡𝙚𝙨.") if message.chat.type != ChatType.PRIVATE: await message.reply_text( - "» ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴘᴍ, ɪ'ᴠᴇ sᴇɴᴛ ᴛʜᴇ ᴄᴏɴғɪɢ ᴠᴀʀɪᴀʙʟᴇs ᴛʜᴇʀᴇ." + "𝙋𝙡𝙚𝙖𝙨𝙚 𝘾𝙝𝙚𝙘𝙠 𝙔𝙤𝙪𝙧 𝙋𝙢, 𝙄'𝙫𝙚 𝙎𝙚𝙣𝙩 𝙏𝙝𝙚 𝙘𝙤𝙣𝙛𝙞𝙜 𝙑𝙖𝙧𝙞𝙖𝙗𝙡𝙚𝙨." ) From 8b5b1f3ae85a06401e7c0ee2948be37ad470f231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 09:04:58 +0530 Subject: [PATCH 110/211] Update variables.py --- GJ516Music/Modules/variables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/variables.py b/GJ516Music/Modules/variables.py index 6c2bcba..0ab902d 100644 --- a/GJ516Music/Modules/variables.py +++ b/GJ516Music/Modules/variables.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 273c780b9673023dee35e8a1d79ffc964f283480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 09:10:02 +0530 Subject: [PATCH 111/211] Update watcher.py --- GJ516Music/Modules/watcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/watcher.py b/GJ516Music/Modules/watcher.py index 90bbefb..56c0e5b 100644 --- a/GJ516Music/Modules/watcher.py +++ b/GJ516Music/Modules/watcher.py @@ -79,7 +79,7 @@ async def on_stream_end(pytgcalls, update: Update): else: process = await app.send_message( chat_id=chat_id, - text="» ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɴᴇxᴛ ᴛʀᴀᴄᴋ ғʀᴏᴍ ᴏ̨ᴜᴇᴜᴇ...", + text="𝘿𝙤𝙬𝙣𝙡𝙤𝙖𝙙𝙞𝙣𝙜 𝙉𝙚𝙭𝙩 𝙏𝙧𝙖𝙘𝙠 𝙁𝙧𝙤𝙢 𝙌𝙪𝙚𝙪𝙚 🎬...", ) title = get[0]["title"] duration = get[0]["duration"] @@ -105,6 +105,6 @@ async def on_stream_end(pytgcalls, update: Update): await app.send_photo( chat_id=chat_id, photo=img, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {req_by}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮:** {req_by}", reply_markup=buttons, ) From 63b71f7398393949cc13436d5c58672a4dbd78bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 09:10:16 +0530 Subject: [PATCH 112/211] Update watcher.py --- GJ516Music/Modules/watcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/watcher.py b/GJ516Music/Modules/watcher.py index 56c0e5b..7d6321c 100644 --- a/GJ516Music/Modules/watcher.py +++ b/GJ516Music/Modules/watcher.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal From 47c86e9916c236efb06cca76bcee59adf33cd056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 13:17:58 +0530 Subject: [PATCH 113/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 09edfd4..32bcb1f 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -33,8 +33,8 @@ buttons = InlineKeyboardMarkup( [ [ - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",User_id=config.OWNER_ID), - InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", Url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", User_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", Url=config.SUPPORT_CHAT), ] ] From caa8ec0bd39fe36b0f9aab0c2086a2828a7f0ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 13:19:05 +0530 Subject: [PATCH 114/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 32bcb1f..b0f5482 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -33,8 +33,8 @@ buttons = InlineKeyboardMarkup( [ [ - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", User_id=config.OWNER_ID), - InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", Url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), ] ] From 08f397b5d455bca3f6d761c10fbcca5ec6859c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 2 May 2023 13:19:20 +0530 Subject: [PATCH 115/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index b0f5482..dd8c6c1 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -34,7 +34,7 @@ [ [ InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), - InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), ] ] From a50f5489e01225864ee6a394e03fecf88f27e499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 7 May 2023 22:51:23 +0530 Subject: [PATCH 116/211] Update assistant.py --- GJ516Music/Modules/assistant.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py index 44bace3..123c5b7 100644 --- a/GJ516Music/Modules/assistant.py +++ b/GJ516Music/Modules/assistant.py @@ -50,8 +50,7 @@ async def set_pfp(_, message: Message): pfp = [p async for p in app2.get_chat_photos("me")] await app2.delete_profile_photos(pfp[0].file_id) return await message.reply_text( - "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘. -        " + "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘." ) except Exception as ex: LOGGER.error(ex) From 18c29c4e37bd929c7c3a93d6db6cc8bcef813cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 7 May 2023 22:55:07 +0530 Subject: [PATCH 117/211] Update assistant.py --- GJ516Music/Modules/assistant.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py index 123c5b7..0a810a0 100644 --- a/GJ516Music/Modules/assistant.py +++ b/GJ516Music/Modules/assistant.py @@ -49,9 +49,7 @@ async def set_pfp(_, message: Message): try: pfp = [p async for p in app2.get_chat_photos("me")] await app2.delete_profile_photos(pfp[0].file_id) - return await message.reply_text( - "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘." - ) + return await message.reply_text(. "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘." ) except Exception as ex: LOGGER.error(ex) await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝘿𝙚𝙡𝙚𝙩𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘.") From 2392a24fa6ee1743902c44b848dc47a9e2d93fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 14:34:37 +0530 Subject: [PATCH 118/211] Update __main__.py --- GJ516Music/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/__main__.py b/GJ516Music/__main__.py index 93d8fd2..ee6e10d 100644 --- a/GJ516Music/__main__.py +++ b/GJ516Music/__main__.py @@ -81,7 +81,7 @@ async def GJ516_startup(): LOGGER.info(f"[•] Jay Assistant Started As {ASS_NAME}.") LOGGER.info( - "[•] \x53\x74\x61\x72\x74\x69\x6e\x67\x20\x50\x79\x54\x67\x43\x61\x6c\x6c\x73\x20\x43\x6c\x69\x65\x6e\x74\x2e\x2e\x2e" + "[•] jay music loaded " ) await pytgcalls.start() await idle() From cdfa22fc3e0b4c7edf19f7ae80da8f0ce9da8acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 14:42:20 +0530 Subject: [PATCH 119/211] Update assistant.py --- GJ516Music/Modules/assistant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/assistant.py b/GJ516Music/Modules/assistant.py index 0a810a0..81a48d9 100644 --- a/GJ516Music/Modules/assistant.py +++ b/GJ516Music/Modules/assistant.py @@ -49,7 +49,7 @@ async def set_pfp(_, message: Message): try: pfp = [p async for p in app2.get_chat_photos("me")] await app2.delete_profile_photos(pfp[0].file_id) - return await message.reply_text(. "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘." ) + return await message.reply_text( "𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 𝘿𝙚𝙡𝙚𝙩𝙚𝙙 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘." ) except Exception as ex: LOGGER.error(ex) await message.reply_text("𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝘿𝙚𝙡𝙚𝙩𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩'𝙨 𝙋𝙧𝙤𝙛𝙞𝙡𝙚 𝙋𝙞𝙘.") From c6b6979b6515adfa9cd548b56886b37f231096ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 14:50:52 +0530 Subject: [PATCH 120/211] Update broadcast.py --- GJ516Music/Modules/broadcast.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Modules/broadcast.py b/GJ516Music/Modules/broadcast.py index 6a30f78..0690c9a 100644 --- a/GJ516Music/Modules/broadcast.py +++ b/GJ516Music/Modules/broadcast.py @@ -60,8 +60,6 @@ async def broadcast(_, message: Message): except Exception: continue try: - await brep.edit_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘 -.**") + await brep.edit_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘.** ") except: - await message.reply_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘 -.**") + await message.reply_text(f"**𝘽𝙧𝙤𝙖𝙙𝙘𝙖𝙨𝙩 𝙈𝙖𝙨𝙨𝙖𝙜𝙚 𝙄𝙣 {sent} 𝘾𝙝𝙖𝙩 𖤘 .** ") From bbaa4357b12a41c646e3fe17d46da5904e472cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 15:46:00 +0530 Subject: [PATCH 121/211] Update __init__.py --- GJ516Music/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GJ516Music/__init__.py b/GJ516Music/__init__.py index b363740..2f3ec0e 100644 --- a/GJ516Music/__init__.py +++ b/GJ516Music/__init__.py @@ -65,14 +65,14 @@ async def GJ516_startup(): os.system("clear") LOGGER.info( - "\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2523\u2605\x20\x46\x41\x4c\x4c\x45\x4e\x20\x4d\x55\x53\x49\x43\x20\x42\x4f\x54\x20\u2605\n\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251b" + "jay modules loaded" ) global BOT_ID, BOT_NAME, BOT_USERNAME, BOT_MENTION, GJ516db global ASS_ID, ASS_NAME, ASS_USERNAME, ASS_MENTION, SUDOERS await app.start() LOGGER.info( - "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x42\x6f\x74\x2e\x2e\x2e" + "[•] jay modules loaded" ) getme = await app.get_me() @@ -83,7 +83,7 @@ async def GJ516_startup(): await app2.start() LOGGER.info( - "[•] \x42\x6f\x6f\x74\x69\x6e\x67\x20\x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x41\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x2e\x2e" + "[•] jay modules loaded " ) getme2 = await app2.get_me() @@ -111,7 +111,7 @@ async def GJ516_startup(): ) LOGGER.info( - "[•] \x46\x61\x6c\x6c\x65\x6e\x20\x4d\x75\x73\x69\x63\x20\x43\x6c\x69\x65\x6e\x74\x73\x20\x42\x6f\x6f\x74\x65\x64\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x2e" + "[•] jay modules loaded" ) From 7176626c86baaa4add8705e0e3ebe16623aeef05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 15:47:06 +0530 Subject: [PATCH 122/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 6f05c7d..f4eaab7 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -34,8 +34,7 @@ {1} 𝘾𝙖𝙣 𝙉𝙤𝙬 𝙋𝙡𝙖𝙮 𝙎𝙤𝙣𝙜 𝙄𝙣 {2}. ────────────────── -➻ 𝙁𝙤𝙧 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙃𝙚𝙡𝙥 𝘼𝙗𝙤𝙪𝙩 𝙈𝙚 𝙊𝙧 𝙄𝙛 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝘼𝙨𝙠 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙔𝙤𝙪 𝘾𝙖𝙣 𝙅𝙤𝙞𝙣 𝙈𝙮 [𝙂𝙧𝙤𝙪𝙥] -({3}). +➻ 𝙁𝙤𝙧 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙃𝙚𝙡𝙥 𝘼𝙗𝙤𝙪𝙩 𝙈𝙚 𝙊𝙧 𝙄𝙛 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝘼𝙨𝙠 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙔𝙤𝙪 𝘾𝙖𝙣 𝙅𝙤𝙞𝙣 𝙈𝙮 [𝙂𝙧𝙤𝙪𝙥] ({3}) . """ HELP_TEXT = f""" From a9fa8d1cfbbaeecfee34a4f93db6abd4d7735a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 16:06:17 +0530 Subject: [PATCH 123/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index f355bc5..daf59fd 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/b534dd5a456247f5e57ab.jpg") -START_IMG = getenv("START_IMG", "https://telegra.ph/file/9a42a0c6c293f021f5445.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/37f3305f14e1f68c9ffad.jpg") SESSION = getenv("SESSION", None) From 77c7160a341580b27089e9609fcd5c01aded17d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 16:20:56 +0530 Subject: [PATCH 124/211] Update config.py --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index daf59fd..965af47 100644 --- a/config.py +++ b/config.py @@ -13,8 +13,8 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/b534dd5a456247f5e57ab.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/37f3305f14e1f68c9ffad.jpg") +PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/e6bd1a3f1fe9a62328b07.jpg") SESSION = getenv("SESSION", None) From a168ed91dfea761a2cade52398dc906ebad5c050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 23:50:45 +0530 Subject: [PATCH 125/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index dd8c6c1..7432772 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -49,7 +49,7 @@ InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=f"https://t.me/GJ516_DISCUSS_GROUP"), - ] + ] ] ) From 37a70f8df58eaf777c1fe59ed27ffc909b0aed85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 9 May 2023 23:51:22 +0530 Subject: [PATCH 126/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index c46df43..c7f4fd4 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -222,7 +222,7 @@ async def play(_, message: Message): await message.reply_photo( photo=qimg, caption=f"**⏳ 𝘼𝙙𝙙𝙚𝙙 𝙩𝙤 𝙌𝙪𝙚𝙪𝙚 𝙖𝙩 #{position}**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**⏱𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣:** `{duration}`\n**👤𝘼𝙙𝙙𝙚𝙙 𝘽𝙮:** {ruser}", - reply_markup=jaybuttons, + reply_markup=buttons, ) else: stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) From 01c9e72a718dd1d8f9023519f616478b0146a689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Wed, 10 May 2023 08:12:28 +0530 Subject: [PATCH 127/211] Update play.py --- GJ516Music/Modules/play.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index c7f4fd4..c62ac2e 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -54,7 +54,7 @@ from GJ516Music.Helpers.downloaders import audio_dl from GJ516Music.Helpers.errors import DurationLimitError from GJ516Music.Helpers.gets import get_file_name, get_url -from GJ516Music.Helpers.inline import buttons +from GJ516Music.Helpers.inline import buttons, jaybuttons from GJ516Music.Helpers.queue import put from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb @@ -222,7 +222,7 @@ async def play(_, message: Message): await message.reply_photo( photo=qimg, caption=f"**⏳ 𝘼𝙙𝙙𝙚𝙙 𝙩𝙤 𝙌𝙪𝙚𝙪𝙚 𝙖𝙩 #{position}**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**⏱𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣:** `{duration}`\n**👤𝘼𝙙𝙙𝙚𝙙 𝘽𝙮:** {ruser}", - reply_markup=buttons, + reply_markup=jaybuttons, ) else: stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) From 79e24d99eb31378f36246479df5aa4c02083f939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Wed, 10 May 2023 08:13:09 +0530 Subject: [PATCH 128/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index c62ac2e..ad7736e 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -199,7 +199,7 @@ async def play(_, message: Message): if (dur / 60) > DURATION_LIMIT: return await GJ516.edit( - f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 ᴛʜᴀɴ {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." + f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_path = audio_dl(url) From 40528b05c079d65d79456db2302031ee71615cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Wed, 10 May 2023 08:15:35 +0530 Subject: [PATCH 129/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 7432772..cc77ed5 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -45,9 +45,9 @@ [ [ -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/export_gabbar"), +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/GJ516"), -InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=f"https://t.me/GJ516_DISCUSS_GROUP"), +InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), ] ] From 4eb6006adc32190621658d76fd9acafe12dbffd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Wed, 10 May 2023 08:16:03 +0530 Subject: [PATCH 130/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index cc77ed5..af24583 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -45,7 +45,7 @@ [ [ -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/GJ516"), +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/export_gabbar"), InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), From 90d5bf177a59337c67529b622780c037c4006524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:30:04 +0530 Subject: [PATCH 131/211] Update README.md --- .github/README.md | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/.github/README.md b/.github/README.md index 507bf02..32d83bf 100644 --- a/.github/README.md +++ b/.github/README.md @@ -48,7 +48,7 @@ 𝗦𝗲𝘀𝘀𝗶𝗼𝗻 🥀 - 🧪 Get `SESSION_NAME` variable: - - [``Pyrogram Session``](https://telegram.me/StringFatherBot) + - [``Pyrogram Session``](https://telegram.me/)
@@ -65,25 +65,36 @@ ## ᴅᴇᴩʟᴏʏ ᴏɴ ᴏᴋᴛᴇᴛᴏ -

+

The second easiest way to host this bot, Deploy on Okteto Cloud ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ 📡 ```sh - sudo apt update && apt upgrade -y - sudo apt install git curl python3-pip ffmpeg -y - pip3 install -U pip - Curl -sL https://deb.nodesource.com/setup_16.x | bash - - sudo apt-get install -y nodejs - npm i -g npm - git clone https://github.com/MrProgrammer72/GJ516VCBOT # Clone your repo. - cd GJ516VCBOT - pip3 install -U -r requirements.txt - cp example.env .env #Use vim to edit ENVs - vim .env #Fill up your ENVs ( Steps press i to enter in insert mode then edit the file. Press Esc to exit the editing mode then type :wq! and press Enter key to save the file.) - python3 main.py # Run the bot - - ``` + - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) + - Upgrade and Update by : + `sudo apt-get update && sudo apt-get upgrade -y` + - Install required packages by : + `sudo apt-get install python3-pip ffmpeg -y` + - Install pip by : + `sudo pip3 install -U pip` + - Install node by : + `curl -fssL https://deb.nodesource.com/setup_18.x | sudo -E bash - && sudo apt-get install nodejs -y && npm i -g npm` + - Clone the repository by : + `git clone https://github.com/MrProgrammer72/GJ516Music && cd GJ516music` + - Install requirements by : + `pip3 install -U -r requirements.txt` + - Fill your variables in the env by : + `vi sample.env`
+ Press `I` on the keyboard for editing env
+ Press `Ctrl+C` when you're done with editing env and `:wq` to save the env
+ - Rename the env file by : + `mv sample.env .env` + - Install tmux to keep running your bot when you close the terminal by : + `sudo apt install tmux && tmux` + - Finally run the bot by : + `bash GJ516` + - For getting out from tmux session
+ Press `Ctrl+b` and then `d` From d4250be752870bdb347736197494b263b608ecac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:30:48 +0530 Subject: [PATCH 132/211] Update README.md --- .github/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 32d83bf..0cab3d0 100644 --- a/.github/README.md +++ b/.github/README.md @@ -96,11 +96,12 @@ - For getting out from tmux session
Press `Ctrl+b` and then `d` - +

+ ━━━━━━━━━━━━━━━━━━━━

From bab3685547483e488efbef4f4efcdea7a064dfdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:35:44 +0530 Subject: [PATCH 133/211] Update README.md --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 0cab3d0..69f6118 100644 --- a/.github/README.md +++ b/.github/README.md @@ -68,7 +68,7 @@

The second easiest way to host this bot, Deploy on Okteto Cloud - ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ 📡 + ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ's 📡 ```sh - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) - Upgrade and Update by : From 0069db568edddc1d02dd8cb4d8d0f1ec72d4f535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:38:13 +0530 Subject: [PATCH 134/211] Update README.md --- .github/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/README.md b/.github/README.md index 69f6118..4d8cc29 100644 --- a/.github/README.md +++ b/.github/README.md @@ -69,6 +69,7 @@ The second easiest way to host this bot, Deploy on Okteto Cloud ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ's 📡 +

```sh - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) - Upgrade and Update by : From 66fc1beca189755345b132635d844963caa733bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:40:45 +0530 Subject: [PATCH 135/211] Update README.md --- .github/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 4d8cc29..568793c 100644 --- a/.github/README.md +++ b/.github/README.md @@ -70,7 +70,8 @@ The second easiest way to host this bot, Deploy on Okteto Cloud ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ's 📡

- ```sh + + ```sh - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) - Upgrade and Update by : `sudo apt-get update && sudo apt-get upgrade -y` From b508223b2a514977d704526f64af72b458c7a78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:42:45 +0530 Subject: [PATCH 136/211] Update README.md --- .github/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 568793c..97424bc 100644 --- a/.github/README.md +++ b/.github/README.md @@ -69,7 +69,8 @@ The second easiest way to host this bot, Deploy on Okteto Cloud ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ's 📡 -

+ +

```sh - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) From 58024df8e1ea05a9a3436074d46a1cf8f4bf5e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 13 May 2023 21:44:10 +0530 Subject: [PATCH 137/211] Update README.md --- .github/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/README.md b/.github/README.md index 97424bc..c828eec 100644 --- a/.github/README.md +++ b/.github/README.md @@ -71,9 +71,8 @@ ## ᴅᴇᴘʟᴏʏ ᴏɴ ᴠᴘꜱ ꜱᴇʀᴠᴇʀ's 📡

- - ```sh - - Get your [Necessary Variables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) + + - Get your [NecesseryVariables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) - Upgrade and Update by : `sudo apt-get update && sudo apt-get upgrade -y` - Install required packages by : From eb39989950a8d9d05fa7d13c33370bf78afb2e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Wed, 17 May 2023 11:04:42 +0530 Subject: [PATCH 138/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 965af47..8e87db7 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/e6bd1a3f1fe9a62328b07.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/e6bd1a3f1fe9a62328b07.jpg", "https://te.legra.ph/file/bf8364a1c2bf9299bae91.jpg") SESSION = getenv("SESSION", None) From 34745a3b5ba13d553b5cf67c763ff862724d99e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 26 May 2023 14:47:21 +0530 Subject: [PATCH 139/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index af24583..39bf04f 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -85,7 +85,7 @@ InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), ], [ - InlineKeyboardButton(text="❰𝙂𝙞𝙩𝙍𝙚𝙥𝙤❱ ", url=f"https://github.com/MrProgrammer72/GJ516Music"), + InlineKeyboardButton(text="❰𝗗𝗜𝗦𝗖𝗨𝗦𝗦❱ ", url=f"https://t.me/GJ516_DISCUSS_GROUP"), ], ] From 1551e7ea50a4a335e4dfb959144e3c83e960ac42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:15:52 +0530 Subject: [PATCH 140/211] Update inline.py --- GJ516Music/Helpers/inline.py | 47 +++++++++++------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 39bf04f..b909036 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -58,17 +58,10 @@ pm_buttons = [ [ InlineKeyboardButton( - text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true", - ) - ], - [InlineKeyboardButton(text="❰𝘾𝙤𝙢𝙢𝙖𝙣𝙙𝙨❱", callback_data="GJ516_help")], - [ - InlineKeyboardButton(text="❰𝗨𝗽𝗱𝗮𝘁𝗲𝘀❱", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), - ], - [ - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱ ", user_id=config.OWNER_ID), + text="❰𝘼𝙙𝙙 𝙢𝙚❱", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), + + InlineKeyboardButton(text="❰𝙃𝙚𝙡𝙥❱", callback_data="GJ516_help"), ], ] @@ -77,41 +70,29 @@ [ InlineKeyboardButton( text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕ ", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true", - ) - ], - [ + url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), InlineKeyboardButton(text="❰𝗨𝗽𝗱𝗮𝘁𝗲𝘀❱", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), - ], - [ - InlineKeyboardButton(text="❰𝗗𝗜𝗦𝗖𝗨𝗦𝗦❱ ", url=f"https://t.me/GJ516_DISCUSS_GROUP"), - ], + ], ] helpmenu = [ [ InlineKeyboardButton( - text="𝗔𝗱𝗺𝗶𝗻'𝘀", + text="𝘽𝙤𝙩 𝙪𝙨𝙚𝙧", callback_data="GJ516_cb help", - ) - ], - [ - InlineKeyboardButton(text="𝙎𝙪𝙙𝙤", callback_data="GJ516_cb sudo"), - InlineKeyboardButton(text="𝙂𝙞𝙩𝙍𝙚𝙥𝙤",url=f"https://github.com/MrProgrammer72/GJ516Music"), - ], + ), + + InlineKeyboardButton(text="𝙎𝙪𝙙𝙤 𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), + ], + [ - InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_home"), - InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close"), + InlineKeyboardButton(text="◁", callback_data="GJ516_home"), ], ] help_back = [ - [InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT)], - [ - InlineKeyboardButton(text="❰𝗕𝗮𝗰𝗸❱", callback_data="GJ516_help"), - InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close"), + [InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", ], ] From ec68d84b66ce16cced36ae3a980370c25b165bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:18:29 +0530 Subject: [PATCH 141/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index b909036..42297e3 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -94,5 +94,7 @@ help_back = [ [InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", +callback_data="close"), + ], ] From 8069ea9c9df1ce9a7f747ba413590d569de328a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:19:32 +0530 Subject: [PATCH 142/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 42297e3..dbe6d5f 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -93,7 +93,7 @@ help_back = [ - [InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", + [InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close"), ], From ff5fa06fcabb17dd7dc19927493a5e254b3fe452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:21:43 +0530 Subject: [PATCH 143/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index dbe6d5f..c50c9f9 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -71,7 +71,7 @@ InlineKeyboardButton( text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕ ", url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), - InlineKeyboardButton(text="❰𝗨𝗽𝗱𝗮𝘁𝗲𝘀❱", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="❰𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙚𝙧❱", url=f"https://t.me/export_gabbar"), ], ] From 82a41e655fce42c58c1d498ec0ddc41b934fba36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:28:01 +0530 Subject: [PATCH 144/211] Update play.py --- GJ516Music/Modules/play.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index ad7736e..8a3c332 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,7 +178,9 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text("𝙒𝙝𝙖𝙩 𝘿𝙤 𝙔𝙤𝙪 𝙬𝙖𝙣𝙣𝙖 𝙋𝙡𝙖𝙮 ?") + return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 /n/n + +𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name ....") await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From c8eb6760bc58bfdbba1d13e73f2ddb1dae129272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 18:35:04 +0530 Subject: [PATCH 145/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index c50c9f9..04ea807 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -58,10 +58,10 @@ pm_buttons = [ [ InlineKeyboardButton( - text="❰𝘼𝙙𝙙 𝙢𝙚❱", + text="❰𝘼𝘿𝘿𝙈𝙀❱", url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), - InlineKeyboardButton(text="❰𝙃𝙚𝙡𝙥❱", callback_data="GJ516_help"), + InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), ], ] From cd40c9cca551a3698ded79a78dcfe0eae4883e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 1 Jun 2023 21:13:53 +0530 Subject: [PATCH 146/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 8e87db7..7d86f1d 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/e6bd1a3f1fe9a62328b07.jpg", "https://te.legra.ph/file/bf8364a1c2bf9299bae91.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") SESSION = getenv("SESSION", None) From 10f1d3a651b8e6bb7c2ca93506dde13acd7d8444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 3 Jun 2023 09:03:32 +0530 Subject: [PATCH 147/211] Update ping.py --- GJ516Music/Modules/ping.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index 1777a61..fa35edf 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -55,15 +55,11 @@ async def ping_fallen(_, message: Message): ✾ **𝘾𝙥𝙪 :** {cpu} ✾ **𝘿𝙞𝙨𝙠 :** {disk} -||𝙈𝙖𝙙𝙚 𝘽𝙮 : [𝙅𝙖𝙮💸](https://t.me/GJ516_DISCUSS_GROUP) || """, +||𝙈𝙖𝙙𝙚 𝘽𝙮 : [ــ٨ﮩﮩ𝗝♡𝗬💸](https://t.me/export_gabbar) || """, reply_markup=InlineKeyboardMarkup( [ [ - InlineKeyboardButton("❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), - InlineKeyboardButton( - "❰𝙂𝙞𝙩𝙍𝙚𝙥𝙤❱ ", - url="https://github.com/MrProgrammer72/GJ516Music", - ), + InlineKeyboardButton("❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT) ], ] ), From bbaea376e15aa46d5c281d73ead43f60316a5220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 3 Jun 2023 15:30:05 +0530 Subject: [PATCH 148/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index f4eaab7..8447cc7 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -23,11 +23,13 @@ from GJ516Music import BOT_NAME PM_START_TEXT = """ -𝙃𝙚𝙮 {0}, - 𝙏𝙝𝙞𝙨 𝙞𝙨** {1} ! - -𝘼 𝙁𝙖𝙨𝙩 𝘼𝙣𝙙 𝙋𝙤𝙬𝙚𝙧𝙛𝙪𝙡 𝙈𝙪𝙨𝙞𝙘 𝙋𝙡𝙖𝙮𝙚𝙧 𝘽𝙤𝙩. -""" +𝙃𝙚𝙮 {0}, +   𝙏𝙝𝙞𝙨 𝙞𝙨** {1} ! + +𝘼 𝙁𝙖𝙨𝙩 𝘼𝙣𝙙 𝙋𝙤𝙬𝙚𝙧𝙛𝙪𝙡 𝙈𝙪𝙨𝙞𝙘 𝙋𝙡𝙖𝙮𝙚𝙧 𝘽𝙤𝙩. +𝙄 𝘾𝘼𝙉 𝙋𝙇𝘼𝙔 𝙈𝙐𝙎𝙄𝘾 𝙄𝙉 𝙔𝙊𝙐𝙍 𝙎𝙐𝙋𝙀𝙍𝙂𝙍𝙊𝙐𝙋 +𝘾𝙍𝙀𝘼𝙏𝙀𝘿 𝘽𝙔 [⏤‌•Ξ✘𝙋𝞡𝙍𝙏 𝙂𝚫𝘽𝘽𝚫𝙍"_𓆩᪵💸𓆪‌](https://t.me/export_gabbar) + """ START_TEXT = """ **𝙃𝙚𝙮** {0}, 🥀 From 01301839d0127ca9adccc87e55cf9521caf8e17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 13:18:02 +0530 Subject: [PATCH 149/211] Update play.py --- GJ516Music/Modules/play.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 8a3c332..3a96098 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,9 +178,9 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 /n/n + return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 /n/n -𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name ....") +𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From 36e64c0186a2009064cf2be440e9a021000dbc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 13:19:07 +0530 Subject: [PATCH 150/211] Update play.py --- GJ516Music/Modules/play.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 3a96098..661eac7 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,9 +178,7 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 /n/n - -𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") + return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮/n/n 𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From 28f120af6629356a577b09f76486a6ce3da25f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 18:24:13 +0530 Subject: [PATCH 151/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 7d86f1d..d560836 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") SESSION = getenv("SESSION", None) From 0358619d097a576e52aa00ef5ad06900189ee720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 18:57:52 +0530 Subject: [PATCH 152/211] Update inline.py --- GJ516Music/Helpers/inline.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 04ea807..c96cd3b 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -93,8 +93,9 @@ help_back = [ - [InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", -callback_data="close"), + [InlineKeyboardButton(text="◁", +callback_data="GJ516_home"), + [InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close") ], ] From a4e7eb34405abafac50e1f594b9791c45b8ee4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 18:59:55 +0530 Subject: [PATCH 153/211] Update play.py --- GJ516Music/Modules/play.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 661eac7..b307968 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,7 +178,8 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮/n/n 𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") + return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") + await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From 4e3f12c116f60636768175d2ef6f6be2912bbc66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:12:57 +0530 Subject: [PATCH 154/211] Update play.py --- GJ516Music/Modules/play.py | 1 - 1 file changed, 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index b307968..1573691 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -179,7 +179,6 @@ async def play(_, message: Message): else: if len(message.command) < 2: return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") - await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From 6dd2a88316eb2c3b3637e6b054074e92c059873b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:25:40 +0530 Subject: [PATCH 155/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index c96cd3b..28d69d3 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -95,7 +95,7 @@ help_back = [ [InlineKeyboardButton(text="◁", callback_data="GJ516_home"), - [InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close") + InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close") ], ] From aec5d4e684a44e54ddbde433556d327283d1eca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:26:07 +0530 Subject: [PATCH 156/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 28d69d3..a06cadf 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -95,7 +95,7 @@ help_back = [ [InlineKeyboardButton(text="◁", callback_data="GJ516_home"), - InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close") + InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), ], ] From 75dd0d3f0dbe70a6345e9533b78ec167c398ba1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:44:00 +0530 Subject: [PATCH 157/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index d560836..7d86f1d 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") SESSION = getenv("SESSION", None) From c71212e4fe7f2501a094ac95790465717ac6e7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 19:56:53 +0530 Subject: [PATCH 158/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 1573691..392af51 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,7 +178,7 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 𝙀𝙭𝙖𝙢𝙥𝙡𝙚: /play song name .... ") + return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ") await GJ516.edit_text("💸") query = message.text.split(None, 1)[1] try: From 71a155f8a850ff2d24f3af89da0426c4f74e3ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Mon, 5 Jun 2023 23:02:08 +0530 Subject: [PATCH 159/211] Update inline.py --- GJ516Music/Helpers/inline.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index a06cadf..2426952 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -63,6 +63,9 @@ InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), ], + [  +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), + ], ] From 157adfd8138a376b22287dcd1988e879f930038d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:34:36 +0530 Subject: [PATCH 160/211] Update inline.py --- GJ516Music/Helpers/inline.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 2426952..a16e53f 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -62,11 +62,12 @@ url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), - ], - [  -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), + ], + [  + InlineKeyboardButton (text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), + ], -] + ] gp_buttons = [ From 68f33f9d84c6a7e219cab7cee1bb37bdbe317c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:35:15 +0530 Subject: [PATCH 161/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index a16e53f..7e2123a 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -64,7 +64,7 @@ InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), ], [  - InlineKeyboardButton (text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), ], ] From b991cbeef384917d3b0f5dd07d118da116cb3a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:35:37 +0530 Subject: [PATCH 162/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 7e2123a..948f1fe 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -73,7 +73,7 @@ gp_buttons = [ [ InlineKeyboardButton( - text="➕ 𝗔𝗱𝗱 𝗠𝗲 𝗧𝗼 𝗬𝗼𝘂𝗿 𝗚𝗿𝗼𝘂𝗽 ➕ ", + text="➕ 𝗔𝗱𝗱 𝗠𝗲 ➕ ", url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), InlineKeyboardButton(text="❰𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙚𝙧❱", url=f"https://t.me/export_gabbar"), ], From 95611cba1866ab089a20f0e01ebab106d6a584de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:54:41 +0530 Subject: [PATCH 163/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 948f1fe..c9c8bf2 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -45,7 +45,7 @@ [ [ -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", url=f"https://t.me/export_gabbar"), +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID"), InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), @@ -64,7 +64,7 @@ InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), ], [  - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID) ], ] From e32fe28a9ec01b4ed3155b5c1d605f36b8f8bcb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:55:40 +0530 Subject: [PATCH 164/211] Update inline.py --- GJ516Music/Helpers/inline.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index c9c8bf2..42feaeb 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -65,9 +65,8 @@ ], [  InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID) - - ], - ] + ], +] gp_buttons = [ From 06e528ebf1dd764475bc64d5b595a317ea94dd2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:57:48 +0530 Subject: [PATCH 165/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 7d86f1d..d560836 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") +START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") SESSION = getenv("SESSION", None) From 1dadf7b52e153efe33f273545a9881e9162767cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:58:10 +0530 Subject: [PATCH 166/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index d560836..54debaa 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/fd2d1b9bdef248cd900f9.jpg") +PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") SESSION = getenv("SESSION", None) From 95a5a4f2319e5d1a4a381d94641929bdca9e163c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 09:14:58 +0530 Subject: [PATCH 167/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 42feaeb..f7d30b9 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -45,7 +45,7 @@ [ [ -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID"), +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), From d4a5c02f0abe7ac5540899486f240a0c6db8815f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 6 Jun 2023 17:48:22 +0530 Subject: [PATCH 168/211] Update inline.py --- GJ516Music/Helpers/inline.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index f7d30b9..0279731 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -62,9 +62,8 @@ url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), - ], - [  - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID) + ],[ +InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), ], ] From bde2ae4b7d995fc1c462c70b05927d167c2fc2be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 9 Jun 2023 12:57:08 +0530 Subject: [PATCH 169/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 0279731..5424e93 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -62,8 +62,6 @@ url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), - ],[ -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱",user_id=config.OWNER_ID), ], ] From 82d23bddbb2382b057617c3ad39542be372c8448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:04:36 +0530 Subject: [PATCH 170/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 392af51..8ad6161 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -179,7 +179,7 @@ async def play(_, message: Message): else: if len(message.command) < 2: return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ") - await GJ516.edit_text("💸") + await GJ516.edit_text("⚡") query = message.text.split(None, 1)[1] try: results = YoutubeSearch(query, max_results=1).to_dict() From d4385a971ba5dfeb52b761cbd8e967edc1ff2773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:11:39 +0530 Subject: [PATCH 171/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 1 - 1 file changed, 1 deletion(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 8447cc7..39e2c5d 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -28,7 +28,6 @@ 𝘼 𝙁𝙖𝙨𝙩 𝘼𝙣𝙙 𝙋𝙤𝙬𝙚𝙧𝙛𝙪𝙡 𝙈𝙪𝙨𝙞𝙘 𝙋𝙡𝙖𝙮𝙚𝙧 𝘽𝙤𝙩. 𝙄 𝘾𝘼𝙉 𝙋𝙇𝘼𝙔 𝙈𝙐𝙎𝙄𝘾 𝙄𝙉 𝙔𝙊𝙐𝙍 𝙎𝙐𝙋𝙀𝙍𝙂𝙍𝙊𝙐𝙋 -𝘾𝙍𝙀𝘼𝙏𝙀𝘿 𝘽𝙔 [⏤‌•Ξ✘𝙋𝞡𝙍𝙏 𝙂𝚫𝘽𝘽𝚫𝙍"_𓆩᪵💸𓆪‌](https://t.me/export_gabbar) """ START_TEXT = """ From 5988f4d364eca1d32d994e29a14514cc358ca162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:21:33 +0530 Subject: [PATCH 172/211] Delete inline.py --- GJ516Music/Helpers/inline.py | 101 ----------------------------------- 1 file changed, 101 deletions(-) delete mode 100644 GJ516Music/Helpers/inline.py diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py deleted file mode 100644 index 5424e93..0000000 --- a/GJ516Music/Helpers/inline.py +++ /dev/null @@ -1,101 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 MrProgrammer72 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup - -import config -from GJ516Music import BOT_USERNAME - -close_key = InlineKeyboardMarkup( - [[InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close")]] -) - - -buttons = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), - InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), - - ] - ] -) - - -jaybuttons = InlineKeyboardMarkup( - [ - [ - -InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), - -InlineKeyboardButton (text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), - - ] - ] -) - - - -pm_buttons = [ - [ - InlineKeyboardButton( - text="❰𝘼𝘿𝘿𝙈𝙀❱", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), - - InlineKeyboardButton(text="❰𝙃𝙀𝙇𝙋❱", callback_data="GJ516_help"), - ], -] - - -gp_buttons = [ - [ - InlineKeyboardButton( - text="➕ 𝗔𝗱𝗱 𝗠𝗲 ➕ ", - url=f"https://t.me/{BOT_USERNAME}?startgroup=true" ), - InlineKeyboardButton(text="❰𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙚𝙧❱", url=f"https://t.me/export_gabbar"), - ], -] - - -helpmenu = [ - [ - InlineKeyboardButton( - text="𝘽𝙤𝙩 𝙪𝙨𝙚𝙧", - callback_data="GJ516_cb help", - ), - - InlineKeyboardButton(text="𝙎𝙪𝙙𝙤 𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), - ], - - [ - InlineKeyboardButton(text="◁", callback_data="GJ516_home"), - ], -] - - -help_back = [ - [InlineKeyboardButton(text="◁", -callback_data="GJ516_home"), - InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), - - ], -] From 246fb0892585f8efb890b6d43be89a687c137430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:22:33 +0530 Subject: [PATCH 173/211] Add files via upload --- GJ516Music/Helpers/inline.py | 110 +++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 GJ516Music/Helpers/inline.py diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py new file mode 100644 index 0000000..d634f0f --- /dev/null +++ b/GJ516Music/Helpers/inline.py @@ -0,0 +1,110 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +import config +from FallenMusic import BOT_USERNAME + +close_key = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] +) + + +buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="▷", callback_data="resume_cb"), + InlineKeyboardButton(text="II", callback_data="pause_cb"), + InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), + InlineKeyboardButton(text="▢", callback_data="end_cb"), + ] + ] +) + + +pm_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="fallen_help")], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/FallenMusic" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +gp_buttons = [ + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{BOT_USERNAME}?startgroup=true", + ) + ], + [ + InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + ], + [ + InlineKeyboardButton( + text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/FallenMusic" + ), + InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + ], +] + + +helpmenu = [ + [ + InlineKeyboardButton( + text="ᴇᴠᴇʀʏᴏɴᴇ", + callback_data="fallen_cb help", + ) + ], + [ + InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="fallen_cb sudo"), + InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="fallen_cb owner"), + ], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="fallen_home"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] + + +help_back = [ + [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], + [ + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="fallen_help"), + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + ], +] From 0847d530978ad9ebb025207408ba155634e007e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:23:15 +0530 Subject: [PATCH 174/211] Delete play.py --- GJ516Music/Modules/play.py | 258 ------------------------------------- 1 file changed, 258 deletions(-) delete mode 100644 GJ516Music/Modules/play.py diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py deleted file mode 100644 index 8ad6161..0000000 --- a/GJ516Music/Modules/play.py +++ /dev/null @@ -1,258 +0,0 @@ -# MIT License -# -# Copyright (c) 2023 MrProgrammer72 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import asyncio -import os - -from pyrogram import filters -from pyrogram.enums import ChatMemberStatus -from pyrogram.errors import ( - ChatAdminRequired, - UserAlreadyParticipant, - UserNotParticipant, -) -from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message -from pytgcalls import StreamType -from pytgcalls.exceptions import NoActiveGroupCall, TelegramServerError, UnMuteNeeded -from pytgcalls.types import AudioPiped, HighQualityAudio -from youtube_search import YoutubeSearch - -from config import DURATION_LIMIT -from GJ516Music import ( - ASS_ID, - ASS_MENTION, - ASS_NAME, - ASS_USERNAME, - BOT_NAME, - BOT_USERNAME, - LOGGER, - app, - app2, - GJ516db, - pytgcalls, -) -from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on -from GJ516Music.Helpers.downloaders import audio_dl -from GJ516Music.Helpers.errors import DurationLimitError -from GJ516Music.Helpers.gets import get_file_name, get_url -from GJ516Music.Helpers.inline import buttons, jaybuttons -from GJ516Music.Helpers.queue import put -from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb - - -@app.on_message( - filters.command(["play", "vplay", "p"]) - & filters.group - & ~filters.forwarded - & ~filters.via_bot -) -async def play(_, message: Message): - GJ516 = await message.reply_text("𝙋𝙧𝙤𝙘𝙚𝙨𝙨𝙞𝙣𝙜, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩 ........") - try: - await message.delete() - except: - pass - - try: - try: - get = await app.get_chat_member(message.chat.id, ASS_ID) - except ChatAdminRequired: - return await GJ516.edit_text( - f"   𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." - ) - if get.status == ChatMemberStatus.BANNED: - unban_butt = InlineKeyboardMarkup( - [ - [ - InlineKeyboardButton( - text=f"𝙐𝙣𝙗𝙖𝙣 {ASS_NAME}", - callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", - ), - ] - ] - ) - return await GJ516.edit_text( - text=f" {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙄𝙨 𝘽𝙖𝙣 𝙄𝙣 {message.chat.title}\n\n☍ 𝙄𝙙 : `{ASS_ID}`\n☍ 𝙉𝙖𝙢𝙚 : {ASS_MENTION}\n☍ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙗𝙖𝙣 𝙏𝙝𝙚 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝘼𝙣𝙙 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣.....", - reply_markup=unban_butt, - ) - except UserNotParticipant: - if message.chat.username: - invitelink = message.chat.username - try: - await app2.resolve_peer(invitelink) - except Exception as ex: - LOGGER.error(ex) - else: - try: - invitelink = await app.export_chat_invite_link(message.chat.id) - except ChatAdminRequired: - return await GJ516.edit_text( - f"𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." - ) - except Exception as ex: - return await GJ516.edit_text( - f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" - ) - if invitelink.startswith("https://t.me/+"): - invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") - anon = await GJ516.edit_text( - f"𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩....\n\n𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {ASS_NAME} ᴛᴏ {message.chat.title}." - ) - try: - await app2.join_chat(invitelink) - await asyncio.sleep(2) - await GJ516.edit_text( - f"{ASS_NAME} 𝙅𝙤𝙞𝙣𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮 ,\n\n𝙎𝙩𝙖𝙧𝙩𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢..." - ) - except UserAlreadyParticipant: - pass - except Exception as ex: - return await GJ516.edit_text( - f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" - ) - try: - await app2.resolve_peer(invitelink) - except: - pass - - ruser = message.from_user.first_name - audio = ( - (message.reply_to_message.audio or message.reply_to_message.voice) - if message.reply_to_message - else None - ) - url = get_url(message) - if audio: - if round(audio.duration / 60) > DURATION_LIMIT: - raise DurationLimitError( - f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." - ) - - file_name = get_file_name(audio) - title = file_name - duration = round(audio.duration / 60) - file_path = ( - await message.reply_to_message.download(file_name) - if not os.path.isfile(os.path.join("downloads", file_name)) - else f"downloads/{file_name}" - ) - - elif url: - try: - results = YoutubeSearch(url, max_results=1).to_dict() - title = results[0]["title"] - duration = results[0]["duration"] - videoid = results[0]["id"] - - secmul, dur, dur_arr = 1, 0, duration.split(":") - for i in range(len(dur_arr) - 1, -1, -1): - dur += int(dur_arr[i]) * secmul - secmul *= 60 - - except Exception as e: - return await GJ516.edit_text(f"𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙒𝙚𝙣𝙩 𝙒𝙧𝙤𝙣𝙜 \n\n**𝙀𝙧𝙧𝙤𝙧 :** `{e}`") - - if (dur / 60) > DURATION_LIMIT: - return await GJ516.edit_text( - f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." - ) - file_path = audio_dl(url) - else: - if len(message.command) < 2: - return await GJ516.edit_text("𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ") - await GJ516.edit_text("⚡") - query = message.text.split(None, 1)[1] - try: - results = YoutubeSearch(query, max_results=1).to_dict() - url = f"https://youtube.com{results[0]['url_suffix']}" - title = results[0]["title"] - videoid = results[0]["id"] - duration = results[0]["duration"] - - secmul, dur, dur_arr = 1, 0, duration.split(":") - for i in range(len(dur_arr) - 1, -1, -1): - dur += int(dur_arr[i]) * secmul - secmul *= 60 - - except Exception as e: - LOGGER.error(str(e)) - return await GJ516.edit("𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝙋𝙧𝙤𝙘𝙚𝙨𝙨 𝙦𝙪𝙚𝙧𝙮, 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙖𝙜𝙖𝙞𝙣...") - - if (dur / 60) > DURATION_LIMIT: - return await GJ516.edit( - f"𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." - ) - file_path = audio_dl(url) - - try: - videoid = videoid - except: - videoid = "fuckitstgaudio" - if await is_active_chat(message.chat.id): - await put( - message.chat.id, - title, - duration, - videoid, - file_path, - ruser, - message.from_user.id, - ) - position = len(GJ516db.get(message.chat.id)) - qimg = await gen_qthumb(videoid, message.from_user.id) - await message.reply_photo( - photo=qimg, - caption=f"**⏳ 𝘼𝙙𝙙𝙚𝙙 𝙩𝙤 𝙌𝙪𝙚𝙪𝙚 𝙖𝙩 #{position}**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**⏱𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣:** `{duration}`\n**👤𝘼𝙙𝙙𝙚𝙙 𝘽𝙮:** {ruser}", - reply_markup=jaybuttons, - ) - else: - stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) - try: - await pytgcalls.join_group_call( - message.chat.id, - stream, - stream_type=StreamType().pulse_stream, - ) - - except NoActiveGroupCall: - return await GJ516.edit_text( - "**𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝙁𝙤𝙪𝙣𝙙.**\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙈𝙖𝙠𝙚 𝙎𝙪𝙧𝙚 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙏𝙝𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩 ." - ) - except TelegramServerError: - return await GJ516.edit_text( - "𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙞𝙨 𝙝𝙖𝙫𝙞𝙣𝙜 𝙎𝙤𝙢𝙚 𝙄𝙣𝙩𝙚𝙧𝙣𝙖𝙡 𝙋𝙧𝙤𝙗𝙡𝙚𝙢, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙍𝙚𝙨𝙩𝙖𝙧𝙩 𝙏𝙝𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝘼𝙜𝙖𝙞𝙣." - ) - except UnMuteNeeded: - return await GJ516.edit_text( - f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙞𝙨 𝙈𝙪𝙩𝙚𝙙 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩,\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙢𝙪𝙩𝙚 {ASS_MENTION} 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣." - ) - - imgt = await gen_thumb(videoid, message.from_user.id) - await stream_on(message.chat.id) - await add_active_chat(message.chat.id) - await message.reply_photo( - photo=imgt, - caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n**💡𝙏𝙞𝙩𝙡𝙚:** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n**👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮:** {ruser}", - reply_markup=buttons, - ) - - return await GJ516.delete() From 2daf99ebcbb9a7ed0bae9d31135ff3b42bdfd8c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:23:48 +0530 Subject: [PATCH 175/211] Add files via upload --- GJ516Music/Modules/play.py | 258 +++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 GJ516Music/Modules/play.py diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py new file mode 100644 index 0000000..7aa0c5c --- /dev/null +++ b/GJ516Music/Modules/play.py @@ -0,0 +1,258 @@ +# MIT License +# +# Copyright (c) 2023 AnonymousX1025 +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import asyncio +import os + +from pyrogram import filters +from pyrogram.enums import ChatMemberStatus +from pyrogram.errors import ( + ChatAdminRequired, + UserAlreadyParticipant, + UserNotParticipant, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from pytgcalls import StreamType +from pytgcalls.exceptions import NoActiveGroupCall, TelegramServerError, UnMuteNeeded +from pytgcalls.types import AudioPiped, HighQualityAudio +from youtube_search import YoutubeSearch + +from config import DURATION_LIMIT +from FallenMusic import ( + ASS_ID, + ASS_MENTION, + ASS_NAME, + ASS_USERNAME, + BOT_NAME, + BOT_USERNAME, + LOGGER, + app, + app2, + fallendb, + pytgcalls, +) +from FallenMusic.Helpers.active import add_active_chat, is_active_chat, stream_on +from FallenMusic.Helpers.downloaders import audio_dl +from FallenMusic.Helpers.errors import DurationLimitError +from FallenMusic.Helpers.gets import get_file_name, get_url +from FallenMusic.Helpers.inline import buttons +from FallenMusic.Helpers.queue import put +from FallenMusic.Helpers.thumbnails import gen_qthumb, gen_thumb + + +@app.on_message( + filters.command(["play", "vplay", "p"]) + & filters.group + & ~filters.forwarded + & ~filters.via_bot +) +async def play(_, message: Message): + fallen = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + try: + await message.delete() + except: + pass + + try: + try: + get = await app.get_chat_member(message.chat.id, ASS_ID) + except ChatAdminRequired: + return await fallen.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + if get.status == ChatMemberStatus.BANNED: + unban_butt = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=f"ᴜɴʙᴀɴ {ASS_NAME}", + callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", + ), + ] + ] + ) + return await fallen.edit_text( + text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", + reply_markup=unban_butt, + ) + except UserNotParticipant: + if message.chat.username: + invitelink = message.chat.username + try: + await app2.resolve_peer(invitelink) + except Exception as ex: + LOGGER.error(ex) + else: + try: + invitelink = await app.export_chat_invite_link(message.chat.id) + except ChatAdminRequired: + return await fallen.edit_text( + f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + ) + except Exception as ex: + return await fallen.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + if invitelink.startswith("https://t.me/+"): + invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") + anon = await fallen.edit_text( + f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." + ) + try: + await app2.join_chat(invitelink) + await asyncio.sleep(2) + await fallen.edit_text( + f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + ) + except UserAlreadyParticipant: + pass + except Exception as ex: + return await fallen.edit_text( + f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + ) + try: + await app2.resolve_peer(invitelink) + except: + pass + + ruser = message.from_user.first_name + audio = ( + (message.reply_to_message.audio or message.reply_to_message.voice) + if message.reply_to_message + else None + ) + url = get_url(message) + if audio: + if round(audio.duration / 60) > DURATION_LIMIT: + raise DurationLimitError( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + + file_name = get_file_name(audio) + title = file_name + duration = round(audio.duration / 60) + file_path = ( + await message.reply_to_message.download(file_name) + if not os.path.isfile(os.path.join("downloads", file_name)) + else f"downloads/{file_name}" + ) + + elif url: + try: + results = YoutubeSearch(url, max_results=1).to_dict() + title = results[0]["title"] + duration = results[0]["duration"] + videoid = results[0]["id"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + return await fallen.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") + + if (dur / 60) > DURATION_LIMIT: + return await fallen.edit_text( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + else: + if len(message.command) < 2: + return await fallen.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") + await fallen.edit_text("🔎") + query = message.text.split(None, 1)[1] + try: + results = YoutubeSearch(query, max_results=1).to_dict() + url = f"https://youtube.com{results[0]['url_suffix']}" + title = results[0]["title"] + videoid = results[0]["id"] + duration = results[0]["duration"] + + secmul, dur, dur_arr = 1, 0, duration.split(":") + for i in range(len(dur_arr) - 1, -1, -1): + dur += int(dur_arr[i]) * secmul + secmul *= 60 + + except Exception as e: + LOGGER.error(str(e)) + return await fallen.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") + + if (dur / 60) > DURATION_LIMIT: + return await fallen.edit( + f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + ) + file_path = audio_dl(url) + + try: + videoid = videoid + except: + videoid = "fuckitstgaudio" + if await is_active_chat(message.chat.id): + await put( + message.chat.id, + title, + duration, + videoid, + file_path, + ruser, + message.from_user.id, + ) + position = len(fallendb.get(message.chat.id)) + qimg = await gen_qthumb(videoid, message.from_user.id) + await message.reply_photo( + photo=qimg, + caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + else: + stream = AudioPiped(file_path, audio_parameters=HighQualityAudio()) + try: + await pytgcalls.join_group_call( + message.chat.id, + stream, + stream_type=StreamType().pulse_stream, + ) + + except NoActiveGroupCall: + return await fallen.edit_text( + "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + ) + except TelegramServerError: + return await fallen.edit_text( + "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." + ) + except UnMuteNeeded: + return await fallen.edit_text( + f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." + ) + + imgt = await gen_thumb(videoid, message.from_user.id) + await stream_on(message.chat.id) + await add_active_chat(message.chat.id) + await message.reply_photo( + photo=imgt, + caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + reply_markup=buttons, + ) + + return await fallen.delete() From 726907c8ecca523206e50ade6424e26d9af1ab8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 10:30:50 +0530 Subject: [PATCH 176/211] Update play.py --- GJ516Music/Modules/play.py | 48 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 7aa0c5c..956e96a 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -37,7 +37,7 @@ from youtube_search import YoutubeSearch from config import DURATION_LIMIT -from FallenMusic import ( +from GJ516Music import ( ASS_ID, ASS_MENTION, ASS_NAME, @@ -50,13 +50,13 @@ fallendb, pytgcalls, ) -from FallenMusic.Helpers.active import add_active_chat, is_active_chat, stream_on -from FallenMusic.Helpers.downloaders import audio_dl -from FallenMusic.Helpers.errors import DurationLimitError -from FallenMusic.Helpers.gets import get_file_name, get_url -from FallenMusic.Helpers.inline import buttons -from FallenMusic.Helpers.queue import put -from FallenMusic.Helpers.thumbnails import gen_qthumb, gen_thumb +from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on +from GJ516Music.Helpers.downloaders import audio_dl +from GJ516Music.Helpers.errors import DurationLimitError +from GJ516Music.Helpers.gets import get_file_name, get_url +from GJ516Music.Helpers.inline import buttons +from GJ516Music.Helpers.queue import put +from GJ516Music.Helpers.thumbnails import gen_qthumb, gen_thumb @app.on_message( @@ -66,7 +66,7 @@ & ~filters.via_bot ) async def play(_, message: Message): - fallen = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") try: await message.delete() except: @@ -76,7 +76,7 @@ async def play(_, message: Message): try: get = await app.get_chat_member(message.chat.id, ASS_ID) except ChatAdminRequired: - return await fallen.edit_text( + return await GJ516.edit_text( f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." ) if get.status == ChatMemberStatus.BANNED: @@ -90,7 +90,7 @@ async def play(_, message: Message): ] ] ) - return await fallen.edit_text( + return await GJ516.edit_text( text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", reply_markup=unban_butt, ) @@ -105,28 +105,28 @@ async def play(_, message: Message): try: invitelink = await app.export_chat_invite_link(message.chat.id) except ChatAdminRequired: - return await fallen.edit_text( + return await GJ516.edit_text( f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." ) except Exception as ex: - return await fallen.edit_text( + return await GJ516.edit_text( f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" ) if invitelink.startswith("https://t.me/+"): invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") - anon = await fallen.edit_text( + anon = await GJ516.edit_text( f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." ) try: await app2.join_chat(invitelink) await asyncio.sleep(2) - await fallen.edit_text( + await GJ516.edit_text( f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." ) except UserAlreadyParticipant: pass except Exception as ex: - return await fallen.edit_text( + return await GJ516.edit_text( f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" ) try: @@ -172,13 +172,13 @@ async def play(_, message: Message): return await fallen.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") if (dur / 60) > DURATION_LIMIT: - return await fallen.edit_text( + return await GJ516.edit_text( f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." ) file_path = audio_dl(url) else: if len(message.command) < 2: - return await fallen.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") + return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") await fallen.edit_text("🔎") query = message.text.split(None, 1)[1] try: @@ -198,7 +198,7 @@ async def play(_, message: Message): return await fallen.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") if (dur / 60) > DURATION_LIMIT: - return await fallen.edit( + return await GJ516.edit( f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." ) file_path = audio_dl(url) @@ -234,15 +234,15 @@ async def play(_, message: Message): ) except NoActiveGroupCall: - return await fallen.edit_text( + return await GJ516.edit_text( "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." ) except TelegramServerError: - return await fallen.edit_text( + return await GJ516.edit_text( "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." ) except UnMuteNeeded: - return await fallen.edit_text( + return await GJ516.edit_text( f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." ) @@ -255,4 +255,4 @@ async def play(_, message: Message): reply_markup=buttons, ) - return await fallen.delete() + return await GJ516.delete() From 6fb1ced2cdc47da3993475e7ac6d08a05b2510ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 11:43:12 +0530 Subject: [PATCH 177/211] Update play.py --- GJ516Music/Modules/play.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 956e96a..a2b0385 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -47,7 +47,7 @@ LOGGER, app, app2, - fallendb, + GJ516db, pytgcalls, ) from GJ516Music.Helpers.active import add_active_chat, is_active_chat, stream_on @@ -66,7 +66,7 @@ & ~filters.via_bot ) async def play(_, message: Message): - GJ516 = await message.reply_text("» ᴘʀᴏᴄᴇssɪɴɢ, ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...") + GJ516 = await message.reply_text("» 𝙋𝙧𝙤𝙘𝙚𝙨𝙨𝙞𝙣𝙜, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩 ........") try: await message.delete() except: @@ -77,21 +77,21 @@ async def play(_, message: Message): get = await app.get_chat_member(message.chat.id, ASS_ID) except ChatAdminRequired: return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + f"» 𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." ) if get.status == ChatMemberStatus.BANNED: unban_butt = InlineKeyboardMarkup( [ [ InlineKeyboardButton( - text=f"ᴜɴʙᴀɴ {ASS_NAME}", + text=f"𝙐𝙣𝙗𝙖𝙣 {ASS_NAME}", callback_data=f"unban_assistant {message.chat.id}|{ASS_ID}", ), ] ] ) return await GJ516.edit_text( - text=f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ʙᴀɴɴᴇᴅ ɪɴ {message.chat.title}\n\n𖢵 ɪᴅ : `{ASS_ID}`\n𖢵 ɴᴀᴍᴇ : {ASS_MENTION}\n𖢵 ᴜsᴇʀɴᴀᴍᴇ : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", + text=f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙄𝙨 𝘽𝙖𝙣 𝙄𝙣 {message.chat.title}\n\n☍ 𝙄𝙙 : `{ASS_ID}`\n☍ 𝙉𝙖𝙢𝙚 : {ASS_MENTION}\n☍ 𝙐𝙨𝙚𝙧𝙣𝙖𝙢𝙚 : @{ASS_USERNAME}\n\nᴘʟᴇᴀsᴇ ᴜɴʙᴀɴ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴀɴᴅ ᴘʟᴀʏ ᴀɢᴀɪɴ...", reply_markup=unban_butt, ) except UserNotParticipant: @@ -106,11 +106,11 @@ async def play(_, message: Message): invitelink = await app.export_chat_invite_link(message.chat.id) except ChatAdminRequired: return await GJ516.edit_text( - f"» ɪ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ɪɴᴠɪᴛᴇ ᴜsᴇʀs ᴠɪᴀ ʟɪɴᴋ ғᴏʀ ɪɴᴠɪᴛɪɴɢ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}." + f"» 𝙄 𝙙𝙤𝙣'𝙩 𝙃𝙖𝙫𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙋𝙚𝙧𝙢𝙞𝙨𝙨𝙞𝙤𝙣 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 𝙐𝙨𝙚𝙧𝙨 𝙑𝙞𝙖 𝙇𝙞𝙣𝙠 𝙁𝙤𝙧 𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}." ) except Exception as ex: return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" ) if invitelink.startswith("https://t.me/+"): invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") @@ -121,7 +121,7 @@ async def play(_, message: Message): await app2.join_chat(invitelink) await asyncio.sleep(2) await GJ516.edit_text( - f"{ASS_NAME} ᴊᴏɪɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + f"{ASS_NAME} 𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩....,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." ) except UserAlreadyParticipant: pass From 61abbe452d11afabd2ba26736f4b5a92805d4591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:15:22 +0530 Subject: [PATCH 178/211] Update inline.py --- GJ516Music/Helpers/inline.py | 60 ++++++++++++++---------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index d634f0f..4dca441 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -1,6 +1,6 @@ # MIT License # -# Copyright (c) 2023 AnonymousX1025 +# Copyright (c) 2023 MrProgrammer72 # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,20 +23,18 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup import config -from FallenMusic import BOT_USERNAME +from GJ516Music import BOT_USERNAME close_key = InlineKeyboardMarkup( - [[InlineKeyboardButton(text="✯ ᴄʟᴏsᴇ ✯", callback_data="close")]] + [[InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close")]] ) buttons = InlineKeyboardMarkup( [ [ - InlineKeyboardButton(text="▷", callback_data="resume_cb"), - InlineKeyboardButton(text="II", callback_data="pause_cb"), - InlineKeyboardButton(text="‣‣I", callback_data="skip_cb"), - InlineKeyboardButton(text="▢", callback_data="end_cb"), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙂𝙧𝙤𝙪𝙥❱", url=config.SUPPORT_CHAT), ] ] ) @@ -45,20 +43,17 @@ pm_buttons = [ [ InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + text="𝗔𝗱𝗱 𝗺𝗲 𝘁𝗼 𝘆𝗼𝘂𝗿 𝗴𝗿𝗼𝘂𝗽", url=f"https://t.me/{BOT_USERNAME}?startgroup=true", ) ], - [InlineKeyboardButton(text="ʜᴇʟᴩ & ᴄᴏᴍᴍᴀɴᴅs", callback_data="fallen_help")], + [InlineKeyboardButton(text="❰𝘾𝙤𝙢𝙢𝙖𝙣𝙙𝙨❱", callback_data="fallen_help")], [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), + InlineKeyboardButton(text="❰𝗖𝗵𝗮𝗻𝗻𝗲𝗹❱", url=config.SUPPORT_CHANNEL), + InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), ], [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/AnonymousX1025/FallenMusic" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + InlineKeyboardButton(text="❰𝙊𝙬𝙣𝙚𝙧❱", user_id=config.OWNER_ID), ], ] @@ -66,19 +61,12 @@ gp_buttons = [ [ InlineKeyboardButton( - text="ᴀᴅᴅ ᴍᴇ ᴛᴏ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + text="𝗔𝗱𝗱 𝗺𝗲 𝘁𝗼 𝘆𝗼𝘂𝗿 𝗴𝗿𝗼𝘂𝗽", url=f"https://t.me/{BOT_USERNAME}?startgroup=true", ) ], [ - InlineKeyboardButton(text="❄ ᴄʜᴀɴɴᴇʟ ❄", url=config.SUPPORT_CHANNEL), - InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT), - ], - [ - InlineKeyboardButton( - text="☁️ sᴏᴜʀᴄᴇ ☁️", url="https://github.com/TheAnonymous2005/FallenMusic" - ), - InlineKeyboardButton(text="🥀 ᴅᴇᴠᴇʟᴏᴩᴇʀ 🥀", user_id=config.OWNER_ID), + InlineKeyboardButton(text="GIT REPO", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], ] @@ -86,25 +74,23 @@ helpmenu = [ [ InlineKeyboardButton( - text="ᴇᴠᴇʀʏᴏɴᴇ", - callback_data="fallen_cb help", - ) - ], - [ - InlineKeyboardButton(text="sᴜᴅᴏ", callback_data="fallen_cb sudo"), - InlineKeyboardButton(text="ᴏᴡɴᴇʀ", callback_data="fallen_cb owner"), + text="𝘽𝙤𝙩𝙪𝙨𝙚𝙧", + callback_data="GJ516_cb help", + ), + InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), + ], + [ InlineKeyboardButton(text="REO", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="fallen_home"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + InlineKeyboardButton(text="◁", callback_data="GJ516_home"), + InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), ], ] help_back = [ - [InlineKeyboardButton(text="✨ sᴜᴩᴩᴏʀᴛ ✨", url=config.SUPPORT_CHAT)], - [ - InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="fallen_help"), - InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close"), + [ + InlineKeyboardButton(text="◁", callback_data="GJ516_help"), + InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), ], ] From 6d2824c68d1a0f659670aff69856890f0f07bed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:16:22 +0530 Subject: [PATCH 179/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 4dca441..2e5f9a9 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -23,7 +23,7 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup import config -from GJ516Music import BOT_USERNAME +from GJ516Music import BOT_USERNAME, OWNER_ID, SUPPORT_CHAT close_key = InlineKeyboardMarkup( [[InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close")]] From 59b0b955e899a3dffdf9fcaeec7240445435b2f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:23:30 +0530 Subject: [PATCH 180/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 2e5f9a9..34b8d1b 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -66,7 +66,7 @@ ) ], [ - InlineKeyboardButton(text="GIT REPO", url=f"https://github.com/MrProgrammer72/GJ516Music"), + InlineKeyboardButton(text="𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], ] @@ -79,7 +79,7 @@ ), InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], - [ InlineKeyboardButton(text="REO", url=f"https://github.com/MrProgrammer72/GJ516Music"), + [ InlineKeyboardButton(text="𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ InlineKeyboardButton(text="◁", callback_data="GJ516_home"), From e33a5a5ea1b78d9a5c66fee7d2d6747c5c5f33e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:42:19 +0530 Subject: [PATCH 181/211] Update play.py --- GJ516Music/Modules/play.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index a2b0385..b3bfb25 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -115,19 +115,19 @@ async def play(_, message: Message): if invitelink.startswith("https://t.me/+"): invitelink = invitelink.replace("https://t.me/+", "https://t.me/joinchat/") anon = await GJ516.edit_text( - f"ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ...\n\nɪɴᴠɪᴛɪɴɢ {ASS_NAME} ᴛᴏ {message.chat.title}." + f"𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩....\n\n𝙄𝙣𝙫𝙞𝙩𝙞𝙣𝙜 {ASS_NAME} ᴛᴏ {message.chat.title}." ) try: await app2.join_chat(invitelink) await asyncio.sleep(2) await GJ516.edit_text( - f"{ASS_NAME} 𝙋𝙡𝙚𝙖𝙨𝙚 𝙒𝙖𝙞𝙩....,\n\nsᴛᴀʀᴛɪɴɢ sᴛʀᴇᴀᴍ..." + f"{ASS_NAME} 𝙅𝙤𝙞𝙣𝙚𝙙 𝙎𝙪𝙘𝙘𝙚𝙨𝙨𝙛𝙪𝙡𝙡𝙮,\n\n𝙎𝙩𝙖𝙧𝙩𝙞𝙣𝙜 𝙎𝙩𝙧𝙚𝙖𝙢....." ) except UserAlreadyParticipant: pass except Exception as ex: return await GJ516.edit_text( - f"ғᴀɪʟᴇᴅ ᴛᴏ ɪɴᴠɪᴛᴇ {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ᴛᴏ {message.chat.title}.\n\n**ʀᴇᴀsᴏɴ :** `{ex}`" + f"𝙁𝙖𝙞𝙡𝙚𝙙 𝙏𝙤 𝙄𝙣𝙫𝙞𝙩𝙚 {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙏𝙤 {message.chat.title}.\n\n**𝙍𝙚𝙖𝙨𝙤𝙣 :** `{ex}`" ) try: await app2.resolve_peer(invitelink) @@ -144,7 +144,7 @@ async def play(_, message: Message): if audio: if round(audio.duration / 60) > DURATION_LIMIT: raise DurationLimitError( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"»𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_name = get_file_name(audio) @@ -169,17 +169,17 @@ async def play(_, message: Message): secmul *= 60 except Exception as e: - return await fallen.edit_text(f"sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ\n\n**ᴇʀʀᴏʀ :** `{e}`") + return await fallen.edit_text(f"𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙒𝙚𝙣𝙩 𝙒𝙧𝙤𝙣𝙜\n\n**𝙀𝙧𝙧𝙤𝙧:** `{e}`") if (dur / 60) > DURATION_LIMIT: return await GJ516.edit_text( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"»𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text("» ᴡʜᴀᴛ ᴅᴏ ʏᴏᴜ ᴡᴀɴɴᴀ ᴘʟᴀʏ ʙᴀʙʏ ?") - await fallen.edit_text("🔎") + return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ") ?") + await GJ516.edit_text("⚡") query = message.text.split(None, 1)[1] try: results = YoutubeSearch(query, max_results=1).to_dict() @@ -195,11 +195,11 @@ async def play(_, message: Message): except Exception as e: LOGGER.error(str(e)) - return await fallen.edit("» ғᴀɪʟᴇᴅ ᴛᴏ ᴘʀᴏᴄᴇss ᴏ̨ᴜᴇʀʏ, ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ...") + return await GJ516.edit("𝙁𝙖𝙞𝙡𝙚𝙙 𝙩𝙤 𝙋𝙧𝙤𝙘𝙚𝙨𝙨 𝙦𝙪𝙚𝙧𝙮, 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝙖𝙜𝙖𝙞𝙣......") if (dur / 60) > DURATION_LIMIT: return await GJ516.edit( - f"» sᴏʀʀʏ ʙᴀʙʏ, ᴛʀᴀᴄᴋ ʟᴏɴɢᴇʀ ᴛʜᴀɴ {DURATION_LIMIT} ᴍɪɴᴜᴛᴇs ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴘʟᴀʏ ᴏɴ {BOT_NAME}." + f"»𝙎𝙤𝙧𝙧𝙮, 𝙏𝙧𝙖𝙘𝙠 𝙇𝙤𝙣𝙜𝙚𝙧 𝙏𝙝𝙖𝙣 {DURATION_LIMIT} 𝙈𝙞𝙣 𝘼𝙧𝙚 𝙉𝙤𝙩 𝘼𝙡𝙡𝙤𝙬𝙚𝙙 𝙏𝙤 𝙥𝙡𝙖𝙮 𝙤𝙣 {BOT_NAME}." ) file_path = audio_dl(url) @@ -221,7 +221,7 @@ async def play(_, message: Message): qimg = await gen_qthumb(videoid, message.from_user.id) await message.reply_photo( photo=qimg, - caption=f"**➻ ᴀᴅᴅᴇᴅ ᴛᴏ ᴏ̨ᴜᴇᴜᴇ ᴀᴛ {position}**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + caption=f"**⏳ 𝘼𝙙𝙙𝙚𝙙 𝙩𝙤 𝙌𝙪𝙚𝙪𝙚 𝙖𝙩 {position}**\n\n💡 **𝙏𝙞𝙩𝙡𝙚 :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n⏱ **𝘿𝙪𝙧𝙖𝙩𝙞𝙤𝙣 :** `{duration}` ᴍɪɴᴜᴛᴇs\n👤 **𝘼𝙙𝙙𝙚𝙙 𝘽𝙮 :** {ruser}", reply_markup=buttons, ) else: @@ -235,15 +235,15 @@ async def play(_, message: Message): except NoActiveGroupCall: return await GJ516.edit_text( - "**» ɴᴏ ᴀᴄᴛɪᴠᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ғᴏᴜɴᴅ.**\n\nᴩʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ sᴛᴀʀᴛᴇᴅ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ." + "**𝙉𝙤 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝙁𝙤𝙪𝙣𝙙..**\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙈𝙖𝙠𝙚 𝙎𝙪𝙧𝙚 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙏𝙝𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩 .." ) except TelegramServerError: return await GJ516.edit_text( - "» ᴛᴇʟᴇɢʀᴀᴍ ɪs ʜᴀᴠɪɴɢ sᴏᴍᴇ ɪɴᴛᴇʀɴᴀʟ ᴘʀᴏʙʟᴇᴍs, ᴘʟᴇᴀsᴇ ʀᴇsᴛᴀʀᴛ ᴛʜᴇ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴀɢᴀɪɴ." + "»𝙏𝙚𝙡𝙚𝙜𝙧𝙖𝙢 𝙞𝙨 𝙝𝙖𝙫𝙞𝙣𝙜 𝙎𝙤𝙢𝙚 𝙄𝙣𝙩𝙚𝙧𝙣𝙖𝙡 𝙋𝙧𝙤𝙗𝙡𝙚𝙢, 𝙋𝙡𝙚𝙖𝙨𝙚 𝙍𝙚𝙨𝙩𝙖𝙧𝙩 𝙏𝙝𝙚 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝘼𝙜𝙖𝙞𝙣." ) except UnMuteNeeded: return await GJ516.edit_text( - f"» {BOT_NAME} ᴀssɪsᴛᴀɴᴛ ɪs ᴍᴜᴛᴇᴅ ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ,\n\nᴘʟᴇᴀsᴇ ᴜɴᴍᴜᴛᴇ {ASS_MENTION} ᴏɴ ᴠɪᴅᴇᴏᴄʜᴀᴛ ᴀɴᴅ ᴛʀʏ ᴘʟᴀʏɪɴɢ ᴀɢᴀɪɴ." + f"» {BOT_NAME} 𝘼𝙨𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙞𝙨 𝙈𝙪𝙩𝙚𝙙 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩,\n\n𝙋𝙡𝙚𝙖𝙨𝙚 𝙐𝙣𝙢𝙪𝙩𝙚 {ASS_MENTION} 𝙊𝙣 𝙑𝙞𝙙𝙚𝙤𝘾𝙝𝙖𝙩 𝘼𝙣𝙙 𝙏𝙧𝙮 𝙋𝙡𝙖𝙮𝙞𝙣𝙜 𝘼𝙜𝙖𝙞𝙣." ) imgt = await gen_thumb(videoid, message.from_user.id) @@ -251,7 +251,7 @@ async def play(_, message: Message): await add_active_chat(message.chat.id) await message.reply_photo( photo=imgt, - caption=f"**➻ sᴛᴀʀᴛᴇᴅ sᴛʀᴇᴀᴍɪɴɢ**\n\n‣ **ᴛɪᴛʟᴇ :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **ᴅᴜʀᴀᴛɪᴏɴ :** `{duration}` ᴍɪɴᴜᴛᴇs\n‣ **ʀᴇǫᴜᴇsᴛᴇᴅ ʙʏ :** {ruser}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n💡 **𝙏𝙞𝙩𝙡𝙚 :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮 :** {ruser}", reply_markup=buttons, ) From 35ac74527e64da4c29a6e66523be1f9bc0a3f392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:44:09 +0530 Subject: [PATCH 182/211] Update inline.py --- GJ516Music/Helpers/inline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 34b8d1b..8b30963 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -47,7 +47,7 @@ url=f"https://t.me/{BOT_USERNAME}?startgroup=true", ) ], - [InlineKeyboardButton(text="❰𝘾𝙤𝙢𝙢𝙖𝙣𝙙𝙨❱", callback_data="fallen_help")], + [InlineKeyboardButton(text="❰𝘾𝙤𝙢𝙢𝙖𝙣𝙙𝙨❱", callback_data="GJ516_help")], [ InlineKeyboardButton(text="❰𝗖𝗵𝗮𝗻𝗻𝗲𝗹❱", url=config.SUPPORT_CHANNEL), InlineKeyboardButton(text="❰𝗚𝗿𝗼𝘂𝗽❱", url=config.SUPPORT_CHAT), @@ -79,7 +79,7 @@ ), InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], - [ InlineKeyboardButton(text="𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆", url=f"https://github.com/MrProgrammer72/GJ516Music"), + [ InlineKeyboardButton(text="⚡𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆⚡", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ InlineKeyboardButton(text="◁", callback_data="GJ516_home"), From 1199e0c7a01c504522c032c570b9a8b1daa5e729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 12:50:42 +0530 Subject: [PATCH 183/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 54debaa..8ae9ab9 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/eb6058c1ae3cb90f517e5.jpg") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg") START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") SESSION = getenv("SESSION", None) From d4ee129ecfdd9e3a3817f7664d7570f4b645dc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:01:41 +0530 Subject: [PATCH 184/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 8ae9ab9..3125c51 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg") -START_IMG = getenv("START_IMG", "https://te.legra.ph/file/3d3af9872f3a949391486.jpg") +START_IMG = getenv("START_IMG", "https://telegra.ph/file/cc58e710f16d5d33e1055.jpg") SESSION = getenv("SESSION", None) From d38e1872eb74f005c5e9da0c56a50716b2b96ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:03:22 +0530 Subject: [PATCH 185/211] Update app.json --- app.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.json b/app.json index c879c8e..b2cf08d 100644 --- a/app.json +++ b/app.json @@ -5,7 +5,7 @@ "keywords": [ "python3", "telegram", - "Fallen", + "GJ516", "MusicBot", "telegram-bot", "pyrogram" From 06a6f88729fcb8a1dbb016655d5de82136227550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:09:26 +0530 Subject: [PATCH 186/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 3125c51..d9687e4 100644 --- a/config.py +++ b/config.py @@ -14,7 +14,7 @@ OWNER_ID = int(getenv("OWNER_ID")) PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg") -START_IMG = getenv("START_IMG", "https://telegra.ph/file/cc58e710f16d5d33e1055.jpg") +START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From b963660ac6661a392f81aa1700825b4230cb3d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:29:05 +0530 Subject: [PATCH 187/211] Update README.md --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index c828eec..c9eeffc 100644 --- a/.github/README.md +++ b/.github/README.md @@ -3,7 +3,7 @@ ──「 𝗚𝗝𝟱𝟭𝟲 𝗩𝗰 𝗣𝗹𝗮𝘆𝗲𝗿 」──

- +

━━━━━━━━━━━━━━━━━━━━

Stars From a02610b6b04500f704956990d425a11ce9cfab24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:46:03 +0530 Subject: [PATCH 188/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 8b30963..055c4fd 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -23,7 +23,7 @@ from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup import config -from GJ516Music import BOT_USERNAME, OWNER_ID, SUPPORT_CHAT +from GJ516Music import BOT_USERNAME close_key = InlineKeyboardMarkup( [[InlineKeyboardButton(text="❰𝗖𝗹𝗼𝘀𝗲❱", callback_data="close")]] From 3d05926fdcc39f62b4dc30eaae1ddd46c9ca1e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:51:52 +0530 Subject: [PATCH 189/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index b3bfb25..cb029ad 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -169,7 +169,7 @@ async def play(_, message: Message): secmul *= 60 except Exception as e: - return await fallen.edit_text(f"𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙒𝙚𝙣𝙩 𝙒𝙧𝙤𝙣𝙜\n\n**𝙀𝙧𝙧𝙤𝙧:** `{e}`") + return await GJ516.edit_text(f"𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙒𝙚𝙣𝙩 𝙒𝙧𝙤𝙣𝙜\n\n**𝙀𝙧𝙧𝙤𝙧:** `{e}`") if (dur / 60) > DURATION_LIMIT: return await GJ516.edit_text( From e09ae34cda8a28793dd1c5ebeef86222398ee49b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:52:37 +0530 Subject: [PATCH 190/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index cb029ad..4bb1284 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -217,7 +217,7 @@ async def play(_, message: Message): ruser, message.from_user.id, ) - position = len(fallendb.get(message.chat.id)) + position = len(GJ516db.get(message.chat.id)) qimg = await gen_qthumb(videoid, message.from_user.id) await message.reply_photo( photo=qimg, From 854af4bc2aeecc00fcd5cf07b74ef46990cb03b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 13:56:19 +0530 Subject: [PATCH 191/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index 4bb1284..d0cacbc 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -178,7 +178,7 @@ async def play(_, message: Message): file_path = audio_dl(url) else: if len(message.command) < 2: - return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ") ?") + return await GJ516.edit_text(" 𝙂𝙞𝙫𝙚 𝙈𝙚 𝙔𝙤𝙪𝙧 𝙌𝙪𝙚𝙧𝙮 𝙒𝙝𝙞𝙘𝙝 𝙔𝙤𝙪 𝙬𝙖𝙣𝙩 𝙩𝙤 𝙋𝙡𝙖𝙮 ?") await GJ516.edit_text("⚡") query = message.text.split(None, 1)[1] try: From eabfa0765d2d925bbb0a61afe87a48149f709a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:08:31 +0530 Subject: [PATCH 192/211] Update inline.py --- GJ516Music/Helpers/inline.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 055c4fd..d4a8c1e 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -79,10 +79,10 @@ ), InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], - [ InlineKeyboardButton(text="⚡𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆⚡", url=f"https://github.com/MrProgrammer72/GJ516Music"), + [ InlineKeyboardButton(text="⚡ 𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆 ⚡", url=f"https://github.com/MrProgrammer72/GJ516Music"), ], [ - InlineKeyboardButton(text="◁", callback_data="GJ516_home"), + InlineKeyboardButton(text="𝗕𝗮𝗰𝗸", callback_data="GJ516_home"), InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), ], ] @@ -90,7 +90,7 @@ help_back = [ [ - InlineKeyboardButton(text="◁", callback_data="GJ516_help"), + InlineKeyboardButton(text="𝗕𝗮𝗰𝗸", callback_data="GJ516_help"), InlineKeyboardButton(text="𝗖𝗹𝗼𝘀𝗲", callback_data="close"), ], ] From 68535d6cf8c5a04549ec76048f749b2b79e988a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:09:18 +0530 Subject: [PATCH 193/211] Update play.py --- GJ516Music/Modules/play.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/play.py b/GJ516Music/Modules/play.py index d0cacbc..ddc771c 100644 --- a/GJ516Music/Modules/play.py +++ b/GJ516Music/Modules/play.py @@ -251,7 +251,7 @@ async def play(_, message: Message): await add_active_chat(message.chat.id) await message.reply_photo( photo=imgt, - caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n💡 **𝙏𝙞𝙩𝙡𝙚 :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n‣ **👤𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮 :** {ruser}", + caption=f"**📡 𝙎𝙩𝙖𝙧𝙩𝙚𝙙 𝙎𝙩𝙧𝙚𝙖𝙢𝙞𝙣𝙜 💡**\n\n💡 **𝙏𝙞𝙩𝙡𝙚 :** [{title[:27]}](https://t.me/{BOT_USERNAME}?start=info_{videoid})\n👤 **𝙍𝙚𝙦𝙪𝙚𝙨𝙩𝙚𝙙 𝘽𝙮 :** {ruser}", reply_markup=buttons, ) From 3b5e3b38b0db370b0c3e8527efd9a53d85a752b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sun, 2 Jul 2023 14:23:44 +0530 Subject: [PATCH 194/211] Update dossier.py --- GJ516Music/Helpers/dossier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/dossier.py b/GJ516Music/Helpers/dossier.py index 39e2c5d..47adce9 100644 --- a/GJ516Music/Helpers/dossier.py +++ b/GJ516Music/Helpers/dossier.py @@ -35,7 +35,7 @@ {1} 𝘾𝙖𝙣 𝙉𝙤𝙬 𝙋𝙡𝙖𝙮 𝙎𝙤𝙣𝙜 𝙄𝙣 {2}. ────────────────── -➻ 𝙁𝙤𝙧 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙃𝙚𝙡𝙥 𝘼𝙗𝙤𝙪𝙩 𝙈𝙚 𝙊𝙧 𝙄𝙛 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝘼𝙨𝙠 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙔𝙤𝙪 𝘾𝙖𝙣 𝙅𝙤𝙞𝙣 𝙈𝙮 [𝙂𝙧𝙤𝙪𝙥] ({3}) . +➻ 𝙁𝙤𝙧 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝙃𝙚𝙡𝙥 𝘼𝙗𝙤𝙪𝙩 𝙈𝙚 𝙊𝙧 𝙄𝙛 𝙔𝙤𝙪 𝙒𝙖𝙣𝙣𝙖 𝘼𝙨𝙠 𝙎𝙤𝙢𝙚𝙩𝙝𝙞𝙣𝙜 𝙔𝙤𝙪 𝘾𝙖𝙣 𝙅𝙤𝙞𝙣 𝙈𝙮 [𝙂𝙧𝙤𝙪𝙥](https://t.me/GJ516_DISCUSS_GROUP) """ HELP_TEXT = f""" From 6936aa4219c066dbd352525e6633cedd5d1378d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:12:37 +0530 Subject: [PATCH 195/211] Update inline.py --- GJ516Music/Helpers/inline.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index d4a8c1e..28aee83 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -77,6 +77,9 @@ text="𝘽𝙤𝙩𝙪𝙨𝙚𝙧", callback_data="GJ516_cb help", ), + + InlineKeyboradButton(text="", callback_data="GJ516_cb owner"), + InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], [ InlineKeyboardButton(text="⚡ 𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆 ⚡", url=f"https://github.com/MrProgrammer72/GJ516Music"), From 303d3edd27eecae77fd6482a1888882013d4f577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:15:00 +0530 Subject: [PATCH 196/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index 28aee83..d33a7f4 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -78,7 +78,7 @@ callback_data="GJ516_cb help", ), - InlineKeyboradButton(text="", callback_data="GJ516_cb owner"), + InlineKeyboradButton(text="𝙊𝙬𝙣𝙚𝙧", callback_data="GJ516_cb owner"), InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], From 7e8b8c6c01dfa6b61651bf6ca72abace1b238d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:25:17 +0530 Subject: [PATCH 197/211] Update inline.py --- GJ516Music/Helpers/inline.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/GJ516Music/Helpers/inline.py b/GJ516Music/Helpers/inline.py index d33a7f4..4e20414 100644 --- a/GJ516Music/Helpers/inline.py +++ b/GJ516Music/Helpers/inline.py @@ -77,8 +77,6 @@ text="𝘽𝙤𝙩𝙪𝙨𝙚𝙧", callback_data="GJ516_cb help", ), - - InlineKeyboradButton(text="𝙊𝙬𝙣𝙚𝙧", callback_data="GJ516_cb owner"), InlineKeyboardButton(text="𝙎𝙪𝙙𝙤𝙪𝙨𝙚𝙧", callback_data="GJ516_cb sudo"), ], From a3913a974ae4ece93137f04699eeedf3f3c2913e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:31:05 +0530 Subject: [PATCH 198/211] Update README.md --- .github/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index c9eeffc..483f1dc 100644 --- a/.github/README.md +++ b/.github/README.md @@ -121,5 +121,9 @@ ─「 ᴄʀᴇᴅɪᴛs 」─ - - [ᴅᴇᴠᴇʟᴏᴘᴇʀ](https://github.com/MrProgrammer72) ➻ [sᴏᴍᴇᴛʜɪɴɢ](https://github.com/MrProgrammer72/GJ516VCBOT) + - [ᴅᴇᴠᴇʟᴏᴘᴇʀ](https://github.com/MrProgrammer72) ➻ [sᴏᴍᴇᴛʜɪɴɢ](https://github.com/MrProgrammer72/GJ516VCBOT) + -

+ +

+ ━━━━━━━━━━━━━━━━━━━━ From 6f954b203bf62afb06e827979778fe57aa7123fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:36:22 +0530 Subject: [PATCH 199/211] Update README.md --- .github/README.md | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/.github/README.md b/.github/README.md index 483f1dc..6a5ab1f 100644 --- a/.github/README.md +++ b/.github/README.md @@ -72,34 +72,7 @@

- - Get your [NecesseryVariables](https://github.com/MrProgrammer72/GJ516Music/blob/master/sample.env) - - Upgrade and Update by : - `sudo apt-get update && sudo apt-get upgrade -y` - - Install required packages by : - `sudo apt-get install python3-pip ffmpeg -y` - - Install pip by : - `sudo pip3 install -U pip` - - Install node by : - `curl -fssL https://deb.nodesource.com/setup_18.x | sudo -E bash - && sudo apt-get install nodejs -y && npm i -g npm` - - Clone the repository by : - `git clone https://github.com/MrProgrammer72/GJ516Music && cd GJ516music` - - Install requirements by : - `pip3 install -U -r requirements.txt` - - Fill your variables in the env by : - `vi sample.env`
- Press `I` on the keyboard for editing env
- Press `Ctrl+C` when you're done with editing env and `:wq` to save the env
- - Rename the env file by : - `mv sample.env .env` - - Install tmux to keep running your bot when you close the terminal by : - `sudo apt install tmux && tmux` - - Finally run the bot by : - `bash GJ516` - - For getting out from tmux session
- Press `Ctrl+b` and then `d` - - - + Checkout [Docs](https://github.com/MrProgrammer72/YukkiMusicBot/wiki/yukki-Music-Bot-docs) for Detailed Explanation on VPS Deploy

From a6f5044b99b4173243257ed6d58e2476ebb3fd5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:37:20 +0530 Subject: [PATCH 200/211] Update README.md --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 6a5ab1f..54f61e5 100644 --- a/.github/README.md +++ b/.github/README.md @@ -72,7 +72,7 @@

- Checkout [Docs](https://github.com/MrProgrammer72/YukkiMusicBot/wiki/yukki-Music-Bot-docs) for Detailed Explanation on VPS Deploy + Checkout [Docs](https://github.com/MrProgrammer72/GJ516Music/wiki) for Detailed Explanation on VPS Deploy

From 162b8507ecbb2f412d94787972b26586ddee4cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:55:06 +0530 Subject: [PATCH 201/211] Update activevc.py --- GJ516Music/Modules/activevc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/activevc.py b/GJ516Music/Modules/activevc.py index 9092453..7c92e1a 100644 --- a/GJ516Music/Modules/activevc.py +++ b/GJ516Music/Modules/activevc.py @@ -30,7 +30,7 @@ @app.on_message(filters.command("activevc") & SUDOERS) async def activevc(_, message: Message): - mystic = await message.reply_text("𝙅𝙖𝙮 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩𝙨 𝙇𝙞𝙨𝙩... ☘") + mystic = await message.reply_text("𝙅𝙖𝙮 𝙂𝙚𝙩𝙩𝙞𝙣𝙜 𝘼𝙘𝙩𝙞𝙫𝙚 𝙑𝙤𝙞𝙘𝙚𝘾𝙝𝙖𝙩𝙨 𝙇𝙞𝙨𝙩.... ☘") chats = await get_active_chats() text = "" j = 0 From 022630c6740e51d93059aad6ef500d012e2d6d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:42:11 +0530 Subject: [PATCH 202/211] Update ping.py --- GJ516Music/Modules/ping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index fa35edf..46ffa36 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -35,7 +35,7 @@ @app.on_message(filters.command("ping")) async def ping_fallen(_, message: Message): hmm = await message.reply_photo( - photo=config.PING_IMG, caption=f"{BOT_NAME} 𝙄𝙨 𝙋𝙞𝙣𝙜𝙞𝙣𝙜...." + photo=random.choice(PING_IMG), caption=f"{BOT_NAME} 𝙄𝙨 𝙋𝙞𝙣𝙜𝙞𝙣𝙜...." ) upt = int(time.time() - StartTime) cpu = psutil.cpu_percent(interval=0.5) From 080d659635cfc32c5b16c597354ec80c3ad425b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:49:33 +0530 Subject: [PATCH 203/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index d9687e4..030bbf7 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From bfce73ecf3eeabe4e1dd95ffd185512c8317a5ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:50:07 +0530 Subject: [PATCH 204/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 030bbf7..ff5049d 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png, "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From 35cccc687f015731b226062fb0c3343cf60d057d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:50:50 +0530 Subject: [PATCH 205/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index ff5049d..9ff587c 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png, "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg",https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png, "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From ac9e3dd554325e17371ee1ff52aaf018da985a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:51:34 +0530 Subject: [PATCH 206/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 9ff587c..40ced10 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg",https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png, "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg",https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From f7fe6c594f27ced60e9371f05d256a6d974c54b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 16 Nov 2023 07:52:02 +0530 Subject: [PATCH 207/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 40ced10..5b592de 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg",https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") +PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg","https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From d8558170678231d71105fc32a9cac2997da3fbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:11:57 +0530 Subject: [PATCH 208/211] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index bf1e863..2812bb8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ asyncio==3.4.3 aiofiles==23.1.0 aiohttp==3.8.4 -numpy==1.24.3 -pillow==9.5.0 +numpy==1.26.3 +pillow==10.0.1 psutil pyrogram==2.0.104 py-tgcalls==0.9.7 From d36945a1edac8722b73071c3d8a78f4f478fe819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:17:44 +0530 Subject: [PATCH 209/211] Update ping.py --- GJ516Music/Modules/ping.py | 1 + 1 file changed, 1 insertion(+) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index 46ffa36..8bce399 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -22,6 +22,7 @@ import time from datetime import datetime +import random import psutil from pyrogram import filters From b6205cb1cfa80cff46c28db45b73bc2f5a27cda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:19:09 +0530 Subject: [PATCH 210/211] Update config.py --- config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.py b/config.py index 5b592de..8810da9 100644 --- a/config.py +++ b/config.py @@ -13,7 +13,7 @@ OWNER_ID = int(getenv("OWNER_ID")) -PING_IMG = getenv("PING_IMG", "https://telegra.ph/file/db62e20be4e685a5d0716.jpg","https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png", "https://te.legra.ph/file/7be8c2f9e093f695c4c6e.png", "https://te.legra.ph/file/ee10888e828bae3a6a0fc.png", "https://te.legra.ph/file/1b55fe681163188149fa4.png", "https://te.legra.ph/file/30ee4e96f64cd9abb69b6.png", "https://te.legra.ph/file/30b121ce5fa87360692ba.png", "https://te.legra.ph/file/f0617cc52008bd78f1a9d.png", "https://te.legra.ph/file/1cd1adc3eb9ac0a101610.png", "https://te.legra.ph/file/860c3dd149f91eb450d5a.png", "https://te.legra.ph/file/2e9df77f8100e0327ba52.png", "https://te.legra.ph/file/639efe98c133d71c418db.png", "https://te.legra.ph/file/8a834586b677739b86bff.png", "https://te.legra.ph/file/13f79674ce777f43871fb.png", "https://te.legra.ph/file/147157eca055a1e2c8756.png", "https://te.legra.ph/file/b774a8da74dc954afebc6.png", "https://te.legra.ph/file/7ae4a6a6a6c28f9f08ceb.png", "https://te.legra.ph/file/12d5ea64ed00416a38ec8.png" ,"https://te.legra.ph/file/7757731c3e8b784b6a550.png", "https://te.legra.ph/file/58c34981e21180989887c.png", "https://te.legra.ph/file/a3a874be5095d9af685ac.png", "https://te.legra.ph/file/ac461a1889255424420ff.png", "https://te.legra.ph/file/74a8ba5270d0e27ac045c.png", "https://te.legra.ph/file/c0d0ee1452cbbbce116f4.png", "https://te.legra.ph/file/d373ae93502a5ae7fd403.png", "https://te.legra.ph/file/ab243bcad20965f637b5c.png", "https://te.legra.ph/file/fd9cc86239dd76d564d01.png", "https://te.legra.ph/file/c12a0b77178e2d2e27a50.png", "https://te.legra.ph/file/35177bbb5d5f07ad8e394.png", "https://te.legra.ph/file/700af8c3ee786a20aff35.png", "https://te.legra.ph/file/cbecd8af0446a422a95ca.png", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") +PING_IMG = getenv("PING_IMG", "https://te.legra.ph/file/c3a0fde4abde25dd25e26.png") START_IMG = getenv("START_IMG", "https://telegra.ph/file/a749f8c1d606437a8b579.jpg") SESSION = getenv("SESSION", None) From bb242ca660eb8af58ae06ced03901115bec568b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=8D=CA=80=2E=E1=B4=98=CA=80=E1=B4=8F=C9=A2=E1=B4=80?= =?UTF-8?q?=E1=B4=8D=E1=B4=8D=E1=B4=87=CA=80?= <109902449+MrProgrammer72@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:23:25 +0530 Subject: [PATCH 211/211] Update ping.py --- GJ516Music/Modules/ping.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GJ516Music/Modules/ping.py b/GJ516Music/Modules/ping.py index 8bce399..fa35edf 100644 --- a/GJ516Music/Modules/ping.py +++ b/GJ516Music/Modules/ping.py @@ -22,7 +22,6 @@ import time from datetime import datetime -import random import psutil from pyrogram import filters @@ -36,7 +35,7 @@ @app.on_message(filters.command("ping")) async def ping_fallen(_, message: Message): hmm = await message.reply_photo( - photo=random.choice(PING_IMG), caption=f"{BOT_NAME} 𝙄𝙨 𝙋𝙞𝙣𝙜𝙞𝙣𝙜...." + photo=config.PING_IMG, caption=f"{BOT_NAME} 𝙄𝙨 𝙋𝙞𝙣𝙜𝙞𝙣𝙜...." ) upt = int(time.time() - StartTime) cpu = psutil.cpu_percent(interval=0.5)