From e960a69126cc53ab4bae7c86c2b6a5dd2ba1c1e1 Mon Sep 17 00:00:00 2001 From: yasir Date: Thu, 3 Aug 2023 11:01:15 +0700 Subject: [PATCH] Rest Commit AUgs 2023 --- .deepsource.toml | 13 + .github/FUNDING.yml | 4 + .github/workflows/h3r0ku.yml | 36 + .github/workflows/notify.yml | 26 + .gitignore | 2 + Dockerfile | 19 + LICENSE | 339 ++++ README.id.md | 194 +++ README.md | 194 +++ assets/Calistoga-Regular.ttf | Bin 0 -> 128660 bytes assets/DejaVuSans-Bold.ttf | Bin 0 -> 672300 bytes assets/DejaVuSans.ttf | Bin 0 -> 757076 bytes assets/IronFont.otf | Bin 0 -> 73768 bytes assets/MutantAcademyStyle.ttf | Bin 0 -> 56364 bytes assets/assfont.ttf | Bin 0 -> 55300 bytes assets/bg.png | Bin 0 -> 21728 bytes assets/kertas.jpg | Bin 0 -> 37920 bytes assets/profilepic.png | Bin 0 -> 10264 bytes assets/statsbg.jpg | Bin 0 -> 64502 bytes assets/thumb.jpg | Bin 0 -> 21288 bytes config.env.sample | 15 + database/__init__.py | 12 + database/afk_db.py | 63 + database/blacklist_db.py | 37 + database/filters_db.py | 45 + database/gban_db.py | 22 + database/imdb_db.py | 20 + database/karma_db.py | 67 + database/locale_db.py | 22 + database/notes_db.py | 44 + database/sangmata_db.py | 42 + database/users_chats_db.py | 112 ++ database/warn_db.py | 51 + docker-compose.yml | 9 + heroku.yml | 3 + locales/__init__.py | 0 locales/en-US/admin.json | 68 + locales/en-US/afk.json | 13 + locales/en-US/chatbot_ai.json | 6 + locales/en-US/dev.json | 11 + locales/en-US/fun.json | 3 + locales/en-US/general.json | 6 + locales/en-US/genss.json | 13 + locales/en-US/grup_tools.json | 13 + locales/en-US/help_menu.json | 1 + locales/en-US/lang_setting.json | 5 + locales/en-US/main.json | 4 + locales/en-US/media_extractor.json | 15 + locales/en-US/mediainfo.json | 11 + locales/en-US/nightmodev2.json | 17 + locales/en-US/ocr.json | 6 + locales/en-US/sangmata.json | 13 + locales/en-US/start_help.json | 11 + locales/en-US/stickers.json | 19 + locales/en-US/web_scraper.json | 20 + locales/en-US/webss.json | 6 + locales/en-US/ytdl_plugins.json | 14 + locales/id-ID/admin.json | 68 + locales/id-ID/afk.json | 13 + locales/id-ID/chatbot_ai.json | 6 + locales/id-ID/dev.json | 11 + locales/id-ID/fun.json | 3 + locales/id-ID/general.json | 6 + locales/id-ID/genss.json | 13 + locales/id-ID/grup_tools.json | 13 + locales/id-ID/help_menu.json | 1 + locales/id-ID/lang_setting.json | 5 + locales/id-ID/main.json | 4 + locales/id-ID/media_extractor.json | 15 + locales/id-ID/mediainfo.json | 11 + locales/id-ID/nightmodev2.json | 17 + locales/id-ID/ocr.json | 6 + locales/id-ID/sangmata.json | 13 + locales/id-ID/start_help.json | 11 + locales/id-ID/stickers.json | 19 + locales/id-ID/web_scraper.json | 20 + locales/id-ID/webss.json | 6 + locales/id-ID/ytdl_plugins.json | 14 + locales/id-JW/admin.json | 68 + locales/id-JW/afk.json | 13 + locales/id-JW/chatbot_ai.json | 6 + locales/id-JW/dev.json | 11 + locales/id-JW/fun.json | 3 + locales/id-JW/general.json | 6 + locales/id-JW/genss.json | 13 + locales/id-JW/grup_tools.json | 13 + locales/id-JW/help_menu.json | 1 + locales/id-JW/lang_setting.json | 5 + locales/id-JW/main.json | 4 + locales/id-JW/media_extractor.json | 15 + locales/id-JW/mediainfo.json | 11 + locales/id-JW/nightmodev2.json | 17 + locales/id-JW/ocr.json | 6 + locales/id-JW/sangmata.json | 13 + locales/id-JW/start_help.json | 11 + locales/id-JW/stickers.json | 19 + locales/id-JW/web_scraper.json | 20 + locales/id-JW/webss.json | 6 + locales/id-JW/ytdl_plugins.json | 14 + misskaty/__init__.py | 79 + misskaty/__main__.py | 97 ++ misskaty/core/decorator/__init__.py | 13 + misskaty/core/decorator/errors.py | 55 + misskaty/core/decorator/misc.py | 28 + misskaty/core/decorator/permissions.py | 221 +++ misskaty/core/decorator/ratelimiter.py | 48 + misskaty/core/keyboard.py | 31 + misskaty/core/misskaty_patch/__init__.py | 1 + .../core/misskaty_patch/bound/__init__.py | 2 + misskaty/core/misskaty_patch/bound/message.py | 324 ++++ .../misskaty_patch/decorators/__init__.py | 5 + .../misskaty_patch/decorators/adminsOnly.py | 199 +++ .../misskaty_patch/decorators/callback.py | 102 ++ .../core/misskaty_patch/decorators/command.py | 133 ++ .../core/misskaty_patch/listen/__init__.py | 2 + misskaty/core/misskaty_patch/listen/listen.py | 386 +++++ .../core/misskaty_patch/methods/__init__.py | 4 + .../methods/edit_message_text.py | 61 + .../misskaty_patch/methods/send_as_file.py | 48 + .../misskaty_patch/methods/send_message.py | 63 + .../core/misskaty_patch/utils/__init__.py | 5 + .../core/misskaty_patch/utils/admin_utils.py | 158 ++ .../core/misskaty_patch/utils/get_user.py | 122 ++ .../misskaty_patch/utils/handler_error.py | 93 ++ misskaty/core/misskaty_patch/utils/utils.py | 123 ++ misskaty/core/pyro_cooldown.py | 51 + misskaty/core/ratelimiter_func.py | 49 + misskaty/helper/__init__.py | 15 + misskaty/helper/eval_helper.py | 159 ++ misskaty/helper/ffmpeg_helper.py | 77 + misskaty/helper/files.py | 88 + misskaty/helper/functions.py | 135 ++ misskaty/helper/http.py | 61 + misskaty/helper/human_read.py | 62 + misskaty/helper/kuso_utils.py | 197 +++ misskaty/helper/localization.py | 106 ++ misskaty/helper/media_helper.py | 78 + misskaty/helper/mediainfo_paste.py | 226 +++ misskaty/helper/misc.py | 83 + misskaty/helper/pyro_progress.py | 78 + misskaty/helper/sqlite_helper.py | 565 +++++++ misskaty/helper/ssgen_template.html | 6 + misskaty/helper/stickerset.py | 79 + misskaty/helper/subscene_helper.py | 63 + misskaty/helper/time_gap.py | 18 + misskaty/helper/tools.py | 153 ++ misskaty/helper/ytdl_helper.py | 44 + misskaty/plugins/__init__.py | 55 + misskaty/plugins/__main__.py | 0 misskaty/plugins/admin.py | 834 ++++++++++ misskaty/plugins/afk.py | 533 ++++++ misskaty/plugins/anime.py | 242 +++ misskaty/plugins/auto_approve.py | 74 + misskaty/plugins/auto_forwarder.py | 97 ++ misskaty/plugins/ban_user_or_chat.py | 184 +++ misskaty/plugins/blacklist_chat.py | 119 ++ misskaty/plugins/broadcast.py | 47 + misskaty/plugins/bypass.py | 127 ++ misskaty/plugins/chatbot_ai.py | 91 ++ misskaty/plugins/code_tester.py | 747 +++++++++ misskaty/plugins/copy_forward.py | 112 ++ misskaty/plugins/currency.py | 65 + misskaty/plugins/dev.py | 543 +++++++ misskaty/plugins/download_upload.py | 227 +++ misskaty/plugins/filter_request.py | 444 +++++ misskaty/plugins/filters.py | 154 ++ misskaty/plugins/fun.py | 186 +++ misskaty/plugins/genss.py | 206 +++ misskaty/plugins/grup_tools.py | 340 ++++ misskaty/plugins/imdb_search.py | 723 +++++++++ misskaty/plugins/inkick_user.py | 265 +++ misskaty/plugins/inline_search.py | 760 +++++++++ misskaty/plugins/json.py | 48 + misskaty/plugins/karma.py | 216 +++ misskaty/plugins/lang_setting.py | 120 ++ misskaty/plugins/locks.py | 190 +++ misskaty/plugins/media_extractor.py | 221 +++ misskaty/plugins/mediainfo.py | 136 ++ misskaty/plugins/misc_tools.py | 574 +++++++ misskaty/plugins/nightmodev2.py | 261 +++ misskaty/plugins/notes.py | 132 ++ misskaty/plugins/nulis.py | 65 + misskaty/plugins/ocr.py | 62 + misskaty/plugins/paste.py | 522 ++++++ misskaty/plugins/ping.py | 66 + misskaty/plugins/pypi_search.py | 157 ++ misskaty/plugins/quotly.py | 299 ++++ misskaty/plugins/sangmata.py | 122 ++ misskaty/plugins/sed.py | 58 + misskaty/plugins/session_generator.py | 278 ++++ misskaty/plugins/start_help.py | 259 +++ misskaty/plugins/stickers.py | 412 +++++ misskaty/plugins/subscene_dl.py | 252 +++ misskaty/plugins/tes_session.py | 15 + misskaty/plugins/ubot_plugin.py | 189 +++ misskaty/plugins/urban_dict.py | 78 + misskaty/plugins/web_scraper.py | 1429 +++++++++++++++++ misskaty/plugins/webss.py | 50 + misskaty/plugins/ytdl_plugins.py | 323 ++++ misskaty/vars.py | 75 + requirements.txt | 31 + start.sh | 1 + update.py | 68 + utils.py | 146 ++ 204 files changed, 21042 insertions(+) create mode 100644 .deepsource.toml create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/h3r0ku.yml create mode 100644 .github/workflows/notify.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.id.md create mode 100644 README.md create mode 100644 assets/Calistoga-Regular.ttf create mode 100644 assets/DejaVuSans-Bold.ttf create mode 100644 assets/DejaVuSans.ttf create mode 100644 assets/IronFont.otf create mode 100644 assets/MutantAcademyStyle.ttf create mode 100644 assets/assfont.ttf create mode 100644 assets/bg.png create mode 100644 assets/kertas.jpg create mode 100644 assets/profilepic.png create mode 100644 assets/statsbg.jpg create mode 100644 assets/thumb.jpg create mode 100644 config.env.sample create mode 100644 database/__init__.py create mode 100644 database/afk_db.py create mode 100644 database/blacklist_db.py create mode 100644 database/filters_db.py create mode 100644 database/gban_db.py create mode 100644 database/imdb_db.py create mode 100644 database/karma_db.py create mode 100644 database/locale_db.py create mode 100644 database/notes_db.py create mode 100644 database/sangmata_db.py create mode 100644 database/users_chats_db.py create mode 100644 database/warn_db.py create mode 100644 docker-compose.yml create mode 100644 heroku.yml create mode 100644 locales/__init__.py create mode 100644 locales/en-US/admin.json create mode 100644 locales/en-US/afk.json create mode 100644 locales/en-US/chatbot_ai.json create mode 100644 locales/en-US/dev.json create mode 100644 locales/en-US/fun.json create mode 100644 locales/en-US/general.json create mode 100644 locales/en-US/genss.json create mode 100644 locales/en-US/grup_tools.json create mode 100644 locales/en-US/help_menu.json create mode 100644 locales/en-US/lang_setting.json create mode 100644 locales/en-US/main.json create mode 100644 locales/en-US/media_extractor.json create mode 100644 locales/en-US/mediainfo.json create mode 100644 locales/en-US/nightmodev2.json create mode 100644 locales/en-US/ocr.json create mode 100644 locales/en-US/sangmata.json create mode 100644 locales/en-US/start_help.json create mode 100644 locales/en-US/stickers.json create mode 100644 locales/en-US/web_scraper.json create mode 100644 locales/en-US/webss.json create mode 100644 locales/en-US/ytdl_plugins.json create mode 100644 locales/id-ID/admin.json create mode 100644 locales/id-ID/afk.json create mode 100644 locales/id-ID/chatbot_ai.json create mode 100644 locales/id-ID/dev.json create mode 100644 locales/id-ID/fun.json create mode 100644 locales/id-ID/general.json create mode 100644 locales/id-ID/genss.json create mode 100644 locales/id-ID/grup_tools.json create mode 100644 locales/id-ID/help_menu.json create mode 100644 locales/id-ID/lang_setting.json create mode 100644 locales/id-ID/main.json create mode 100644 locales/id-ID/media_extractor.json create mode 100644 locales/id-ID/mediainfo.json create mode 100644 locales/id-ID/nightmodev2.json create mode 100644 locales/id-ID/ocr.json create mode 100644 locales/id-ID/sangmata.json create mode 100644 locales/id-ID/start_help.json create mode 100644 locales/id-ID/stickers.json create mode 100644 locales/id-ID/web_scraper.json create mode 100644 locales/id-ID/webss.json create mode 100644 locales/id-ID/ytdl_plugins.json create mode 100644 locales/id-JW/admin.json create mode 100644 locales/id-JW/afk.json create mode 100644 locales/id-JW/chatbot_ai.json create mode 100644 locales/id-JW/dev.json create mode 100644 locales/id-JW/fun.json create mode 100644 locales/id-JW/general.json create mode 100644 locales/id-JW/genss.json create mode 100644 locales/id-JW/grup_tools.json create mode 100644 locales/id-JW/help_menu.json create mode 100644 locales/id-JW/lang_setting.json create mode 100644 locales/id-JW/main.json create mode 100644 locales/id-JW/media_extractor.json create mode 100644 locales/id-JW/mediainfo.json create mode 100644 locales/id-JW/nightmodev2.json create mode 100644 locales/id-JW/ocr.json create mode 100644 locales/id-JW/sangmata.json create mode 100644 locales/id-JW/start_help.json create mode 100644 locales/id-JW/stickers.json create mode 100644 locales/id-JW/web_scraper.json create mode 100644 locales/id-JW/webss.json create mode 100644 locales/id-JW/ytdl_plugins.json create mode 100644 misskaty/__init__.py create mode 100644 misskaty/__main__.py create mode 100644 misskaty/core/decorator/__init__.py create mode 100644 misskaty/core/decorator/errors.py create mode 100644 misskaty/core/decorator/misc.py create mode 100644 misskaty/core/decorator/permissions.py create mode 100644 misskaty/core/decorator/ratelimiter.py create mode 100644 misskaty/core/keyboard.py create mode 100644 misskaty/core/misskaty_patch/__init__.py create mode 100644 misskaty/core/misskaty_patch/bound/__init__.py create mode 100644 misskaty/core/misskaty_patch/bound/message.py create mode 100644 misskaty/core/misskaty_patch/decorators/__init__.py create mode 100644 misskaty/core/misskaty_patch/decorators/adminsOnly.py create mode 100644 misskaty/core/misskaty_patch/decorators/callback.py create mode 100644 misskaty/core/misskaty_patch/decorators/command.py create mode 100644 misskaty/core/misskaty_patch/listen/__init__.py create mode 100644 misskaty/core/misskaty_patch/listen/listen.py create mode 100644 misskaty/core/misskaty_patch/methods/__init__.py create mode 100644 misskaty/core/misskaty_patch/methods/edit_message_text.py create mode 100644 misskaty/core/misskaty_patch/methods/send_as_file.py create mode 100644 misskaty/core/misskaty_patch/methods/send_message.py create mode 100644 misskaty/core/misskaty_patch/utils/__init__.py create mode 100644 misskaty/core/misskaty_patch/utils/admin_utils.py create mode 100644 misskaty/core/misskaty_patch/utils/get_user.py create mode 100644 misskaty/core/misskaty_patch/utils/handler_error.py create mode 100644 misskaty/core/misskaty_patch/utils/utils.py create mode 100644 misskaty/core/pyro_cooldown.py create mode 100644 misskaty/core/ratelimiter_func.py create mode 100644 misskaty/helper/__init__.py create mode 100644 misskaty/helper/eval_helper.py create mode 100644 misskaty/helper/ffmpeg_helper.py create mode 100644 misskaty/helper/files.py create mode 100644 misskaty/helper/functions.py create mode 100644 misskaty/helper/http.py create mode 100644 misskaty/helper/human_read.py create mode 100644 misskaty/helper/kuso_utils.py create mode 100644 misskaty/helper/localization.py create mode 100644 misskaty/helper/media_helper.py create mode 100644 misskaty/helper/mediainfo_paste.py create mode 100644 misskaty/helper/misc.py create mode 100644 misskaty/helper/pyro_progress.py create mode 100644 misskaty/helper/sqlite_helper.py create mode 100644 misskaty/helper/ssgen_template.html create mode 100644 misskaty/helper/stickerset.py create mode 100644 misskaty/helper/subscene_helper.py create mode 100644 misskaty/helper/time_gap.py create mode 100644 misskaty/helper/tools.py create mode 100644 misskaty/helper/ytdl_helper.py create mode 100644 misskaty/plugins/__init__.py create mode 100644 misskaty/plugins/__main__.py create mode 100644 misskaty/plugins/admin.py create mode 100644 misskaty/plugins/afk.py create mode 100644 misskaty/plugins/anime.py create mode 100644 misskaty/plugins/auto_approve.py create mode 100644 misskaty/plugins/auto_forwarder.py create mode 100644 misskaty/plugins/ban_user_or_chat.py create mode 100644 misskaty/plugins/blacklist_chat.py create mode 100644 misskaty/plugins/broadcast.py create mode 100644 misskaty/plugins/bypass.py create mode 100644 misskaty/plugins/chatbot_ai.py create mode 100644 misskaty/plugins/code_tester.py create mode 100644 misskaty/plugins/copy_forward.py create mode 100644 misskaty/plugins/currency.py create mode 100644 misskaty/plugins/dev.py create mode 100644 misskaty/plugins/download_upload.py create mode 100644 misskaty/plugins/filter_request.py create mode 100644 misskaty/plugins/filters.py create mode 100644 misskaty/plugins/fun.py create mode 100644 misskaty/plugins/genss.py create mode 100644 misskaty/plugins/grup_tools.py create mode 100644 misskaty/plugins/imdb_search.py create mode 100644 misskaty/plugins/inkick_user.py create mode 100644 misskaty/plugins/inline_search.py create mode 100644 misskaty/plugins/json.py create mode 100644 misskaty/plugins/karma.py create mode 100644 misskaty/plugins/lang_setting.py create mode 100644 misskaty/plugins/locks.py create mode 100644 misskaty/plugins/media_extractor.py create mode 100644 misskaty/plugins/mediainfo.py create mode 100644 misskaty/plugins/misc_tools.py create mode 100644 misskaty/plugins/nightmodev2.py create mode 100644 misskaty/plugins/notes.py create mode 100644 misskaty/plugins/nulis.py create mode 100644 misskaty/plugins/ocr.py create mode 100644 misskaty/plugins/paste.py create mode 100644 misskaty/plugins/ping.py create mode 100644 misskaty/plugins/pypi_search.py create mode 100644 misskaty/plugins/quotly.py create mode 100644 misskaty/plugins/sangmata.py create mode 100644 misskaty/plugins/sed.py create mode 100644 misskaty/plugins/session_generator.py create mode 100644 misskaty/plugins/start_help.py create mode 100644 misskaty/plugins/stickers.py create mode 100644 misskaty/plugins/subscene_dl.py create mode 100644 misskaty/plugins/tes_session.py create mode 100644 misskaty/plugins/ubot_plugin.py create mode 100644 misskaty/plugins/urban_dict.py create mode 100644 misskaty/plugins/web_scraper.py create mode 100644 misskaty/plugins/webss.py create mode 100644 misskaty/plugins/ytdl_plugins.py create mode 100644 misskaty/vars.py create mode 100644 requirements.txt create mode 100644 start.sh create mode 100644 update.py create mode 100644 utils.py diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 00000000..75b76df3 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,13 @@ +version = 1 + +[[analyzers]] +name = "python" + + [analyzers.meta] + runtime_version = "3.x.x" + +[[transformers]] +name = "isort" + +[[transformers]] +name = "black" \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..b50a6b2d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: [yasirarism] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +other: ['https://yasirpedia.eu.org/images/my-qris.jpg', 'https://paypal.me/yasirarism'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] \ No newline at end of file diff --git a/.github/workflows/h3r0ku.yml b/.github/workflows/h3r0ku.yml new file mode 100644 index 00000000..b931ecd5 --- /dev/null +++ b/.github/workflows/h3r0ku.yml @@ -0,0 +1,36 @@ +name: H3r0ku Deployer + +on: workflow_dispatch + +env: + IMAGE_NAME: h3r0ku + HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} + HEROKU_APP: ${{ secrets.HEROKU_APP }} + +jobs: + build_and_push: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Build the image + run: docker build . --file Dockerfile --tag "${IMAGE_NAME}" + + - name: Login into Heroku Container registry + run: heroku container:login + + - name: Push the image to Heroku + run: heroku container:push "${IMAGE_NAME}" -a "${HEROKU_APP}" + + - name: Release image to Heroku + run: heroku container:release "${IMAGE_NAME}" -a "${HEROKU_APP}" + + - name: Check ENV + run: | + API_KEY="$(heroku config:get HEROKU_API_KEY -a ${HEROKU_APP})" + APP_NAME="$(heroku config:get HEROKU_APP -a ${HEROKU_APP})" + if [[ -z "${API_KEY}" && -z "${APP_NAME}" ]]; then + heroku config:set HEROKU_API_KEY="${HEROKU_API_KEY}" \ + HEROKU_APP="${HEROKU_APP}" + fi \ No newline at end of file diff --git a/.github/workflows/notify.yml b/.github/workflows/notify.yml new file mode 100644 index 00000000..cea9f59a --- /dev/null +++ b/.github/workflows/notify.yml @@ -0,0 +1,26 @@ +name: Notify on Telegram + +on: + fork: + push: + release: + issue_comment: + types: created + watch: + types: started + pull_request_review_comment: + types: created + pull_request: + types: [opened, closed, reopened] + issues: + types: [opened, pinned, closed, reopened] +jobs: + notify: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Notify the commit on Telegram. + uses: EverythingSuckz/github-telegram-notify@main + with: + bot_token: '${{ secrets.BOT_TOKEN }}' + chat_id: '${{ secrets.CHAT_ID }}' diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..4edd7505 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +__pycache__ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..1d82e93d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +# * @author Yasir Aris M +# * @date 2022-12-01 09:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved + +# Base Docker Using Debian 12 (Bookworm), Python 3.11.4 and Built In Pip +## With Built in Pip Package +FROM yasirarism/misskaty-docker:latest +## Without Built in Pip Package +# FROM yasirarism/misskaty-docker:free + +# Set Hostname +ENV HOSTNAME yasir-server +# Copy Files +COPY . . +# Instal pip package +# RUN pip3 install --no-cache-dir -r requirements.txt +# Set CMD Bot +CMD ["bash", "start.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.id.md b/README.id.md new file mode 100644 index 00000000..b83897df --- /dev/null +++ b/README.id.md @@ -0,0 +1,194 @@ +# MissKatyPyro + + +![MIT License][license-shield] ![Repository Size][repository-size-shield] ![Issue Closed][issue-closed-shield] + + +

+ +

+ + + [![Readme in Indonesian][readme-ko-shield]][readme-ko-url] [![View Demo][view-demo-shield]][view-demo-url] [![Report bug][report-bug-shield]][report-bug-url] [![Request feature][request-feature-shield]][request-feature-url] + + +# Table of Contents +- [[1] About MissKaty](#1-about-misskaty) +- [[2] Framework Tools And Server That Used To Build This Bot](#2-framework-tools-and-server-that-used-to-build-this-bot) +- [[3] Donation](#3-donation) +- [[4] Notes](#4-notes) +- [[5] Features](#5-features) +- [[6] Variables](#6-variables) +- [[7] Deploying Tutorial](#7-deploy-recommended-using-dockerdocker-compose) + - [Build And Run Using Legacy Method](#build-and-run-using-legacy-method) + - [Build And Run Using Docker](#build-and-run-using-docker) + - [Build And Run The Docker Image Using docker-compose](#build-and-run-the-docker-image-using-docker-compose) +- [[8] Credits](#8-thanks-to) +- [[9] Disclaimer](#8-disclaimer) + +# [1] About MissKaty +*MissKaty* adalah Bot Telegram yang dibuat menggunakan Python dan library Pyrogram. Banyak fitur yang berguna untuk kita gunakan. Saya berharap suatu saat jika project ini dihentikan, ada yang melanjutkan atau mengembangkannya lagi. Saya memberi nama MissKaty karena saya suka kucing, hewan lucu yang suka bermain dan bersahabat dengan manusia. + +## [2] Framework Tools And Server That Used To Build This Bot + 🌱 PyroFork v2.x.x (Fork Pyrogram dengan Dukungan Topik dan Beberapa Patch)
+ 🌱 Dukungan Python 3.11
+ 🌱 MongoDB sebagai Database
+ 🌱 PyKeyboard for Building Pagination
+ 🌱 VS Code
+ 🌱 VPS/Server With Docker Support (Recommended)
+ +## [3] Donation +*Khusus Indonesia Saja:*
+ 🌱 [QRIS][qris-url]
+ +*Untuk Semua Negara:*
+ 🌱 [Paypal][paypal-url]
+ +## [4] Notes +Jika Anda ingin membantu saya memperbaiki beberapa kesalahan di bot saya, Anda dapat membuat PR ke repo ini. Saya sangat senang jika Anda dapat membantu saya. Anda juga dapat memberikan dukungan kepada saya untuk membeli server. + +## [5] Features + +| FEATURE MY BOT |🌱| +| ------------- | ------------- | +| Basic Admin Feature |✔️| +| AFK Feature |✔️| +| Downloader FB, TikTok and YT-DLP Support |✔️| +| MultiLanguage Support (Still Beta) |⚠️| +| NightMode |✔️| +| ChatBot based on OpenAI |✔️| +| MissKaty Mata |✔️| +| Inline Search |✔️| +| Sticker Tools |✔️| +| PasteBin Tools |✔️| +| WebScraper (Pahe, MelongMovie, LK21, Terbit21, Kusonime, etc) |✔️| +| IMDB Search With Multi Language Per User |✔️| +| GenSS From Media and MediaInfo Generator |✔️| +| And Many More.. |✔️| + +## [6] Variables + +### Variabel yang Diperlukan +* `BOT_TOKEN`: Buat bot menggunakan [@BotFather](https://t.me/BotFather), dan dapatkan token Telegram API. +* `API_ID`: Dapatkan value ini dari [telegram.org](https://my.telegram.org/apps) +* `API_HASH`: Dapatkan value ini dari [telegram.org](https://my.telegram.org/apps) +* `DATABASE_URI`: [mongoDB](https://www.mongodb.com) URI. Dapatkan value ini dari [mongoDB](https://www.mongodb.com). Untuk bantuan lebih lanjut, tonton [video] ini(https://youtu.be/1G1XwEOnxxo) +* `LOG_CHANNEL` : Channel untuk mencatat aktivitas bot. Pastikan bot adalah admin di channel. + +### Variabel Opsional +* `USER_SESSION` : String session untuk Userbot. +* `DATABASE_NAME`: Nama database di MongoDB +* `COMMAND_HANDLER`: Daftar perintah handler bot dipisahkan dengan spasi. Contoh: `. !` > jadi bot akan merespon dengan `.cmd` atau `!cmd` +* `SUDO`: User ID yang memiliki akses ke bot, dipisahkan dengan spasi +* `OPENAI_API`: Dapatkan dari Web OpenAI +* `CURRENCY_API`: Dapatkan API Key di https://app.exchangerate-api.com/sign-up + +## [7] Tutorial Deploy (Recommended using Docker/Docker Compose) + +#### Bangun Dan Jalankan Menggunakan Metode Lama +- Pastikan versi python minimum adalah 3.8 untuk mencegah beberapa error. Periksa dengan perintah ini: +``` +python3 --version +``` +- Instal semua dependensi yang membutuhkan bot untuk dijalankan. *(memerlukan akses root, Anda dapat melewati ini jika server Anda tidak memiliki akses root tetapi beberapa plugin tidak berfungsi)* +``` +apt update -y & apt install libjpeg-dev zlib1g-dev libwebp-dev python3-pip python3-lxml git wget curl lokal ffmpeg tzdata neofetch mediainfo speedtest-cli -y +``` +- Instal requirements.txt, jika menggunakan python 3.11, Anda harus menggunakan opsi venv saat menginstal.
+*Python < 3.10* +``` +pip3 install -r requirements.txt +``` +*Python 3.11* +``` +Install venv dari terminal server kamu +pip3 install -r requirements.txt +``` +- Atur config environment saat menjalankan bot dan jangan lupa isi semua value yang wajib di isi. +- Jalankan Bot +``` +bash start.sh +``` + +#### Build And Run Using Docker + +- Mulai daemon Docker (Lewati jika sudah berjalan): +``` +sudo dockerd +``` +- Build Docker image: +``` +sudo docker build . -t misskaty +``` +- Jalankan Docker image: +``` +sudo docker run misskaty +``` +- Untuk Menghentikan image: +``` +sudo docker ps +sudo docker stop +``` + +#### Build And Run The Docker Image Using docker-compose + +- Install docker-compose +``` +sudo apt install docker-compose +``` +- Build and run Docker image or to view current running image: +``` +sudo docker-compose up +``` +- After editing files with nano for example (nano start.sh): +``` +sudo docker-compose up --build +``` +- To stop the running image: +``` +sudo docker ps +``` +``` +sudo docker-compose stop +``` + +---- + + +## [8] Thanks to + - Terima kasih Kepada Allah Swt. + - Terima kasih Kepada Dan [Pyrogram Library](https://github.com/pyrogram/pyrogram). + - Terima kasih Kepada [The Hamker Cat](https://github.com/TheHamkerCat) Untuk Kode WilliamButcher. + - Terima kasih Kepada [Team Yukki](https://github.com/TeamYukki) Untuk Kode AFK Bot. + - Terima kasih Kepada [Wrench](https://github.com/EverythingSuckz) Untuk Beberapa Kode. + - Terima kasih Kepada [AmanoTeam](https://github.com/AmanoTeam) Untuk Template MultiBahasa. + - Dan Semua Orang Yang Membantuku Dalam Hidupku... +Jika kode Anda digunakan dalam repo ini dan ingin memberikan kredit, silakan buka masalah.. + +## [9] Disclaimer +[![GNU Affero General Public License 2.0](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.en.html#header) +Dilisensikan di bawah [GNU AGPL 2.0.](https://github.com/yasirarism/MissKatyPyro/blob/master/LICENSE) +PERINGATAN: Menjual Kode Kepada Orang Lain Demi Uang *Dilarang Keras*. Tuhan selalu melihatmu dimanapun kamu berada. + + +[license-shield]: https://img.shields.io/github/license/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=04B4AE +[repository-size-shield]: https://img.shields.io/github/repo-size/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=BE81F7 +[issue-closed-shield]: https://img.shields.io/github/issues-closed/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=FE9A2E + + +[readme-ko-shield]: https://img.shields.io/badge/-readme%20in%20Indonesian-2E2E2E?style=for-the-badge +[view-demo-shield]: https://img.shields.io/badge/-%F0%9F%98%8E%20view%20demo-F3F781?style=for-the-badge +[view-demo-url]: https://t.me/MissKatyPyro +[report-bug-shield]: https://img.shields.io/badge/-%F0%9F%90%9E%20report%20bug-F5A9A9?style=for-the-badge +[report-bug-url]: https://github.com/yasirarism/MissKatyPyro/issues +[request-feature-shield]: https://img.shields.io/badge/-%E2%9C%A8%20request%20feature-A9D0F5?style=for-the-badge +[request-feature-url]: https://github.com/yasirarism/MissKatyPyro/issues + + +[readme-ko-url]: README.md +[kofi-url]: https://ko-fi.com/yasirarism +[paypal-url]: https://paypal.me/yasirarism +[qris-url]: https://telegra.ph/file/2acf7698f300ef3d9138f.jpg +[sociabuzz-url]: https://sociabuzz.com/yasirarism/tribe +[saweria-url]: https://saweria.co/yasirarism +[trakteer-url]: https://trakteer.id/yasir-aris-sp7cn \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..f0b670ff --- /dev/null +++ b/README.md @@ -0,0 +1,194 @@ +# MissKatyPyro + + +![MIT License][license-shield] ![Repository Size][repository-size-shield] ![Issue Closed][issue-closed-shield] + + +

+ +

+ + + [![Readme in Indonesian][readme-ko-shield]][readme-ko-url] [![View Demo][view-demo-shield]][view-demo-url] [![Report bug][report-bug-shield]][report-bug-url] [![Request feature][request-feature-shield]][request-feature-url] + + +# Table of Contents +- [[1] About MissKaty](#1-about-misskaty) +- [[2] Framework Tools And Server That Used To Build This Bot](#2-framework-tools-and-server-that-used-to-build-this-bot) +- [[3] Donation](#3-donation) +- [[4] Notes](#4-notes) +- [[5] Features](#5-features) +- [[6] Variables](#6-variables) +- [[7] Deploying Tutorial](#7-deploy-recommended-using-dockerdocker-compose) + - [Build And Run Using Legacy Method](#build-and-run-using-legacy-method) + - [Build And Run Using Docker](#build-and-run-using-docker) + - [Build And Run The Docker Image Using docker-compose](#build-and-run-the-docker-image-using-docker-compose) +- [[8] Credits](#8-thanks-to) +- [[9] Disclaimer](#8-disclaimer) + +# [1] About MissKaty +*MissKaty* is a Telegram Bot built using Python and the Pyrogram library. Many useful features for us to use. I hope that one day this project will be discontinued, someone will continue or develop it again. I gave the name MissKaty because I like cats, a cute animal that likes to be played with and friendly with humans. + +## [2] Framework Tools And Server That Used To Build This Bot + 🌱 PyroFork v2.x.x (Fork of Pyrogram with Topics Support and Some Patch)
+ 🌱 Python 3.11 Support
+ 🌱 MongoDB as Database
+ 🌱 PyKeyboard for Building Pagination
+ 🌱 VS Code
+ 🌱 VPS/Server With Docker Support (Recommended)
+ +## [3] Donation and Support +*For Indonesian Only and some supported country:*
+ 🌱 [QRIS][qris-url]
+ +*For International Payment:*
+ 🌱 [Paypal][paypal-url]
+ +## [4] Notes +If you want help me fixing some error in my bot, you can make pull request to this repo. I'm very glad if you can help me. You can also give support to me for buying server. + +## [5] Features + +| FEATURE MY BOT |🌱| +| ------------- | ------------- | +| Basic Admin Feature |✔️| +| AFK Feature |✔️| +| Downloader FB, TikTok and YT-DLP Support |✔️| +| MultiLanguage Support (Unfinished) |⚠️| +| NightMode |✔️| +| ChatBot based on OpenAI |✔️| +| MissKaty Mata |✔️| +| Inline Search |✔️| +| Sticker Tools |✔️| +| PasteBin Tools |✔️| +| WebScraper (Pahe, MelongMovie, LK21, Terbit21, Kusonime, etc) |✔️| +| IMDB Search With Multi Language Per User |✔️| +| GenSS From Media and MediaInfo Generator |✔️| +| And Many More.. |✔️| + +## [6] Variables + +### Required Variables +* `BOT_TOKEN`: Create a bot using [@BotFather](https://t.me/BotFather), and get the Telegram API token. +* `API_ID`: Get this value from [telegram.org](https://my.telegram.org/apps) +* `API_HASH`: Get this value from [telegram.org](https://my.telegram.org/apps) +* `DATABASE_URI`: [mongoDB](https://www.mongodb.com) URI. Get this value from [mongoDB](https://www.mongodb.com). For more help watch this [video](https://youtu.be/1G1XwEOnxxo) +* `LOG_CHANNEL` : A channel to log the activities of bot. Make sure bot is an admin in the channel. + +### Optional Variables +* `USER_SESSION` : Session string for Userbot. +* `DATABASE_NAME`: Name of the database in MongoDB +* `COMMAND_HANDLER`: List of handler bot command splitted by space. Ex: `. !` > so bot will respond with `.cmd` or `!cmd` +* `SUDO`: User ID that have access to bot, split by space +* `OPENAI_API`: Get it from OpenAI Web +* `CURRENCY_API`: Get API Key from https://app.exchangerate-api.com/sign-up + +## [7] Tutorial Deploy (Recommended using Docker/Docker Compose) + +#### Build And Run Using Legacy Method +- Make sure minimum python version is 3.8 to prevent some errors. Check it with this command: +``` +python3 --version +``` +- Install all dependency that needed bot to run. *(need root access, you can skip this if your server didn't have root access but some plugins will not work)* +``` +apt update -y & apt install libjpeg-dev zlib1g-dev libwebp-dev python3-pip python3-lxml git wget curl ffmpeg locales tzdata neofetch mediainfo speedtest-cli -y +``` +- Install requirements.txt, if using python 3.11, you need use venv when install pip package.
+*Python < 3.10* +``` +pip3 install -r requirements.txt +``` +*Python 3.11* +``` +Install venv from your terminal and activate it +pip3 install -r requirements.txt +``` +- Setting your config.env or via environment and dont forget fill all required value. +- Run Bot +``` +bash start.sh +``` + +#### Build And Run Using Docker + +- Start Docker daemon (Skip if already running): +``` +sudo dockerd +``` +- Build Docker image: +``` +sudo docker build . -t misskaty +``` +- Run the image: +``` +sudo docker run misskaty +``` +- To stop the image: +``` +sudo docker ps +sudo docker stop +``` + +#### Build And Run The Docker Image Using docker-compose + +- Install docker-compose +``` +sudo apt install docker-compose +``` +- Build and run Docker image or to view current running image: +``` +sudo docker-compose up +``` +- After editing files with nano for example (nano start.sh): +``` +sudo docker-compose up --build +``` +- To stop the running image: +``` +sudo docker ps +``` +``` +sudo docker-compose stop +``` + +---- + + +## [8] Thanks to + - Thanks To Allah Swt. + - Thanks To Dan For His Awesome [Library](https://github.com/pyrogram/pyrogram). + - Thanks To [The Hamker Cat](https://github.com/TheHamkerCat) For WilliamButcher Code. + - Thanks To [Team Yukki](https://github.com/TeamYukki) For AFK Bot Code. + - Thanks To [Wrench](https://github.com/EverythingSuckz) For Some Code. + - Thanks To [AmanoTeam](https://github.com/AmanoTeam) For MultiLanguage Template. + - And All People Who Help Me In My Life... + If your code used in this repo and want to give credit please open issue.. + +## [9] Disclaimer +[![GNU Affero General Public License 2.0](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.en.html#header) +Licensed under [GNU AGPL 2.0.](https://github.com/yasirarism/MissKatyPyro/blob/master/LICENSE) +WARNING: Selling The Codes To Other People For Money Is *Strictly Prohibited*. God always sees you. + + +[license-shield]: https://img.shields.io/github/license/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=04B4AE +[repository-size-shield]: https://img.shields.io/github/repo-size/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=BE81F7 +[issue-closed-shield]: https://img.shields.io/github/issues-closed/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=FE9A2E + + +[readme-ko-shield]: https://img.shields.io/badge/-readme%20in%20Indonesian-2E2E2E?style=for-the-badge +[view-demo-shield]: https://img.shields.io/badge/-%F0%9F%98%8E%20view%20demo-F3F781?style=for-the-badge +[view-demo-url]: https://t.me/MissKatyPyro +[report-bug-shield]: https://img.shields.io/badge/-%F0%9F%90%9E%20report%20bug-F5A9A9?style=for-the-badge +[report-bug-url]: https://github.com/yasirarism/MissKatyPyro/issues +[request-feature-shield]: https://img.shields.io/badge/-%E2%9C%A8%20request%20feature-A9D0F5?style=for-the-badge +[request-feature-url]: https://github.com/yasirarism/MissKatyPyro/issues + + +[readme-ko-url]: README.id.md +[kofi-url]: https://ko-fi.com/yasirarism +[paypal-url]: https://paypal.me/yasirarism +[qris-url]: https://telegra.ph/file/9427d61d6968b8ee4fb2f.jpg +[sociabuzz-url]: https://sociabuzz.com/yasirarism/tribe +[saweria-url]: https://saweria.co/yasirarism +[trakteer-url]: https://trakteer.id/yasir-aris-sp7cn \ No newline at end of file diff --git a/assets/Calistoga-Regular.ttf b/assets/Calistoga-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6ba77fb3765a5dc7513f9b84c6f295eda9900510 GIT binary patch literal 128660 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 L{>XKbtIXdYPLkR9 literal 0 HcmV?d00001 diff --git a/assets/DejaVuSans-Bold.ttf b/assets/DejaVuSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0f4d5e9d484c3b42f473956a1d5726c96357fc9a GIT binary patch literal 672300 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
)#Ij%ExDQewJnTA7KMb;5Dy_dj6Y!emM!0h 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
  • gYTwx*&M%nPFB0OkdQk$}f64YQqnHurSGi!E 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 literal 0 HcmV?d00001 diff --git a/assets/DejaVuSans.ttf b/assets/DejaVuSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e5f7eecce43be41ff0703ed99e1553029b849f14 GIT binary patch literal 757076 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

    fI);V1&`p^P@z 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


    *Toc{%?n7Na{@W#kyM+}-t@ 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�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 GqyO3E40g5v literal 0 HcmV?d00001 diff --git a/config.env.sample b/config.env.sample new file mode 100644 index 00000000..3f1ed593 --- /dev/null +++ b/config.env.sample @@ -0,0 +1,15 @@ +# Required Vars +API_HASH= +API_ID= +BOT_TOKEN= +DATABASE_URI=mongodb+srv:// +LOG_CHANNEL= + +# Optional Vars +SUDO=617426792 +DATABASE_NAME=MissKatyDB +SUPPORT_CHAT=YasirPediaChannel +COMMAND_HANDLER= +USER_SESSION= +OPENAI_API= +CURRENCY_API= \ No newline at end of file diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 00000000..0da3654d --- /dev/null +++ b/database/__init__.py @@ -0,0 +1,12 @@ +""" + * @author yasir + * @date 2022-09-06 10:12:09 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +from async_pymongo import AsyncClient + +from misskaty.vars import DATABASE_NAME, DATABASE_URI + +mongo = AsyncClient(DATABASE_URI) +dbname = mongo[DATABASE_NAME] diff --git a/database/afk_db.py b/database/afk_db.py new file mode 100644 index 00000000..a60217cd --- /dev/null +++ b/database/afk_db.py @@ -0,0 +1,63 @@ +# +# Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >. +# +# This file is part of < https://github.com/TeamYukki/YukkiAFKBot > project, +# and is released under the "GNU v3.0 License Agreement". +# Please see < https://github.com/TeamYukki/YukkiAFKBot/blob/master/LICENSE > +# +# All rights reserved. +# + +from database import dbname + +usersdb = dbname["users"] +cleandb = dbname["cleanmode"] +cleanmode = {} + + +async def is_cleanmode_on(chat_id: int) -> bool: + mode = cleanmode.get(chat_id) + if not mode: + user = await cleandb.find_one({"chat_id": chat_id}) + if not user: + cleanmode[chat_id] = True + return True + cleanmode[chat_id] = False + return False + return mode + + +async def cleanmode_on(chat_id: int): + cleanmode[chat_id] = True + user = await cleandb.find_one({"chat_id": chat_id}) + if user: + return await cleandb.delete_one({"chat_id": chat_id}) + + +async def cleanmode_off(chat_id: int): + cleanmode[chat_id] = False + user = await cleandb.find_one({"chat_id": chat_id}) + if not user: + return await cleandb.insert_one({"chat_id": chat_id}) + + +async def is_afk(user_id: int) -> bool: + user = await usersdb.find_one({"user_id": user_id}) + return (True, user["reason"]) if user else (False, {}) + + +async def add_afk(user_id: int, mode): + await usersdb.update_one( + {"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True + ) + + +async def remove_afk(user_id: int): + user = await usersdb.find_one({"user_id": user_id}) + if user: + return await usersdb.delete_one({"user_id": user_id}) + + +async def get_afk_users() -> list: + users = usersdb.find({"user_id": {"$gt": 0}}) + return list(await users.to_list(length=1000000000)) if users else [] diff --git a/database/blacklist_db.py b/database/blacklist_db.py new file mode 100644 index 00000000..d05ec9cc --- /dev/null +++ b/database/blacklist_db.py @@ -0,0 +1,37 @@ +from typing import List + +from database import dbname + +blacklist_filtersdb = dbname["blacklistFilters"] + + +async def get_blacklisted_words(chat_id: int) -> List[str]: + _filters = await blacklist_filtersdb.find_one({"chat_id": chat_id}) + if not _filters: + return [] + return _filters["filters"] + + +async def save_blacklist_filter(chat_id: int, word: str): + word = word.lower().strip() + _filters = await get_blacklisted_words(chat_id) + _filters.append(word) + await blacklist_filtersdb.update_one( + {"chat_id": chat_id}, + {"$set": {"filters": _filters}}, + upsert=True, + ) + + +async def delete_blacklist_filter(chat_id: int, word: str) -> bool: + filtersd = await get_blacklisted_words(chat_id) + word = word.lower().strip() + if word in filtersd: + filtersd.remove(word) + await blacklist_filtersdb.update_one( + {"chat_id": chat_id}, + {"$set": {"filters": filtersd}}, + upsert=True, + ) + return True + return False diff --git a/database/filters_db.py b/database/filters_db.py new file mode 100644 index 00000000..66ac2004 --- /dev/null +++ b/database/filters_db.py @@ -0,0 +1,45 @@ +from typing import Dict, List, Union + +from database import dbname + +filtersdb = dbname["filters"] + + +async def _get_filters(chat_id: int) -> Dict[str, int]: + _filters = await filtersdb.find_one({"chat_id": chat_id}) + return _filters["filters"] if _filters else {} + + +async def delete_filter(chat_id: int, name: str) -> bool: + filtersd = await _get_filters(chat_id) + name = name.lower().strip() + if name in filtersd: + del filtersd[name] + await filtersdb.update_one( + {"chat_id": chat_id}, + {"$set": {"filters": filtersd}}, + upsert=True, + ) + return True + return False + + +async def get_filter(chat_id: int, name: str) -> Union[bool, dict]: + name = name.lower().strip() + _filters = await _get_filters(chat_id) + return _filters[name] if name in _filters else False + + +async def get_filters_names(chat_id: int) -> List[str]: + return list(await _get_filters(chat_id)) + + +async def save_filter(chat_id: int, name: str, _filter: dict): + name = name.lower().strip() + _filters = await _get_filters(chat_id) + _filters[name] = _filter + await filtersdb.update_one( + {"chat_id": chat_id}, + {"$set": {"filters": _filters}}, + upsert=True, + ) diff --git a/database/gban_db.py b/database/gban_db.py new file mode 100644 index 00000000..6f6d032a --- /dev/null +++ b/database/gban_db.py @@ -0,0 +1,22 @@ +from database import dbname + +gbansdb = dbname["gban"] + + +async def is_gbanned_user(user_id: int) -> bool: + user = await gbansdb.find_one({"user_id": user_id}) + return bool(user) + + +async def add_gban_user(user_id: int): + is_gbanned = await is_gbanned_user(user_id) + if is_gbanned: + return + return await gbansdb.insert_one({"user_id": user_id}) + + +async def remove_gban_user(user_id: int): + is_gbanned = await is_gbanned_user(user_id) + if not is_gbanned: + return + return await gbansdb.delete_one({"user_id": user_id}) diff --git a/database/imdb_db.py b/database/imdb_db.py new file mode 100644 index 00000000..5d3c16e5 --- /dev/null +++ b/database/imdb_db.py @@ -0,0 +1,20 @@ +from database import dbname + +imbd_db = dbname["imdb"] + + +async def is_imdbset(user_id: int) -> bool: + user = await imbd_db.find_one({"user_id": user_id}) + return (True, user["lang"]) if user else (False, {}) + + +async def add_imdbset(user_id: int, lang): + await imbd_db.update_one( + {"user_id": user_id}, {"$set": {"lang": lang}}, upsert=True + ) + + +async def remove_imdbset(user_id: int): + user = await imbd_db.find_one({"user_id": user_id}) + if user: + return await imbd_db.delete_one({"user_id": user_id}) diff --git a/database/karma_db.py b/database/karma_db.py new file mode 100644 index 00000000..0ce0b9cb --- /dev/null +++ b/database/karma_db.py @@ -0,0 +1,67 @@ +from typing import Dict, Union + +from database import dbname +from misskaty.helper.functions import int_to_alpha + +karmadb = dbname["karma"] + + +async def get_karmas_count() -> dict: + chats_count = 0 + karmas_count = 0 + async for chat in karmadb.find({"chat_id": {"$lt": 0}}): + for i in chat["karma"]: + karma_ = chat["karma"][i]["karma"] + if karma_ > 0: + karmas_count += karma_ + chats_count += 1 + return {"chats_count": chats_count, "karmas_count": karmas_count} + + +async def user_global_karma(user_id) -> int: + total_karma = 0 + async for chat in karmadb.find({"chat_id": {"$lt": 0}}): + karma = await get_karma(chat["chat_id"], await int_to_alpha(user_id)) + if karma and (int(karma["karma"]) > 0): + total_karma += int(karma["karma"]) + return total_karma + + +async def get_karmas(chat_id: int) -> Dict[str, int]: + karma = await karmadb.find_one({"chat_id": chat_id}) + return karma["karma"] if karma else {} + + +async def get_karma(chat_id: int, name: str) -> Union[bool, dict]: + name = name.lower().strip() + karmas = await get_karmas(chat_id) + if name in karmas: + return karmas[name] + + +async def update_karma(chat_id: int, name: str, karma: dict): + name = name.lower().strip() + karmas = await get_karmas(chat_id) + karmas[name] = karma + await karmadb.update_one( + {"chat_id": chat_id}, {"$set": {"karma": karmas}}, upsert=True + ) + + +async def is_karma_on(chat_id: int) -> bool: + chat = await karmadb.find_one({"chat_id_toggle": chat_id}) + return not chat + + +async def karma_on(chat_id: int): + is_karma = await is_karma_on(chat_id) + if is_karma: + return + return await karmadb.delete_one({"chat_id_toggle": chat_id}) + + +async def karma_off(chat_id: int): + is_karma = await is_karma_on(chat_id) + if not is_karma: + return + return await karmadb.insert_one({"chat_id_toggle": chat_id}) diff --git a/database/locale_db.py b/database/locale_db.py new file mode 100644 index 00000000..d6823b54 --- /dev/null +++ b/database/locale_db.py @@ -0,0 +1,22 @@ +from typing import Iterable + +from pyrogram.enums import ChatType + +from database import dbname + +localesdb = dbname["locale"] # DB for localization + +group_types: Iterable[ChatType] = (ChatType.GROUP, ChatType.SUPERGROUP) + + +async def set_db_lang(chat_id: int, chat_type: str, lang_code: str): + await localesdb.update_one( + {"chat_id": chat_id}, + {"$set": {"lang": lang_code, "chat_type": chat_type.value}}, + upsert=True, + ) + + +async def get_db_lang(chat_id: int) -> str: + ul = await localesdb.find_one({"chat_id": chat_id}) + return ul["lang"] if ul else {} diff --git a/database/notes_db.py b/database/notes_db.py new file mode 100644 index 00000000..f4a3d1a4 --- /dev/null +++ b/database/notes_db.py @@ -0,0 +1,44 @@ +from typing import Dict, List, Union + +from database import dbname + +notesdb = dbname["notes"] + + +async def _get_notes(chat_id: int) -> Dict[str, int]: + _notes = await notesdb.find_one({"chat_id": chat_id}) + return _notes["notes"] if _notes else {} + + +async def delete_note(chat_id: int, name: str) -> bool: + notesd = await _get_notes(chat_id) + name = name.lower().strip() + if name in notesd: + del notesd[name] + await notesdb.update_one( + {"chat_id": chat_id}, + {"$set": {"notes": notesd}}, + upsert=True, + ) + return True + return False + + +async def get_note(chat_id: int, name: str) -> Union[bool, dict]: + name = name.lower().strip() + _notes = await _get_notes(chat_id) + return _notes[name] if name in _notes else False + + +async def get_note_names(chat_id: int) -> List[str]: + return list(await _get_notes(chat_id)) + + +async def save_note(chat_id: int, name: str, note: dict): + name = name.lower().strip() + _notes = await _get_notes(chat_id) + _notes[name] = note + + await notesdb.update_one( + {"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True + ) diff --git a/database/sangmata_db.py b/database/sangmata_db.py new file mode 100644 index 00000000..813355e0 --- /dev/null +++ b/database/sangmata_db.py @@ -0,0 +1,42 @@ +from database import dbname + +matadb = dbname["sangmata"] + + +# Get Data User +async def cek_userdata(user_id: int) -> bool: + user = await matadb.find_one({"user_id": user_id}) + return bool(user) + + +async def get_userdata(user_id: int) -> bool: + user = await matadb.find_one({"user_id": user_id}) + return user["username"], user["first_name"], user["last_name"] + + +async def add_userdata(user_id: int, username, first_name, last_name): + await matadb.update_one( + {"user_id": user_id}, + { + "$set": { + "username": username, + "first_name": first_name, + "last_name": last_name, + } + }, + upsert=True, + ) + + +# Enable Mata MissKaty in Selected Chat +async def is_sangmata_on(chat_id: int) -> bool: + chat = await matadb.find_one({"chat_id_toggle": chat_id}) + return bool(chat) + + +async def sangmata_on(chat_id: int) -> bool: + await matadb.insert_one({"chat_id_toggle": chat_id}) + + +async def sangmata_off(chat_id: int): + await matadb.delete_one({"chat_id_toggle": chat_id}) diff --git a/database/users_chats_db.py b/database/users_chats_db.py new file mode 100644 index 00000000..a0ac45e7 --- /dev/null +++ b/database/users_chats_db.py @@ -0,0 +1,112 @@ +from async_pymongo import AsyncClient + +from misskaty.vars import DATABASE_NAME, DATABASE_URI + + +class UsersData: + def __init__(self, uri, database_name): + self._client = AsyncClient(uri) + self.db = self._client[database_name] + self.col = self.db["users"] + self.grp = self.db["groups"] + + @staticmethod + def new_user(id, name): + return dict( + id=id, + name=name, + ban_status=dict( + is_banned=False, + ban_reason="", + ), + ) + + @staticmethod + def new_group(id, title): + return dict( + id=id, + title=title, + chat_status=dict( + is_disabled=False, + reason="", + ), + ) + + async def add_user(self, id, name): + user = self.new_user(id, name) + await self.col.insert_one(user) + + async def is_user_exist(self, id): + user = await self.col.find_one({"id": int(id)}) + return bool(user) + + async def total_users_count(self): + return await self.col.count_documents({}) + + async def remove_ban(self, id): + ban_status = dict(is_banned=False, ban_reason="") + await self.col.update_one({"id": id}, {"$set": {"ban_status": ban_status}}) + + async def ban_user(self, user_id, ban_reason="No Reason"): + ban_status = dict(is_banned=True, ban_reason=ban_reason) + await self.col.update_one({"id": user_id}, {"$set": {"ban_status": ban_status}}) + + async def get_ban_status(self, id): + default = dict(is_banned=False, ban_reason="") + user = await self.col.find_one({"id": int(id)}) + return user.get("ban_status", default) if user else default + + async def get_all_users(self): + return self.col.find({}) + + async def delete_user(self, user_id): + await self.col.delete_many({"id": int(user_id)}) + + async def is_chat_exist(self, id): + user = await self.grp.find_one({"id": int(id)}) + return bool(user) + + async def get_banned(self): + users = self.col.find({"ban_status.is_banned": True}) + chats = self.grp.find({"chat_status.is_disabled": True}) + b_chats = [chat["id"] async for chat in chats] + b_users = [user["id"] async for user in users] + return b_users, b_chats + + async def add_chat(self, chat, title): + chat = self.new_group(chat, title) + await self.grp.insert_one(chat) + + async def get_chat(self, chat): + chat = await self.grp.find_one({"id": int(chat)}) + return chat.get("chat_status") if chat else False + + async def re_enable_chat(self, id): + chat_status = dict( + is_disabled=False, + reason="", + ) + await self.grp.update_one( + {"id": int(id)}, {"$set": {"chat_status": chat_status}} + ) + + async def disable_chat(self, chat, reason="No Reason"): + chat_status = dict( + is_disabled=True, + reason=reason, + ) + await self.grp.update_one( + {"id": int(chat)}, {"$set": {"chat_status": chat_status}} + ) + + async def total_chat_count(self): + return await self.grp.count_documents({}) + + async def get_all_chats(self): + return self.grp.find({}) + + async def get_db_size(self): + return (await self.db.command("dbstats"))["dataSize"] + + +db = UsersData(DATABASE_URI, DATABASE_NAME) diff --git a/database/warn_db.py b/database/warn_db.py new file mode 100644 index 00000000..5ca68da8 --- /dev/null +++ b/database/warn_db.py @@ -0,0 +1,51 @@ +from typing import Dict, Union + +from database import dbname + +warnsdb = dbname["warn"] + + +async def get_warns_count() -> dict: + chats_count = 0 + warns_count = 0 + async for chat in warnsdb.find({"chat_id": {"$lt": 0}}): + for user in chat["warns"]: + warns_count += chat["warns"][user]["warns"] + chats_count += 1 + return {"chats_count": chats_count, "warns_count": warns_count} + + +async def get_warns(chat_id: int) -> Dict[str, int]: + warns = await warnsdb.find_one({"chat_id": chat_id}) + return warns["warns"] if warns else {} + + +async def get_warn(chat_id: int, name: str) -> Union[bool, dict]: + name = name.lower().strip() + warns = await get_warns(chat_id) + if name in warns: + return warns[name] + + +async def add_warn(chat_id: int, name: str, warn: dict): + name = name.lower().strip() + warns = await get_warns(chat_id) + warns[name] = warn + + await warnsdb.update_one( + {"chat_id": chat_id}, {"$set": {"warns": warns}}, upsert=True + ) + + +async def remove_warns(chat_id: int, name: str) -> bool: + warnsd = await get_warns(chat_id) + name = name.lower().strip() + if name in warnsd: + del warnsd[name] + await warnsdb.update_one( + {"chat_id": chat_id}, + {"$set": {"warns": warnsd}}, + upsert=True, + ) + return True + return False diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..15aeac97 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +version: "3.3" + +services: + app: + build: + context: . + dockerfile: Dockerfile + command: bash start.sh + restart: on-failure diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 00000000..7b13190d --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + worker: Dockerfile diff --git a/locales/__init__.py b/locales/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/locales/en-US/admin.json b/locales/en-US/admin.json new file mode 100644 index 00000000..91e65073 --- /dev/null +++ b/locales/en-US/admin.json @@ -0,0 +1,68 @@ +{ + "no_admin_error": "You must be an administrator to use this command.", + "no_permission_error": "I'm sorry but you don't have the required permissions to run this command. Missing permissions: {permissions}", + "private_not_allowed": "This command can't be used in a private chat. If you need any help, please use the /help command.", + "purge_no_reply": "Reply to a message to purge from.", + "delete_no_reply": "Reply To A Message To Delete It", + "pin_no_reply": "Reply to a message to pin/unpin it.", + "report_no_reply": "Reply To A Message To Report That User.", + "no_delete_perm": "Please give me delete message permission.", + "purge_success": "Successfully deleted {del_total} messages..", + "user_not_found": "I can't find that user.", + "invalid_id_uname": "⚠️ Invalid userid/username", + "kick_self_err": "I can't kick myself, i can leave if you want.", + "ban_self_err": "I can't ban myself, i can leave if you want.", + "report_self_err": "Why are you reporting yourself ?", + "demote_self_err": "I can't demote myself.", + "warn_self_err": "I can't warn myself.", + "mute_self_err": "I can't mute myself.", + "kick_sudo_err": "Wow, you wanna kick my owner?", + "ban_sudo_err": "Wow, you wanna try ban my owner?", + "demote_sudo_err": "Wow, you wanna try demote my owner?", + "warn_sudo_err": "Wow, you wanna try give warning to my owner?", + "mute_sudo_err": "Wow, you wanna try give mute to my owner?", + "kick_admin_err": "Lol, it's crazy if i can kick an admin.", + "ban_admin_err": "Lol, it's crazy if i can banned an admin.", + "mute_admin_err": "Lol, it's crazy if i can mute an admin.", + "warn_admin_err": "Lol, it's crazy if i can warn an admin.", + "kick_msg": "**Kicked User:** {mention} [`{id}`]\n**Kicked By:** {kicker}\n**Reason:** {reasonmsg}", + "ban_msg": "**Banned User:** {mention} [`{id}`]\n**Banned By:** {banner}\n", + "unban_msg": "__Banned removed by {mention}__", + "no_ban_permission": "Please give me ban permission to ban user in this group.", + "no_more_99": "You can't use more than 99", + "banned_time": "**Banned For:** {val}\n", + "muted_time": "**Muted For:** {val}\n", + "banned_reason": "**Reason:** {reas}", + "unban_channel_err": "You cannot unban a channel", + "give_unban_user": "Provide a username or reply to a user's message to unban.", + "unban_success": "Successfully unbanned {umention}!", + "give_idban_with_msg_link": "Provide a userid/username along with message link and reason to list-ban", + "give_idunban_with_msg_link": "Provide a userid/username along with message link and reason to list-unban", + "give_reason_list_ban": "You must provide a reason to list-ban", + "Invalid_tg_link": "Invalid message link provided", + "multiple_ban_progress": "`Banning User from multiple groups. This may take some time`", + "multiple_unban_progress": "`Unbanning User from multiple groups. This may take some time`", + "failed_get_uname": "Could not get group usernames", + "listban_msg": "**List-Banned User:** {mention}\n**Banned User ID:** `{uid}`\n**Admin:** {frus}\n**Affected chats:** `{ct}`\n**Reason:** {reas}", + "listunban_msg": "**List-Unbanned User:** {mention}\n**Unbanned User ID:** `{uid}`\n**Admin:** {frus}\n**Affected chats:** `{ct}`\n**Reason:** {reas}", + "promote_self_err": "I can't promote myself.", + "no_promote_perm": "Sadly, I don't permission to promote users.", + "full_promote": "Fully Promoted {umention}!", + "normal_promote": "Promoted {umention}!", + "pin_success": "**Pinned [this]({link}) message.**", + "unpin_success": "**UnPinned [this]({link}) message.**", + "pin_no_perm": "Please give me pin permission to use this command!.", + "report_msg": "Reported {user_mention} to admins!", + "reported_is_admin": "Do you know that the user you are replying is an admin ?", + "user_no_warn": "User {mention} has no warnings.", + "ch_warn_msg": "User {mention} has {warns}/3 warnings.", + "warn_msg": "**Warned User:** {mention}\n**Warned By:** {warner}\n**Reason:** {reas}\n**Warns:** {twarn}/3", + "rmwarn_msg": "Removed warnings of {mention}.", + "unwarn_msg": "Removed warnings by {mention}.", + "rmmute_msg": "__Mute removed by {mention}__", + "unmute_msg": "Unmuted! {umention}", + "reply_to_rm_warn": "Reply to a message to remove a user's warnings.", + "exceed_warn_msg": "Number of warns of {mention} exceeded, BANNED!", + "mute_msg": "**Muted User:** {mention}\n**Muted By:** {muter}\n", + "rm_warn_btn": "🚨 Remove Warn 🚨" +} diff --git a/locales/en-US/afk.json b/locales/en-US/afk.json new file mode 100644 index 00000000..bdd7f0f7 --- /dev/null +++ b/locales/en-US/afk.json @@ -0,0 +1,13 @@ +{ + "no_channel": "This feature not supported for channel.", + "on_afk_msg_no_r": "**{usr}** [{id}] is back online and was away for {tm}\n\n", + "on_afk_msg_with_r": "**{usr}** [{id}] is back online and was away for {tm}\n\n**Reason:** `{reas}`\n\n", + "is_afk_msg_no_r": "**{usr}** [{id}] is AFK since {tm} ago.\n\n", + "is_afk_msg_with_r": "**{usr}** [{id}] is AFK since {tm} ago.\n\n**Reason:** {reas}\n\n", + "is_online": "**{usr}** [{id}] is back online", + "now_afk": "{usr} [{id}] is now AFK!.", + "afkdel_help": "**Usage:**\n/{cmd} [ENABLE|DISABLE] to enable or disable auto delete message.", + "afkdel_disable": "Disabled auto delete AFK message.", + "afkdel_enable": "Enabled auto delete AFK message in this chat.", + "is_afk": "{usr} [{id}] is AFK!." +} \ No newline at end of file diff --git a/locales/en-US/chatbot_ai.json b/locales/en-US/chatbot_ai.json new file mode 100644 index 00000000..7ed24ad5 --- /dev/null +++ b/locales/en-US/chatbot_ai.json @@ -0,0 +1,6 @@ +{ + "no_question": "Please use command /{cmd} [question] to ask your question with AI.", + "find_answers_str": "Wait a moment looking for your answer..", + "dont_spam": "Don't spam please, please wait {tm} second or i will ban you from this bot.", + "answers_too_long": "Question for your answer has exceeded TG text limit, check this link to view.\n\n{answerlink}" +} \ No newline at end of file diff --git a/locales/en-US/dev.json b/locales/en-US/dev.json new file mode 100644 index 00000000..111ef725 --- /dev/null +++ b/locales/en-US/dev.json @@ -0,0 +1,11 @@ +{ + "already_up": "Its already up-to date!", + "up_and_rest": "Updated with default branch, restarting now.", + "cl_btn": "❌ Close", + "no_eval": "__No evaluate message!__", + "run_eval": "Processing eval pyrogram..", + "run_exec": "Processing exec pyrogram..", + "no_cmd": "No command to execute was given.", + "success": "Success", + "no_reply": "No Reply" +} \ No newline at end of file diff --git a/locales/en-US/fun.json b/locales/en-US/fun.json new file mode 100644 index 00000000..c4c886a5 --- /dev/null +++ b/locales/en-US/fun.json @@ -0,0 +1,3 @@ +{ + "result": "🎲 The dice stopped at the number: {number}" +} \ No newline at end of file diff --git a/locales/en-US/general.json b/locales/en-US/general.json new file mode 100644 index 00000000..23599eed --- /dev/null +++ b/locales/en-US/general.json @@ -0,0 +1,6 @@ +{ + "back_btn": "« Go back", + "no_results": "No Results.", + "unknown_id": "Sorry I can't recognize this user. Maybe I've never met him.", + "exp_task": "😶‍🌫️ Timeout. Task has been cancelled!" + } \ No newline at end of file diff --git a/locales/en-US/genss.json b/locales/en-US/genss.json new file mode 100644 index 00000000..964ea1c1 --- /dev/null +++ b/locales/en-US/genss.json @@ -0,0 +1,13 @@ +{ + "wait_msg": "Give me some time to process your request!! 😴", + "wait_dl": "Processing, please wait..", + "dl_progress": "Trying to download, please wait..", + "up_progress": "Trying to upload...", + "success_dl_msg": "File has been downloaded to {path}.", + "fail_open": "😟 Sorry! I cannot open the file.", + "limit_dl": "Sorry, download limited to 2GB to reduce flood. You can convert your files to link.", + "err_ssgen": "Failed screenshoot generation.\n\n{exc}", + "up_msg": "☑️ Generation screenshot successfully.\n\n{namma} ({id})\n#️⃣ #ssgen #id{id}\n\nSS Generate by @{bot_uname}", + "no_reply": "Reply to a Telegram video or document or use direct link after command to generate screenshoot from media!", + "choose_no_ss": "Now choose how many result for screenshot? 🥳.\n\nTotal duration: `{td}` (`{dur} second`)" +} \ No newline at end of file diff --git a/locales/en-US/grup_tools.json b/locales/en-US/grup_tools.json new file mode 100644 index 00000000..5a58ec0d --- /dev/null +++ b/locales/en-US/grup_tools.json @@ -0,0 +1,13 @@ +{ + "sudo_join_msg": "Wow, my cool owner just joined the group!", + "log_bot_added": "#New Group\nGroup = {ttl}({cid})\nNumber of Members = {tot}\nAdded by - {r_j}", + "support_btn": "Support", + "help_btn": "ℹ️ Help", + "update_btn": "📢 Updates", + "chat_not_allowed": "CHAT NOT ALLOWED 🐞\n\nMy owner has banned me from working here! You can contact the owner of this bot..", + "welcome_thanks": "Thank you for adding me to {ttl} ❣️\n\nIf you have any problems or suggestions, you can contact me.", + "capt_welc": "Hi {umention} [{uid}], Welcome to the {ttl} group.", + "combot_msg": "#CAS Federation Ban\nUser {umention} [{uid}] has been detected as a spambot and has been banned. Powered by Combot AntiSpam.", + "spamwatch_msg": "#SpamWatch Federation Ban\nUser {umention} [{uid}] has been banned for {reas}.\n" , + "welcpic_msg": "Welcome {userr} [{id}]" +} \ No newline at end of file diff --git a/locales/en-US/help_menu.json b/locales/en-US/help_menu.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/locales/en-US/help_menu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/locales/en-US/lang_setting.json b/locales/en-US/lang_setting.json new file mode 100644 index 00000000..06585c9c --- /dev/null +++ b/locales/en-US/lang_setting.json @@ -0,0 +1,5 @@ +{ + "language_changed_successfully": "The language has been changed successfully.", + "language_changer_chat": "Here you can change the language used for the bot throughout the chat.\nIf your language is not listed here and you would like to contribute, you can open issue in my github repo.", + "language_changer_private": "Here you can change the language used for the bot in this private chat.\n\nIf you want to change the language of your group, please run the command /setchatlang on it.\nIf your language is not listed here and you would like to contribute, you can open issue in my github repo." + } \ No newline at end of file diff --git a/locales/en-US/main.json b/locales/en-US/main.json new file mode 100644 index 00000000..1a34be34 --- /dev/null +++ b/locales/en-US/main.json @@ -0,0 +1,4 @@ +{ + "language_name": "English", + "language_flag": "🇬🇧" + } \ No newline at end of file diff --git a/locales/en-US/media_extractor.json b/locales/en-US/media_extractor.json new file mode 100644 index 00000000..29c21fb1 --- /dev/null +++ b/locales/en-US/media_extractor.json @@ -0,0 +1,15 @@ +{ + "sub_extr_help": "Please use command /{cmd} [link] to check subtitles or audio in video file.", + "conv_sub_help": "Use command /{cmd} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.", + "progress_str": "⏳ Processing your request..", + "convert_str": "⏳ Converting...", + "unauth_cb": "⚠️ Access Denied!", + "cancel_btn": "❌ Cancel", + "invalid_cb": "⚠️ DONT DELETE YOUR MESSAGE!", + "up_str": "Uploading files..", + "press_btn_msg": "Press the button below to extract subtitles/audio. Only support direct link at this time.\nProcessed in {timelog}", + "fail_extr_media": "Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.", + "fail_extr_sub": "Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}", + "capt_extr_sub": "Filename: {nf}\n\nExtracted by @{bot} in {timelog}", + "capt_conv_sub": "{nf}.srt\n\nConverted by @{bot}" +} diff --git a/locales/en-US/mediainfo.json b/locales/en-US/mediainfo.json new file mode 100644 index 00000000..154ef509 --- /dev/null +++ b/locales/en-US/mediainfo.json @@ -0,0 +1,11 @@ +{ + "processing_text": "`Processing, total time is based on the size of your files...`", + "wait_msg": "`Please wait a moment...`", + "err_link": "It looks like the link you sent is invalid, make sure it's a direct link and can be downloaded.", + "media_invalid": "Please reply to valid media.", + "dl_limit_exceeded": "Sorry, download limited to 2GB to reduce flood. You can convert your files to link.", + "dl_args_text": "Trying to download..", + "mediainfo_help": "Use the command /{cmd} [link], or reply to telegram media with /{cmd}.", + "capt_media": "ℹ️ Your mediainfo results..\n\n**Request By:** {ment}", + "viweb": "💬 Open on Web" +} \ No newline at end of file diff --git a/locales/en-US/nightmodev2.json b/locales/en-US/nightmodev2.json new file mode 100644 index 00000000..439d417b --- /dev/null +++ b/locales/en-US/nightmodev2.json @@ -0,0 +1,17 @@ +{ + "nmd_disabled": "Nightmode disabled.", + "nmd_not_enabled": "Nightmode isn't enabled in this chat.", + "invalid_time_format": "Invalid time format. Use HH:MM format.", + "invalid_lockdur": "Invalid time duration. Use proper format.\nExample: 6h (for 6 hours), 10m for 10 minutes.", + "schedule_already_on": "Already a schedule is running in this chat. Disable it using `-d` flag.", + "nmd_enable_success": "Successfully enabled nightmode in this chat.\nGroup will be locked at {st} and will be opened after {lockdur} everyday.", + "nmd_cb": "🔖 Hai, Aku {bname} dibuat menggunakan Framework Pyrogram v{ver} dan Python v{pyver}.\n\nMau buat bot seperti ini? Yuuk belajar di @botindonesia\nOwner: @YasirArisM", + "nmd_off_not_admin": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`, since {bname} is not an admin in chat `{chat_id}`", + "nmd_off_not_present": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`, since {bname} is not present in chat `{chat_id}`. Removed group from list.", + "nmd_off_err": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`\nERROR: `{e}`", + "nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀️ Group is Opening.\nWill be closed at {close_at}", + "nmd_on_not_admin": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`, since {bname} is not an admin in chat `{chat_id}`", + "nmd_on_not_present": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`, since {bname} is not present in chat `{chat_id}`. Removed group from list.", + "nmd_on_err": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`\nERROR: `{e}`", + "nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Group is closing.\nWill be opened at {open_at}" +} \ No newline at end of file diff --git a/locales/en-US/ocr.json b/locales/en-US/ocr.json new file mode 100644 index 00000000..d5ce6786 --- /dev/null +++ b/locales/en-US/ocr.json @@ -0,0 +1,6 @@ +{ + "no_photo": "Reply photo with /{cmd} command to scan text from images.", + "read_ocr": "Scanning your images..", + "result_ocr": "Hasil OCR:\n{result}", + "ocr_helper": "/ocr [reply to photo] - Read Text From Image" +} \ No newline at end of file diff --git a/locales/en-US/sangmata.json b/locales/en-US/sangmata.json new file mode 100644 index 00000000..9d3bf82b --- /dev/null +++ b/locales/en-US/sangmata.json @@ -0,0 +1,13 @@ +{ + "no_uname": "No Username", + "no_last_name": "No Last Name", + "uname_change_msg": "✨ Changed username from {bef} ➡️ {aft}.\n", + "lastname_change_msg": "✨ Changed last name from {bef} ➡️ {aft}.\n", + "firstname_change_msg": "✨ Changed first name from {bef} ➡️ {aft}.\n", + "set_sangmata_help": "Use /{cmd} on, to enable sangmata. If you want disable, you can use off parameter.", + "sangmata_already_on": "SangMata already enabled in your groups.", + "sangmata_enabled": "Sangmata enabled in your groups.", + "sangmata_already_off": "SangMata already disabled in your groups.", + "sangmata_disabled": "Sangmata disabled in your groups.", + "wrong_param": "Unknown parameter, use only on/off parameter." +} \ No newline at end of file diff --git a/locales/en-US/start_help.json b/locales/en-US/start_help.json new file mode 100644 index 00000000..adf6384d --- /dev/null +++ b/locales/en-US/start_help.json @@ -0,0 +1,11 @@ +{ + "newgroup_log": "#NewGroup\nGroup = {jdl}({id})\nMembers Count = {c}", + "newuser_log": "#NewUser\nID - {id}\nName - {nm}", + "help_name": "Here is the help for **{mod}**:\n", + "help_txt": "Hello {kamuh}, My name is {bot}.\nI'm a pyrogram bot that developed by kind owner with some useful features.\nYou can look by clicking a button below.\n\nGeneral command are:\n - /start: Start the bot\n - /help: Give this message\n - /setlang: Change bot language [BETA]", + "click_me": "Click Me", + "back_btn": "Back", + "click_btn": "Click on the below button to get help about {nm}", + "pm_detail": "PM Me For More Details.", + "start_msg": "Hi {kamuh}, PM me to know about all my features. You can change bot language in bot using /setlang command but it's still in beta stage." +} \ No newline at end of file diff --git a/locales/en-US/stickers.json b/locales/en-US/stickers.json new file mode 100644 index 00000000..35cc1175 --- /dev/null +++ b/locales/en-US/stickers.json @@ -0,0 +1,19 @@ +{ + "no_anim_stick": "Animated sticker is not supported!", + "not_sticker": "This is not a sticker!", + "unkang_msg": "Trying to remove from pack..", + "unkang_success": "Sticker has been removed from your pack", + "unkang_error": "Failed remove sticker from your pack.\n\nERR: {e}", + "unkang_help": "Please reply sticker that created by {c} to remove sticker from your pack.", + "anon_warn": "You are anon admin, kang stickers in my pm.", + "kang_msg": "Trying to steal your sticker...", + "stick_no_name": "The sticker has no name.", + "kang_help": "Want me to guess the sticker? Please tag a sticker.", + "exist_pack": "Using existing sticker pack...", + "new_packs": "Creating a new sticker pack...", + "please_start_msg": "It looks like you've never interacted with me in private chat, you need to do that first..", + "click_me": "Click Me", + "pack_full": "Your Sticker Pack is full if your pack is not in v1 Type /kang 1, if it is not in v2 Type /kang 2 and so on.", + "viewpack": "👀 View Your Pack", + "kang_success": "Sticker successfully stolen!\nEmoji: {emot}" +} \ No newline at end of file diff --git a/locales/en-US/web_scraper.json b/locales/en-US/web_scraper.json new file mode 100644 index 00000000..a02d74b4 --- /dev/null +++ b/locales/en-US/web_scraper.json @@ -0,0 +1,20 @@ +{ + "no_result": "Sorry, i couldn't find any results!", + "no_result_w_query": "Sorry, i could not find query: {kueri}", + "get_data": "⏳ Please wait, getting data from web..", + "cl_btn": "❌ Close", + "back_btn": "↩️ Back", + "dl_text": "⬇️ Download", + "cat_text": "Category", + "quality": "Quality", + "ex_data": "👇 Extract Data ", + "unauth": "This button is not for you..", + "invalid_cb": "Invalid callback data, please send command again..", + "res_scrape": "Scrape result from {link}:\n\n{kl}", + "header_with_query": "#{web} Results For: {kueri}\n\n", + "header_no_query": "#{web} Latest:\n🌀 Use /{cmd} [title] to start search with title.\n\n", + "invalid_cmd_scrape": "Use command /{cmd} [link] to scrape download link.", + "err_getweb": "ERROR: Failed getting data from web because {err}.", + "err_getapi": "ERROR: Failed getting data from API", + "unsupport_dl_btn": "Some result will not appear in extract button because unsupported link." +} \ No newline at end of file diff --git a/locales/en-US/webss.json b/locales/en-US/webss.json new file mode 100644 index 00000000..bd676c20 --- /dev/null +++ b/locales/en-US/webss.json @@ -0,0 +1,6 @@ +{ + "no_url": "Give A Url To Fetch Screenshot.", + "wait_str": "Capturing screenshot...", + "str_credit": "🌞 Screenshot generated using Puppeteer", + "ss_failed_str": "Failed To Take Screenshot. {err}" +} \ No newline at end of file diff --git a/locales/en-US/ytdl_plugins.json b/locales/en-US/ytdl_plugins.json new file mode 100644 index 00000000..332e5474 --- /dev/null +++ b/locales/en-US/ytdl_plugins.json @@ -0,0 +1,14 @@ +{ + "no_channel": "This feature not supported for channel or anonymous user.", + "no_query": "Please input a query..!", + "no_res": "No result found for `{kweri}`", + "dl_btn": "Download", + "back": "Back", + "yts_msg": "Published {pub}\n\n❯ Duration: {dur}\n❯ Views: {vi}\n❯ Uploader: {cname}\n\n", + "invalid_link": "Please input a valid YT-DLP Supported URL", + "err_parse": "Failed parse URL, check logs..", + "wait": "Please wait..", + "unauth": "Not Your Task..", + "endlist": "That's the end of list", + "vip-btn": "Because some user abuse and my server cannot handle it, best video now only for bot owner." +} \ No newline at end of file diff --git a/locales/id-ID/admin.json b/locales/id-ID/admin.json new file mode 100644 index 00000000..c6d83a83 --- /dev/null +++ b/locales/id-ID/admin.json @@ -0,0 +1,68 @@ +{ + "no_admin_error": "Anda harus menjadi administrator untuk menggunakan perintah ini.", + "no_permission_error": "Maaf, tapi anda tidak memiliki izin yang diperlukan untuk menjalankan perintah ini. Izin yang hilang: {permissions}", + "private_not_allowed": "Perintah ini tidak dapat digunakan dalam obrolan pribadi, Jika anda membutuhkan bantuan, mohon gunakan perintah /help.", + "purge_no_reply": "Balas ke pesan yang ingin dihapus.", + "delete_no_reply": "Balas Pesan Untuk Menghapusnya", + "pin_no_reply": "Balas pesan untuk menyematkan/melepas pin.", + "report_no_reply": "Balas Pesan Untuk Melaporkan Pengguna Itu.", + "no_delete_perm": "Tolong beri saya izin untuk menghapus pesan.", + "purge_success": "Berhasil menghapus {del_total} pesan..", + "user_not_found": "Saya tidak dapat menemukan pengguna itu.", + "invalid_id_uname": "⚠️ ID pengguna/nama pengguna salah", + "kick_self_err": "Saya tidak dapat menendang diri sendiri, saya dapat pergi jika Anda mau.", + "ban_self_err": "Saya tidak dapat melarang diri saya sendiri, saya dapat pergi jika Anda mau.", + "report_self_err": "Mengapa Anda melaporkan diri sendiri?", + "demote_self_err": "Saya tidak dapat menurunkan keanggotaan diri saya sendiri.", + "warn_self_err": "Saya tidak dapat memperingatkan diri sendiri.", + "mute_self_err": "Saya tidak dapat membisukan diri sendiri.", + "kick_sudo_err": "Wow, Anda ingin menendang pemilik saya yang spesial?", + "ban_sudo_err": "Wow, Anda ingin mencoba membanned pemilik saya?", + "demote_sudo_err": "Wow, Anda ingin mencoba mendemote pemilik saya?", + "warn_sudo_err": "Wow, Anda ingin mencoba memberi peringatan kepada pemilik saya?", + "mute_sudo_err": "Wow, Anda ingin mencoba membisukan pemilik saya?", + "kick_admin_err": "Hah, sungguh gila jika saya bisa menendang seorang admin.", + "ban_admin_err": "Hah, sungguh gila jika saya bisa melarang seorang admin.", + "mute_admin_err": "Hah, sungguh gila jika saya bisa membisukan admin.", + "warn_admin_err": "Hah, sungguh gila jika saya bisa memperingatkan seorang admin.", + "kick_msg": "**Pengguna yang Ditendang:** {mention} [`{id}`]\n**Ditendang Oleh:** {kicker}\n**Alasan:** {reasonmsg}", + "ban_msg": "**Pengguna yang Dibanned:** {mention} [`{id}`]\n**Dibanned Oleh:** {banner}\n", + "unban_msg": "__Banned dihapus oleh {mention}__", + "no_ban_permission": "Tolong beri saya izin banned untuk membanned pengguna di grup ini.", + "no_more_99": "Anda tidak dapat menggunakan lebih dari 99", + "banned_time": "**Dilarang Untuk:** {val}\n", + "muted_time": "**Dimute Untuk:** {val}\n", + "banned_reason": "**Alasan:** {reas}", + "unban_channel_err": "Anda tidak dapat membatalkan pemblokiran saluran", + "give_unban_user": "Berikan nama pengguna atau balas pesan pengguna untuk membatalkan banned.", + "unban_success": "Berhasil membatalkan pemblokiran {umention}!", + "give_idban_with_msg_link": "Berikan userid/nama pengguna beserta tautan pesan dan alasan pelarangan daftar", + "give_idunban_with_msg_link": "Berikan userid/nama pengguna beserta tautan pesan dan alasan untuk membatalkan larangan", + "give_reason_list_ban": "Anda harus memberikan alasan untuk melarang daftar", + "Invalid_tg_link": "Tautan pesan yang diberikan tidak valid", + "multiple_ban_progress": "`Melarang Pengguna dari banyak grup. Ini mungkin membutuhkan waktu`", + "multiple_unban_progress": "`Membatalkan pencekalan Pengguna dari banyak grup. Ini mungkin membutuhkan waktu`", + "failed_get_uname": "Tidak dapat memperoleh nama pengguna grup", + "listban_msg": "**Pengguna yang Dilarang Daftar:** {mention}\n**ID Pengguna yang Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan yang terpengaruh: ** `{ct}`\n**Alasan:** {reas}", + "listunban_msg": "**Pengguna yang Tidak Dilarang Daftar:** {mention}\n**ID Pengguna yang Tidak Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan yang terpengaruh: ** `{ct}`\n**Alasan:** {reas}", + "promote_self_err": "Saya tidak dapat mempromosikan diri saya sendiri.", + "no_promote_perm": "Sayangnya, saya tidak mengizinkan untuk mempromosikan pengguna.", + "full_promote": "Dipromosikan Sepenuhnya {umention}!", + "normal_promote": "Dipromosikan {umention}!", + "pin_success": "**Pesan [ini]({link}) berhasil disematkan.**", + "unpin_success": "**Pesan sematan [ini]({link}) berhasil dilepas.**", + "pin_no_perm": "Tolong beri saya izin pin untuk menggunakan perintah ini!.", + "report_msg": "Melaporkan {user_mention} ke admin!", + "reported_is_admin": "Apakah Anda tahu bahwa pengguna yang Anda balas adalah seorang admin?", + "user_no_warn": "Pengguna {mention} tidak memiliki peringatan.", + "ch_warn_msg": "Pengguna {mention} memiliki {warns}/3 peringatan.", + "warn_msg": "**Pengguna yang Diperingatkan:** {mention}\n**Diperingatkan Oleh:** {warner}\n**Alasan:** {reas}\n**Peringatan:** {twarn}/ 3", + "rmwarn_msg": "Peringatan {mention} telah dihapus.", + "unwarn_msg": "Peringatan dihapus oleh {mention}.", + "rmmute_msg": "__Bisukan dihapus oleh {mention}__", + "unmute_msg": "Disuarakan! {umention}", + "reply_to_rm_warn": "Balas pesan untuk menghapus peringatan pengguna.", + "exceed_warn_msg": "Jumlah peringatan dari {mention} terlampaui, DILARANG!", + "mute_msg": "**Pengguna yang Dimute:** {mention}\n**Dimute Oleh:** {muter}\n", + "rm_warn_btn": "🚨 Hapus Peringatan 🚨" +} diff --git a/locales/id-ID/afk.json b/locales/id-ID/afk.json new file mode 100644 index 00000000..545faac3 --- /dev/null +++ b/locales/id-ID/afk.json @@ -0,0 +1,13 @@ +{ + "no_channel": "Fitur ini tidak didukung untuk channel.", + "on_afk_msg_no_r": "**{usr}** [{id}] kembali online dan telah AFK selama {tm}\n\n", + "on_afk_msg_with_r": "**{usr}** [{id}] kembali online dan telah AFK selama {tm}\n\n**Alasan:** `{reas}`\n\n", + "is_afk_msg_no_r": "**{usr}** [{id}] telah AFK sejak {tm} yang lalu.\n\n", + "is_afk_msg_with_r": "**{usr}** [{id}] telah AFK sejak {tm} yang lalu.\n\n**Alasan:** {reas}\n\n" , + "is_online": "**{usr}** [{id}] kembali online", + "now_afk": "{usr} [{id}] sekarang AFK!.", + "afkdel_help": "**Penggunaan:**\n/{cmd} [ENABLE|DISABLE] untuk mengaktifkan atau menonaktifkan hapus pesan AFK secara otomatis.", + "afkdel_disable": "Penghapusan otomatis pesan AFK dinonaktifkan.", + "afkdel_enable": "Penghapusan otomatis pesan AFK di obrolan ini diaktifkan.", + "is_afk": "{usr} [{id}] sedang AFK!." +} diff --git a/locales/id-ID/chatbot_ai.json b/locales/id-ID/chatbot_ai.json new file mode 100644 index 00000000..d8b8e07d --- /dev/null +++ b/locales/id-ID/chatbot_ai.json @@ -0,0 +1,6 @@ +{ + "no_question": "Harap gunakan perintah /{cmd} [question] untuk mengajukan pertanyaan Anda menggunakan AI.", + "find_answers_str": "Sedang mencari jawaban terbaik buat Anda..", + "dont_spam": "Tolong jangan melakukan spam, harap tunggu {tm} detik atau saya akan membanned Anda dari bot ini.", + "answers_too_long": "Pertanyaan untuk jawaban Anda telah melampaui batas teks TG, periksa tautan ini untuk melihatnya.\n\n{answerlink}" +} \ No newline at end of file diff --git a/locales/id-ID/dev.json b/locales/id-ID/dev.json new file mode 100644 index 00000000..f2e855e6 --- /dev/null +++ b/locales/id-ID/dev.json @@ -0,0 +1,11 @@ +{ + "already_up": "Sudah paling update!", + "up_and_rest": "Diperbarui dengan branch default, dimulai ulang sekarang.", + "cl_btn": "❌ Tutup", + "no_eval": "__Tidak ada pesan eval!__", + "run_eval": "Memproses pyrogram eval..", + "run_exec": "Memproses pyrogram eksekutif..", + "no_cmd": "Tidak ada perintah untuk dieksekusi.", + "sukses": "Sukses", + "no_reply": "Tidak ada balasan" +} \ No newline at end of file diff --git a/locales/id-ID/fun.json b/locales/id-ID/fun.json new file mode 100644 index 00000000..2fb02a46 --- /dev/null +++ b/locales/id-ID/fun.json @@ -0,0 +1,3 @@ +{ + "result": "🎲 Dadu berhenti di angka: {number}" +} \ No newline at end of file diff --git a/locales/id-ID/general.json b/locales/id-ID/general.json new file mode 100644 index 00000000..5a66cba8 --- /dev/null +++ b/locales/id-ID/general.json @@ -0,0 +1,6 @@ +{ + "back_btn": "« Kembali", + "unknown_id": "Maaf saya tidak bisa mengenali pengguna ini. Mungkin saya belum pernah bertemu dengannya.", + "no_results": "Tidak ada hasil yang ditemukan.", + "exp_task": "😶‍🌫️ Waktu Habis. Tugas Telah Dibatalkan!" +} \ No newline at end of file diff --git a/locales/id-ID/genss.json b/locales/id-ID/genss.json new file mode 100644 index 00000000..980b0522 --- /dev/null +++ b/locales/id-ID/genss.json @@ -0,0 +1,13 @@ +{ + "wait_msg": "Beri saya waktu untuk memproses permintaan Anda!! 😴", + "wait_dl": "Sedang diproses, harap tunggu..", + "dl_progress": "Mencoba mengunduh, harap tunggu..", + "up_progress": "Mencoba mengunggah...", + "success_dl_msg": "Berkas telah diunduh ke {path}.", + "fail_open": "😟 Maaf! Saya tidak dapat membuka file.", + "limit_dl": "Maaf, unduh terbatas hingga 2GB untuk mengurangi flood. Anda dapat mengkonversi file Anda menjadi tautan.", + "err_ssgen": "Pembuatan screenshot gagal.\n\n{exc}", + "up_msg": "☑️ Pembuatan screenshot berhasil.\n\n{namma} ({id})\n#️⃣ #ssgen #id{id}\n\nSS Dibuat oleh @{bot_uname} ", + "no_reply": "Balas video atau dokumen Telegram atau gunakan tautan langsung setelah perintah untuk membuat screenshot dari media!", + "choose_no_ss": "Sekarang pilih berapa hasil screenshot? 🥳.\n\nTotal durasi: `{td}` (`{dur} detik`)" +} \ No newline at end of file diff --git a/locales/id-ID/grup_tools.json b/locales/id-ID/grup_tools.json new file mode 100644 index 00000000..84effeb3 --- /dev/null +++ b/locales/id-ID/grup_tools.json @@ -0,0 +1,13 @@ +{ + "sudo_join_msg": "Waw, Pemilikku yang keren baru saja bergabung ke grup!", + "log_bot_added": "#GrupBaru\nGrup = {ttl}({cid})\nJumlah Anggota = {tot}\nDitambahkan oleh - {r_j}", + "support_btn": "Dukungan", + "help_btn": "ℹ️ Bantuan", + "update_btn": "📢 Updates", + "chat_not_allowed": "CHAT TIDAK DIIJINKAN 🐞\n\nPemilik saya sudah melarang saya untuk bekerja disini! Kamu bisa menghubungi pemilik bot ini..", + "welcome_thanks": "Terimakasih sudah menambahkan saya di {ttl} ❣️\n\nJika ada kendala atau saran bisa kontak ke saya.", + "capt_welc": "Hai {umention} [{uid}], Selamat datang digrup {ttl}.", + "combot_msg": "#CAS Federation Ban\nPengguna {umention} [{uid}] terdeteksi sebagai spambot dan telah dikeluarkan. Powered by Combot AntiSpam.", + "spamwatch_msg": "#SpamWatch Federation Ban\nPengguna {umention} [{uid}] telah dikeluarkan karena {reas}.\n", + "welcpic_msg": "Selamat Datang {userr} [{id}]" +} \ No newline at end of file diff --git a/locales/id-ID/help_menu.json b/locales/id-ID/help_menu.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/locales/id-ID/help_menu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/locales/id-ID/lang_setting.json b/locales/id-ID/lang_setting.json new file mode 100644 index 00000000..bae662bf --- /dev/null +++ b/locales/id-ID/lang_setting.json @@ -0,0 +1,5 @@ +{ + "language_changed_successfully": "Bahasa telah berhasil diubah.", + "language_changer_chat": "Di sini Anda dapat mengubah bahasa yang digunakan bot selama obrolan.\nJika bahasa Anda tidak ada di sini dan Anda ingin berkontribusi, Anda dapat membuka masalah di github saya. .", + "language_changer_private": "Di sini Anda dapat mengubah bahasa yang digunakan oleh bot dalam obrolan pribadi ini.\n\nJika Anda ingin mengubah bahasa grup Anda, buka perintah /setchatlang. \nJika bahasa Anda tidak ada di sini dan Anda ingin berkontribusi, buka repo misskaty di github." +} \ No newline at end of file diff --git a/locales/id-ID/main.json b/locales/id-ID/main.json new file mode 100644 index 00000000..9e014f6e --- /dev/null +++ b/locales/id-ID/main.json @@ -0,0 +1,4 @@ +{ + "language_name": "Indonesia", + "language_flag": "🇮🇩" + } \ No newline at end of file diff --git a/locales/id-ID/media_extractor.json b/locales/id-ID/media_extractor.json new file mode 100644 index 00000000..4e159236 --- /dev/null +++ b/locales/id-ID/media_extractor.json @@ -0,0 +1,15 @@ +{ + "sub_extr_help": "Harap gunakan perintah /{cmd} [tautan] untuk memeriksa teks film atau audio dalam berkas video.", + "conv_sub_help": "Gunakan perintah /{cmd} dengan membalas berkas .ass atau .vtt, untuk mengonversi teks film dari .ass atau .vtt ke srt.", + "progress_str": "⏳ Memproses permintaan Anda..", + "convert_str": "⏳ Mengkonversi...", + "unauth_cb": "⚠️ Akses Ditolak!", + "batal_btn": "❌ Batal", + "invalid_cb": "⚠️ JANGAN HAPUS PESAN ANDA!", + "up_str": "Mengunggah berkas..", + "press_btn_msg": "Tekan tombol di bawah untuk mengekstrak teks/audio. Saat ini hanya mendukung tautan langsung.\nDiproses dalam {timelog}", + "fail_extr_media": "Gagal mengekstrak media, pastikan tautan Anda tidak dilindungi oleh WAF atau mungkin tidak dapat diakses oleh bot.", + "fail_extr_sub": "Sub ekstrak gagal, Mungkin formatnya tidak didukung..\n\nTautan: {link}\nERR: {e}", + "capt_extr_sub": "Nama file: {nf}\n\nDiekstrak oleh @{bot} dalam {timelog}", + "capt_conv_sub": "{nf}.srt\n\nDikonversi oleh @{bot}" +} diff --git a/locales/id-ID/mediainfo.json b/locales/id-ID/mediainfo.json new file mode 100644 index 00000000..6c719fec --- /dev/null +++ b/locales/id-ID/mediainfo.json @@ -0,0 +1,11 @@ +{ + "processing_text": "`Memproses, total waktu didasarkan pada ukuran file Anda...`", + "wait_msg": "`Mohon tunggu sementara...`", + "err_link": "Sepertinya tautan yang Anda kirim tidak valid, pastikan tautan langsung dan bisa di unduh.", + "media_invalid": "Silakan balas ke media yang valid.", + "dl_limit_exceeded": "Maaf, unduh dibatasi hingga 2GB untuk mengurangi flood. Anda dapat mengonversi berkas Anda menjadi tautan.", + "dl_args_text": "Mencoba mengunduh..", + "mediainfo_help": "Gunakan perintah /{cmd} [tautan], atau balas telegram media dengan /{cmd}.", + "capt_media": "ℹ️ Hasil mediainfo anda..\n\n**Diminta Oleh:** {ment}", + "viweb": "💬 Buka di Web" +} \ No newline at end of file diff --git a/locales/id-ID/nightmodev2.json b/locales/id-ID/nightmodev2.json new file mode 100644 index 00000000..98f858dd --- /dev/null +++ b/locales/id-ID/nightmodev2.json @@ -0,0 +1,17 @@ +{ + "nmd_disabled": "Mode malam dinonaktifkan.", + "nmd_not_enabled": "Mode malam tidak diaktifkan di obrolan ini.", + "invalid_time_format": "Format waktu tidak sah. Gunakan format HH:MM.", + "invalid_lockdur": "Durasi waktu tidak valid. Gunakan format yang tepat.\nContoh: 6j (selama 6 jam), 10m selama 10 menit.", + "schedule_already_on": "Sudah ada jadwal yang berjalan di obrolan ini. Nonaktifkan menggunakan tanda `-d`.", + "nmd_enable_success": "Berhasil mengaktifkan mode malam dalam obrolan ini.\nGrup akan dikunci pada {st} dan akan dibuka setelah {lockdur} setiap hari.", + "nmd_cb": "🔖 Hai, Saya {bname} dibuat menggunakan Framework Pyrogram v{ver} dan Python v{pyver}.\n\nMau buat bot seperti ini? Yuuk belajar di @botindonesia\nOwner: @YasirArisM", + "nmd_off_not_admin": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`, karena {bname} bukan admin di obrolan `{chat_id}`", + "nmd_off_not_present": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`, karena {bname} tidak ada di obrolan `{chat_id}`. Menghapus grup dari daftar.", + "nmd_off_err": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`\nERROR: `{e}`", + "nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀️ Grup sedang dibuka.\nAkan ditutup pada {close_at}", + "nmd_on_not_admin": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`, karena {bname} bukan admin di obrolan `{chat_id}`", + "nmd_on_not_present": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`, karena {bname} tidak ada di obrolan `{chat_id}`. Grup dihapus dari daftar.", + "nmd_on_err": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`\nERROR: `{e}`", + "nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Grup ditutup.\nAkan dibuka pada {open_at}" +} \ No newline at end of file diff --git a/locales/id-ID/ocr.json b/locales/id-ID/ocr.json new file mode 100644 index 00000000..a9043c73 --- /dev/null +++ b/locales/id-ID/ocr.json @@ -0,0 +1,6 @@ +{ + "no_photo": "Balas foto dengan perintah /{cmd} untuk memindai teks dari gambar.", + "read_ocr": "Memindai gambar Anda..", + "result_ocr": "Hasil OCR:\n{result}", + "ocr_helper": "/ocr [balas ke foto] - Baca Teks Dari Gambar" +} \ No newline at end of file diff --git a/locales/id-ID/sangmata.json b/locales/id-ID/sangmata.json new file mode 100644 index 00000000..52417d10 --- /dev/null +++ b/locales/id-ID/sangmata.json @@ -0,0 +1,13 @@ +{ + "no_uname": "Tanpa Username", + "no_last_name": "Tanpa Nama Belakang", + "uname_change_msg": "✨ Mengubah username dari {bef} ➡️ {aft}.\n", + "lastname_change_msg": "✨ Mengubah nama belakang dari {bef} ➡️ {aft}.\n", + "firstname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ {aft}.\n", + "set_sangmata_help": "Gunakan /{cmd} on, untuk mengaktifkan sangmata. Jika Anda ingin menonaktifkan, Anda dapat menggunakan parameter off.", + "sangmata_already_on": "SangMata telah diaktifkan di grup Anda.", + "sangmata_enabled": "Sangmata diaktifkan di grup Anda.", + "sangmata_already_off": "SangMata telah dinonaktifkan di grup Anda.", + "sangmata_disabled": "Sangmata dinonaktifkan di grup Anda.", + "wrong_param": "Parameter tidak diketahui, gunakan hanya parameter hidup/mati." +} \ No newline at end of file diff --git a/locales/id-ID/start_help.json b/locales/id-ID/start_help.json new file mode 100644 index 00000000..63b6ba3a --- /dev/null +++ b/locales/id-ID/start_help.json @@ -0,0 +1,11 @@ +{ + "newgroup_log": "#NewGroup\nGroup = {jdl}({id})\nJumlah Anggota = {c}", + "newuser_log": "#PenggunaBaru\nID - {id}\nNama - {nm}", + "help_name": "Ini bantuan untuk **{mod}**:\n", + "help_txt": "Halo {kamuh}, Nama saya {bot}.\nSaya adalah bot pyrogram yang dikembangkan oleh pemilik yang baik hati dengan beberapa fitur berguna.\nAnda dapat melihat dengan mengeklik tombol di bawah.\n\nPerintah umum adalah :\n - /start: Mulai bot\n - /help: Berikan pesan ini\n - /setlang: Ubah bahasa bot [BETA]", + "click_me": "Klik Saya", + "back_btn": "Kembali", + "click_btn": "Klik tombol di bawah untuk mendapatkan bantuan tentang {nm}", + "pm_detail": "PM Saya Untuk Detail Lebih Lanjut.", + "start_msg": "Hai {kamuh}, PM saya untuk mengetahui semua fitur saya. Anda dapat mengubah bahasa bot di bot menggunakan perintah /setlang tetapi ini masih dalam tahap beta." +} diff --git a/locales/id-ID/stickers.json b/locales/id-ID/stickers.json new file mode 100644 index 00000000..cd69b711 --- /dev/null +++ b/locales/id-ID/stickers.json @@ -0,0 +1,19 @@ +{ + "no_anim_stick": "Stiker animasi tidak didukung!", + "not_sticker": "Ini bukan stiker!", + "unkang_msg": "Mencoba menghapus dari paket..", + "unkang_success": "Stiker telah dihapus dari paket Anda", + "unkang_error": "Gagal menghapus stiker dari paket Anda.\n\nERR: {e}", + "unkang_help": "Tolong balas stiker yang dibuat oleh {c} untuk menghapus stiker dari paket Anda.", + "anon_warn": "Anda adalah admin anon, stiker kang ada di pm saya.", + "kang_msg": "Mencoba mencuri stiker Anda...", + "stick_no_name": "Stiker tidak memiliki nama.", + "kang_help": "Ingin saya menebak stikernya? Harap tandai stiker.", + "exist_pack": "Menggunakan paket stiker yang ada...", + "new_packs": "Membuat paket stiker baru...", + "please_start_msg": "Tampaknya Anda belum pernah berinteraksi dengan saya dalam obrolan pribadi, Anda harus melakukannya dulu..", + "click_me": "Klik Saya", + "pack_full": "Paket Stiker Anda penuh jika paket Anda tidak dalam Tipe v1 /kang 1, jika tidak dalam Tipe v2 /kang 2 dan seterusnya.", + "viewpack": "👀 Lihat Paket", + "kang_success": "Stiker berhasil dicuri!\nEmoji: {emot}" +} \ No newline at end of file diff --git a/locales/id-ID/web_scraper.json b/locales/id-ID/web_scraper.json new file mode 100644 index 00000000..36d458eb --- /dev/null +++ b/locales/id-ID/web_scraper.json @@ -0,0 +1,20 @@ +{ + "no_result": "Maaf, saya tidak dapat menemukan hasil apa pun!", + "no_result_w_query": "Maaf, saya tidak dapat menemukan kueri: {kueri}", + "get_data": "⏳ Mohon tunggu, mengambil data dari web..", + "cl_btn": "❌ Tutup", + "back_btn": "↩️ Kembali", + "dl_text": "⬇️ Unduh", + "cat_text": "Kategori", + "kualitas": "Kualitas", + "ex_data": "👇 Ekstrak Data", + "unauth": "Tombol ini bukan untuk Anda..", + "invalid_cb": "Data callback tidak valid, silakan kirim perintah lagi..", + "res_scrape": "Hasil Scrape dari {link}:\n\n{kl}", + "header_with_query": "Hasil Pencarian #{web} Untuk: {kueri}\n\n", + "header_no_query": "#{web} Terbaru:\n🌀 Gunakan /{cmd} [judul] untuk memulai pencarian dengan judul.\n\n", + "invalid_cmd_scrape": "Gunakan perintah /{cmd} [link] untuk mengambil link unduhan.", + "err_getweb": "ERROR: Failed getting data from web because {err}.", + "err_getapi": "ERROR: Failed getting data from API", + "unsupport_dl_btn": "Beberapa hasil tidak akan muncul di tombol ekstrak karena tautan tidak didukung." +} \ No newline at end of file diff --git a/locales/id-ID/webss.json b/locales/id-ID/webss.json new file mode 100644 index 00000000..fa9df737 --- /dev/null +++ b/locales/id-ID/webss.json @@ -0,0 +1,6 @@ +{ + "no_url": "Berikan url untuk mengambil tangkapan layar.", + "wait_str": "Mengambil tangkapan layar...", + "str_credit": "🌞 Screenshot dibuat dengan Puppeteer", + "ss_failed_str": "Gagal Mengambil Tangkapan Layar. ERROR: {err}" +} \ No newline at end of file diff --git a/locales/id-ID/ytdl_plugins.json b/locales/id-ID/ytdl_plugins.json new file mode 100644 index 00000000..e6e7ac38 --- /dev/null +++ b/locales/id-ID/ytdl_plugins.json @@ -0,0 +1,14 @@ +{ + "no_channel": "Fitur ini tidak didukung untuk channel atau pengguna anonim.", + "no_query": "Silakan kirim link yang mau diunduh..!", + "no_res": "Tidak ada hasil yang ditemukan untuk `{kweri}`", + "dl_btn": "Unduh", + "kembali": "kembali", + "yts_msg": "Dipublikasikan {pub}\n\n❯ Durasi: {dur}\n❯ Penayangan: {vi}\n❯ Pengunggah: {cname}\n\n", + "invalid_link": "Masukkan URL yang Didukung YT-DLP yang valid", + "err_parse": "Gagal menguraikan URL, periksa log..", + "tunggu": "Harap tunggu..", + "unauth": "Bukan Tugas Anda..", + "endlist": "Itu adalah akhir dari daftar", + "vip-btn": "Karena beberapa penyalahgunaan pengguna, video terbaik sekarang hanya untuk pemilik bot." +} \ No newline at end of file diff --git a/locales/id-JW/admin.json b/locales/id-JW/admin.json new file mode 100644 index 00000000..d2e4df0d --- /dev/null +++ b/locales/id-JW/admin.json @@ -0,0 +1,68 @@ +{ + "no_admin_error": "Sampeyan kudu dadi administrator kanggo nggunakake perintah iki.", + "no_permission_error": "Ngapunten, nanging sampeyan ora duwe izin sing dibutuhake kanggo nindakake perintah iki. Izin sing ilang: {permissions}", + "private_not_allowed": "Perintah iki ora bisa digunakake ing obrolan pribadi, Yen sampeyan butuh bantuan, mohon nggunakake perintah /help.", + "purge_no_reply": "Bales pesen sing arep dibusak.", + "delete_no_reply": "Bales Pesen Kanggo Mbusak", + "pin_no_reply": "Bales pesen sing arep disematke/copot.", + "report_no_reply": "Bales Pesen Kanggo Nglaporake Panganggo.", + "no_delete_perm": "Tulung aku kei izin mbusak pesen.", + "purge_success": "Kasil mbusak {del_total} pesen..", + "user_not_found": "Aku ora bisa nemokake panganggo kuwi.", + "invalid_id_uname": "⚠️ panganggo/jeneng panganggo ora sah", + "kick_self_err": "Aku ora bisa nyepak awakku dhewe, aku bisa lunga yen sampeyan pengin.", + "ban_self_err": "Aku ora bisa nglarang aku, aku bisa lunga yen sampeyan pengin.", + "report_self_err": "Kenging menapa panjenengan lapor piyambak?", + "demote_self_err": "Aku ora bisa mudhun dhewe.", + "warn_self_err": "Aku ora bisa ngelekake awakku dhewe.", + "mute_self_err": "Aku ora bisa bisu awakku dhewe.", + "kick_sudo_err": "Wah, kowe arep nyepak juraganku?", + "ban_sudo_err": "Wah, sampeyan pengin nyoba nglarang pemilikku?", + "demote_sudo_err": "Wah, sampeyan pengin nyoba nurunake pemilikku?", + "warn_sudo_err": "Wah, sampeyan pengin nyoba menehi peringatan marang pemilikku?", + "mute_sudo_err": "Wah, sampeyan pengin nyoba menehi bisu marang pemilikku?", + "kick_admin_err": "Lol, edan yen aku bisa nyepak admin.", + "ban_admin_err": "Lol, edan yen aku bisa nglarang admin.", + "mute_admin_err": "Lol, edan yen aku bisa bisu admin.", + "warn_admin_err": "Lol, edan yen aku bisa ngelingake admin.", + "kick_msg": "**Panganggo Ditendhang:** {mention} [`{id}`]\n**Ditendhang dening:** {kicker}\n**Alasan:** {reasonmsg}", + "ban_msg": "**Panganggo sing Dicekal:** {mention} [`{id}`]\n**Dicekal Dening:** {banner}\n", + "unban_msg": "__Dicekal dibusak kanthi {mention}__", + "no_ban_permission": "Mangga kula nyuwun idin nglarang panganggo ing grup punika.", + "no_more_99": "Sampeyan ora bisa nggunakake luwih saka 99", + "banned_time": "**Dicekal Kanggo:** {val}\n", + "muted_time": "**Diam Kanggo:** {val}\n", + "banned_reason": "**Alesan:** {reas}", + "unban_channel_err": "Sampeyan ora bisa mbatalake saluran", + "give_unban_user": "Nyedhiyani jeneng panganggo utawa mbales pesen panganggo kanggo mbatalake larangan.", + "unban_success": "Kasil mbatalake {umention}!", + "give_idban_with_msg_link": "Nyedhiyakake id panganggo/jeneng panganggo bebarengan karo pranala pesen lan alasan kanggo larangan daftar", + "give_idunban_with_msg_link": "Nyedhiyani id panganggo/jeneng panganggo bebarengan karo pranala pesen lan alasan kanggo daftar-unban", + "give_reason_list_ban": "Sampeyan kudu menehi alesan kanggo nglarang daftar", + "Invalid_tg_link": "Link pesen ora sah diwenehake", + "multiple_ban_progress": "`Nglarang Panganggo saka macem-macem grup. Iki mbutuhake sawetara wektu`", + "multiple_unban_progress": "`Mbusak Larangan Panganggo saka pirang-pirang grup. Iki mbutuhake sawetara wektu`", + "failed_get_uname": "Ora bisa njupuk jeneng panganggo grup", + "listban_msg": "**Panganggo sing Dilarang Dhaptar:** {mention}\n**ID Panganggo sing Dicekal:** `{uid}`\n**Admin:** {frus}\n**Obrolan sing kena pengaruh: ** `{ct}`\n**Alasan:** {reas}", + "listunban_msg": "**Daftar Panganggo sing Ora Dilarang:** {mention}\n**ID Panganggo sing Ora Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan sing kena pengaruh: ** `{ct}`\n**Alasan:** {reas}", + "promote_self_err": "Aku ora bisa promosi dhewe.", + "no_promote_perm": "Sedhih, aku ora ijin kanggo promosi pangguna.", + "full_promote": "{umention} dipromosekake kanthi lengkap!", + "normal_promote": "Dipromosikke {umention}!", + "pin_success": "**Sukses semat pesen iki [iki]({link}).**", + "unpin_success": "**Pesen sematan [iki]({link}) kasil dicopot.**", + "pin_no_perm": "Tulung wenehi pin izin kanggo nggunakake printah iki!.", + "report_msg": "Kacarita {user_mention} menyang admin!", + "reported_is_admin": "Apa sampeyan ngerti yen pangguna sing sampeyan bales iku admin?", + "user_no_warn": "Panganggo {mention} ora ana bebaya.", + "ch_warn_msg": "{mention} duwe {warning}/3 bebaya.", + "warn_msg": "**Panganggo sing Dielingake:** {mention}\n**Dielingake Dening:** {warner}\n**Alesan:** {reas}\n**Ngelingake:** {twarn}/ 3", + "rmwarn_msg": "Pènget saka {mention} wis dibusak.", + "unwarn_msg": "Pènget sing dibusak kanthi {mention}.", + "rmmute_msg": "__Bisu dibusak kanthi {mention}__", + "unmute_msg": "Ora bisu! {umention}", + "reply_to_rm_warn": "Bales pesen kanggo mbusak bebaya pangguna.", + "exceed_warn_msg": "Jumlah peringatan babagan {mention} ngluwihi, DIBRANG!", + "mute_msg": "**Panganggo Bisu:** {mention}\n**Dibunyikan Dening:** {muter}\n", + "rm_warn_btn": "🚨 Copot Warn 🚨" +} diff --git a/locales/id-JW/afk.json b/locales/id-JW/afk.json new file mode 100644 index 00000000..732ad35d --- /dev/null +++ b/locales/id-JW/afk.json @@ -0,0 +1,13 @@ +{ + "no_channel": "Fitur iki ora didhukung kanggo channel.", + "on_afk_msg_no_r": "**{usr}** [{id}] wis online maneh lan ora ana suwene {tm}\n\n", + "on_afk_msg_with_r": "**{usr}** [{id}] wis online maneh lan ora ana suwene {tm}\n\n**Alesan:** `{reas}`\n\n", + "is_afk_msg_no_r": "**{usr}** [{id}] iku AFK wiwit {tm} kepungkur.\n\n", + "is_afk_msg_with_r": "**{usr}** [{id}] iku AFK wiwit {tm} kepungkur.\n\n**Alesan:** {reas}\n\n" , + "is_online": "**{usr}** [{id}] wis online maneh", + "now_afk": "{usr} [{id}] saiki dadi AFK!.", + "afkdel_help": "**Panganggone:**\n/{cmd} [ENABLE|DISABLE] kanggo ngaktifake utawa mateni pesen otomatis mbusak.", + "afkdel_disable": "Mbusak pesen AFK otomatis dipateni.", + "afkdel_enable": "Mbusak pesen AFK otomatis ing obrolan iki diaktifake.", + "is_afk": "{usr} [{id}] iku AFK!." +} diff --git a/locales/id-JW/chatbot_ai.json b/locales/id-JW/chatbot_ai.json new file mode 100644 index 00000000..34693a3b --- /dev/null +++ b/locales/id-JW/chatbot_ai.json @@ -0,0 +1,6 @@ +{ + "no_question": "Tulung gunakake printah /{cmd} [pitakon] kanggo takon nganggo fitur AI.", + "find_answers_str": "Lagi goleki jawaban paling apik kanggo sampeyan..", + "dont_spam": "Aja spam, mangga ngenteni {tm} detik utawa aku bakal nglarang sampeyan saka bot iki.", + "answers_too_long": "Pitakonan kanggo jawaban sampeyan wis ngluwihi wates teks TG, priksa pranala iki kanggo ndeleng.\n\n{answerlink}" +} \ No newline at end of file diff --git a/locales/id-JW/dev.json b/locales/id-JW/dev.json new file mode 100644 index 00000000..490736f9 --- /dev/null +++ b/locales/id-JW/dev.json @@ -0,0 +1,11 @@ +{ + "already_up": "Wis up-to-date!", + "up_and_rest": "Dianyari nganggo branch standar, diwiwiti maneh saiki.", + "cl_btn": "❌ Tutup", + "no_eval": "__Ora ana pesen eval!__", + "run_eval": "Ngolah pyrogram eval..", + "run_exec": "Ngolah pyrogram exec..", + "no_cmd": "Ora ana prentah kanggo nglakokaké.", + "success": "Sukses", + "no_reply": "Ora Wangsulan" +} \ No newline at end of file diff --git a/locales/id-JW/fun.json b/locales/id-JW/fun.json new file mode 100644 index 00000000..4cf5eac5 --- /dev/null +++ b/locales/id-JW/fun.json @@ -0,0 +1,3 @@ +{ + "result": "🎲 Dadu mandheg ing nomer: {number}" +} \ No newline at end of file diff --git a/locales/id-JW/general.json b/locales/id-JW/general.json new file mode 100644 index 00000000..bd978128 --- /dev/null +++ b/locales/id-JW/general.json @@ -0,0 +1,6 @@ +{ + "back_btn": "« Balik Maneh", + "unknown_id": "Nganpunten, aku ora ngerti pengguna iki. Mungkin aku durung pernah ketemu mbi dek'e.", + "no_results": "Ora ana asil sing ditemokake.", + "exp_task": "😶‍🌫️ Wektu wis entek. Tugas wis dibatalake!" + } \ No newline at end of file diff --git a/locales/id-JW/genss.json b/locales/id-JW/genss.json new file mode 100644 index 00000000..7730eb22 --- /dev/null +++ b/locales/id-JW/genss.json @@ -0,0 +1,13 @@ +{ + "wait_msg": "Wenehi wektu kanggo ngolah panjalukmu!! 😴", + "wait_dl": "Lagi diproses, mangga ngenteni..", + "dl_progress": "Nyoba ngundhuh, mangga ngenteni..", + "up_progress": "Nyoba ngunggah...", + "success_dl_msg": "Berkas wis diundhuh menyang {path}.", + "fail_open": "😟 Nuwun sewu! Aku ora bisa mbukak file.", + "limit_dl": "Nuwun sewu, download dibatesi nganti 2GB kanggo nyuda flood. Sampeyan bisa ngowahi file dadi link luwih dhisik.", + "err_ssgen": "Gagal nggawe screenshoot.\n\n{exc}", + "up_msg": "☑️ Screenshot generasi kasil.\n\n{namma} ({id})\n#️⃣ #ssgen #id{id}\n\nSS Digawe dening @{bot_uname} ", + "no_reply": "Bales menyang video utawa dokumen Telegram utawa gunakake link langsung sawise printah kanggo ngasilake screenshot saka media!", + "choose_no_ss": "Saiki pilih pira asil kanggo screenshot? 🥳.\n\nTotal durasi: `{td}` (`{dur} detik`)" +} \ No newline at end of file diff --git a/locales/id-JW/grup_tools.json b/locales/id-JW/grup_tools.json new file mode 100644 index 00000000..aa0ef5d2 --- /dev/null +++ b/locales/id-JW/grup_tools.json @@ -0,0 +1,13 @@ +{ + "sudo_join_msg": "Waw, Pemilikku sing ganteng gabung menyang grup!", + "log_bot_added": "#GrupBaru\nGrup = {ttl}({cid})\nJumlah Anggota = {tot}\nDitambahake dening - {r_j}", + "support_btn": "Dukungan", + "help_btn": "ℹ️ Pitulungan", + "update_btn": "📢 Nganyari", + "chat_not_allowed": "CHAT ORA DIIJINKE 🐞\n\nPemilik ku wes nglarang aku kerja neng kene! Sampeyan bisa hubungi pemilik bot iki..", + "welcome_thanks": "Terimakasih wis nambahi saya ing {ttl} ❣️\n\nYen ana kendal utawa saran bisa hubungi saya.", + "capt_welc": "Hai {umention} [{uid}], sugeng rawuh ing grup {ttl}.", + "combot_msg": "Larangan Federasi #CAS\nPengguna {umention} [{uid}] dideteksi minangka spambot lan wis dibusak. Powered by Combot AntiSpam.", + "spamwatch_msg": "Larangan Federasi #SpamWatch\nPengguna {umention} [{uid}] wis dibusak amarga {reas}.\n" , + "welcpic_msg": "Sugeng Rawuh {userr} [{id}]" +} \ No newline at end of file diff --git a/locales/id-JW/help_menu.json b/locales/id-JW/help_menu.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/locales/id-JW/help_menu.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/locales/id-JW/lang_setting.json b/locales/id-JW/lang_setting.json new file mode 100644 index 00000000..0b32a39d --- /dev/null +++ b/locales/id-JW/lang_setting.json @@ -0,0 +1,5 @@ +{ + "language_changed_successfully": "Basa wis kasil diganti.", + "language_changer_chat": "Ing kene sampeyan bisa ngganti basa sing digunakake kanggo bot sajrone obrolan.\nYen basa sampeyan ora ana ing kene lan sampeyan pengin nyumbang, sampeyan bisa mbukak masalah ing githubku. .", + "language_changer_private": "Ing kene sampeyan bisa ngganti basa sing digunakake kanggo bot ing obrolan pribadi iki.\n\nYen sampeyan pengin ngganti basa grup sampeyan, bukak printah /setchatlang. \nYen basa sampeyan ora ana ing kene lan sampeyan pengin nyumbang, bukak repo misskaty." +} \ No newline at end of file diff --git a/locales/id-JW/main.json b/locales/id-JW/main.json new file mode 100644 index 00000000..4e8ba7ed --- /dev/null +++ b/locales/id-JW/main.json @@ -0,0 +1,4 @@ +{ + "language_name": "Jawa", + "language_flag": "💫​" + } \ No newline at end of file diff --git a/locales/id-JW/media_extractor.json b/locales/id-JW/media_extractor.json new file mode 100644 index 00000000..12d2beac --- /dev/null +++ b/locales/id-JW/media_extractor.json @@ -0,0 +1,15 @@ +{ + "sub_extr_help": "Gunakake printah /{cmd} [link] kanggo mriksa subtitle utawa audio ing file video.", + "conv_sub_help": "Gunakake printah /{cmd} kanthi mbales berkas .ass utawa .vtt, kanggo ngowahi subtitle saka .ass utawa .vtt dadi srt.", + "progress_str": "⏳ Ngolah panjalukmu..", + "convert_str": "⏳ Ngonversi...", + "unauth_cb": "⚠️ Akses Ditolak!", + "cancel_btn": "❌ Rasido", + "invalid_cb": "⚠️ AJA Mbusak PESAN!", + "up_str": "Ngunggahaké berkas..", + "press_btn_msg": "Pencet tombol ing ngisor iki kanggo ngekstrak subtitle/audio. Mung ndhukung link langsung saiki.\nDiproses ing {timelog}", + "fail_extr_media": "Media ekstrak sing gagal, priksa manawa pranala sampeyan ora direksa WAF utawa ora bisa diakses kanggo bot.", + "fail_extr_sub": "Gagal ekstrak sub, Mungkin format ora didhukung..\n\nLink: {link}\nERR: {e}", + "capt_extr_sub": "Jeneng berkas: {nf}\n\nDiekstrak saka @{bot} ing {timelog}", + "capt_conv_sub": "{nf}.srt\n\nDiowahi dening @{bot}" +} diff --git a/locales/id-JW/mediainfo.json b/locales/id-JW/mediainfo.json new file mode 100644 index 00000000..00372a45 --- /dev/null +++ b/locales/id-JW/mediainfo.json @@ -0,0 +1,11 @@ +{ + "processing_text": "`Pengolahan, wektu total adhedhasar ukuran berkas panjenengan...`", + "wait_msg": "`Tulung enteni sedhela...`", + "err_link": "Kayak'e pranala sing dikirim ora valid, priksa link langsung lan bisa diundhuh.", + "media_invalid": "Mangga mbales media sing bener.", + "dl_limit_exceeded": "Nuwun sewu, download diwatesi 2GB kanggo nyuda flood. Sampeyan bisa ngowahi file dadi link.", + "dl_args_text": "Nyoba ngundhuh..", + "mediainfo_help": "Gunakake printah /{cmd} [link], utawa bales media telegram nganggo /{cmd}.", + "capt_media": "ℹ️ Hasil mediainfo sampeyan..\n\n**Panjalukan Saka:** {ment}", + "viweb": "💬 Bukak Web" +} \ No newline at end of file diff --git a/locales/id-JW/nightmodev2.json b/locales/id-JW/nightmodev2.json new file mode 100644 index 00000000..273e1307 --- /dev/null +++ b/locales/id-JW/nightmodev2.json @@ -0,0 +1,17 @@ +{ + "nmd_disabled": "Mode wengi dipateni.", + "nmd_not_enabled": "Mode wengi ora diaktifake ing obrolan iki.", + "invalid_time_format": "Format wektu ora valid. Gunakake format HH:MM.", + "invalid_lockdur": "Suwene wektu ora bener. Gunakake format sing bener.\nConto: 6h (6 jam), 10m kanggo 10 menit.", + "schedule_already_on": "Wis ana jadwal ing obrolan iki. Pateni nganggo gendéra `-d`.", + "nmd_enable_success": "Kasil ngaktifake mode wengi ing obrolan iki.\nGrup bakal dikunci ing {st} lan bakal dibukak sawise {lockdur} saben dina.", + "nmd_cb": "🔖 Hai, Aku {bname} digawe nganggo Framework Pyrogram v{ver} lan Python v{pyver}.\n\nMau gawe bot kaya iki? Yuuk belajar di @botindonesia\nOwner: @YasirArisM", + "nmd_off_not_admin": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`, amarga {bname} dudu admin ing chat `{chat_id}`", + "nmd_off_not_present": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`, amarga {bname} ora ana ing chat `{chat_id}`. Dibusak grup saka dhaptar.", + "nmd_off_err": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`\nERROR: `{e}`", + "nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀️ Grup dibukak.\nBakal ditutup jam {close_at}", + "nmd_on_not_admin": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`, amarga {bname} dudu admin ing chat `{chat_id}`", + "nmd_on_not_present": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`, amarga {bname} ora ana ing obrolan `{chat_id}`. Grup dibusak saka dhaptar.", + "nmd_on_err": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`\nERROR: `{e}`", + "nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Grup ditutup.\nBakal dibukak ing {open_at}" +} \ No newline at end of file diff --git a/locales/id-JW/ocr.json b/locales/id-JW/ocr.json new file mode 100644 index 00000000..e083aa8c --- /dev/null +++ b/locales/id-JW/ocr.json @@ -0,0 +1,6 @@ +{ + "no_photo": "Bales foto nganggo printah /{cmd} kanggo mindhai teks saka gambar.", + "read_ocr": "Mindai gambar sampeyan..", + "result_ocr": "Hasil OCR:\n{result}", + "ocr_helper": "/ocr [reply to photo] - Waca Teks Saka Gambar" +} \ No newline at end of file diff --git a/locales/id-JW/sangmata.json b/locales/id-JW/sangmata.json new file mode 100644 index 00000000..c40ea3dd --- /dev/null +++ b/locales/id-JW/sangmata.json @@ -0,0 +1,13 @@ +{ + "no_uname": "Ora Username", + "no_last_name": "Ora Ana Jeneng mburi", + "uname_change_msg": "✨ Username diganti saka {bef} ➡️ {aft}.\n", + "lastname_change_msg": "✨ Ganti jeneng mburi saka {bef} ➡️ {aft}.\n", + "firstname_change_msg": "✨ Ganti jeneng ngarep saka {bef} ➡️ {aft}.\n", + "set_sangmata_help": "Gunakake /{cmd} on, kanggo ngaktifake sangmata. Yen sampeyan pengin mateni, sampeyan bisa nggunakake parameter mati.", + "sangmata_already_on": "SangMata wis diaktifake ing grup sampeyan.", + "sangmata_enabled": "Sangmata diaktifake ing grup sampeyan.", + "sangmata_already_off": "SangMata wis dipateni ing grup sampeyan.", + "sangmata_disabled": "Sangmata dipateni ing grup sampeyan.", + "wrong_param": "Parameter sing ora dingerteni, gunakake mung parameter aktif/mati." +} \ No newline at end of file diff --git a/locales/id-JW/start_help.json b/locales/id-JW/start_help.json new file mode 100644 index 00000000..afc95879 --- /dev/null +++ b/locales/id-JW/start_help.json @@ -0,0 +1,11 @@ +{ + "newgroup_log": "#NewGroup\nGroup = {jdl}({id})\nJumlah Anggota = {c}", + "newuser_log": "#NewUser\nID - {id}\nJeneng - {nm}", + "help_name": "Iki bantuan kanggo **{mod}**:\n", + "help_txt": "Halo {kamuh}, jenengku {bot}.\nAku bot pyrogram sing dikembangake dening pemilik apik karo sawetara fitur migunani.\nSampeyan bisa ndeleng kanthi ngeklik tombol ing ngisor iki.\n\nPrentah umum yaiku :\n - /start: Miwiti bot\n - /help: Wenehi pesen iki\n - /setlang: Ganti basa bot [BETA]", + "click_me": "Klik Aku", + "back_btn": "Mbalik", + "click_btn": "Klik tombol ing ngisor iki kanggo njaluk bantuan babagan {nm}", + "pm_detail": "PM Aku Kanggo Rincian Liyane.", + "start_msg": "Halo {kamuh}, PM aku kanggo ngerti kabeh fiturku. Sampeyan bisa ngganti basa bot ing bot nggunakake perintah /setlang nanging isih ing tahap beta." +} \ No newline at end of file diff --git a/locales/id-JW/stickers.json b/locales/id-JW/stickers.json new file mode 100644 index 00000000..19e38a7e --- /dev/null +++ b/locales/id-JW/stickers.json @@ -0,0 +1,19 @@ +{ + "no_anim_stick": "Stiker animasi ora didhukung!", + "not_sticker": "Iki dudu stiker!", + "unkang_msg": "Nyoba nyopot saka pack..", + "unkang_success": "Stiker wis dibusak saka pack panjenengan", + "unkang_error": "Gagal mbusak stiker saka paket sampeyan.\n\nERR: {e}", + "unkang_help": "Mangga wangsulana stiker sing digawe {c} kanggo mbusak stiker saka paket sampeyan.", + "anon_warn": "Sampeyan anon admin, kang stiker ing pmku.", + "kang_msg": "Nyolong stiker sampeyan...", + "stick_no_name": "Stiker ora ana jeneng.", + "kang_help": "Arep tak tebak stikere? Mangga tag stiker.", + "exist_pack": "Nganggo paket stiker sing ana...", + "new_packs": "Nggawe pak stiker anyar...", + "please_start_msg": "Koyone sampeyan ora tau sesambungan karo aku ing obrolan pribadi, sampeyan kudu nglakoni dhisik..", + "click_me": "Klik Aku", + "pack_full": "Paket Stiker sampeyan kebak yen paket sampeyan ora ana ing tipe v1 /kang 1, yen ora ana ing Tipe v2 /kang 2 lan sapiturute.", + "viewpack": "👀 Deleng Paket", + "kang_success": "Stiker kasil dicolong!\nEmoji: {emot}" +} \ No newline at end of file diff --git a/locales/id-JW/web_scraper.json b/locales/id-JW/web_scraper.json new file mode 100644 index 00000000..741b8894 --- /dev/null +++ b/locales/id-JW/web_scraper.json @@ -0,0 +1,20 @@ +{ + "no_result": "Nuwun sewu, kula mboten nemu kasil!", + "no_result_w_query": "Nuwun sewu, kula mboten saged manggihaken pitakon: {kueri}", + "get_data": "⏳ Mangga dienteni, lagi njupuk data saka web..", + "cl_btn": "❌ Tutup", + "back_btn": "↩️ Mbalik", + "dl_text": "⬇️ Unduh", + "cat_text": "💠 Kategori", + "kualitas": "Kwalitas", + "ex_data": "👇 Ekstrak Data ", + "unauth": "Tombol iki dudu kanggo sampeyan..", + "invalid_cb": "Data callback ora valid, kirim printah maneh..", + "res_scrape": "Asil scrape saka {link}:\n\n{kl}", + "header_with_query": "Asil Nggoleki #{web} Kanggo: {kueri}\n\n", + "header_no_query": "#{web} Paling anyar:\n🌀 Gunakake /{cmd} [judhul] kanggo miwiti nggoleki kanthi judhul.\n\n", + "invalid_cmd_scrape": "Gunakake prentah /{cmd} [link] kanggo ngunduh pranala kethokan", + "err_getweb": "ERROR: Gagal njupuk data saka web amarga {err}.", + "err_getapi": "ERROR: Gagal njupuk data saka API", + "unsupport_dl_btn": "Sawetara asil ora bakal katon ing tombol ekstrak amarga pranala ora didhukung." +} \ No newline at end of file diff --git a/locales/id-JW/webss.json b/locales/id-JW/webss.json new file mode 100644 index 00000000..0fe23ca1 --- /dev/null +++ b/locales/id-JW/webss.json @@ -0,0 +1,6 @@ +{ + "no_url": "Wenehana url kanggo njupuk screenshot.", + "wait_str": "Lagi njupuk gambar layar...", + "str_credit": "🌞 Screenshot digawe nganggo Puppeteer", + "ss_failed_str": "Gagal njupuk gambar. ERROR: {err}" +} \ No newline at end of file diff --git a/locales/id-JW/ytdl_plugins.json b/locales/id-JW/ytdl_plugins.json new file mode 100644 index 00000000..9b630867 --- /dev/null +++ b/locales/id-JW/ytdl_plugins.json @@ -0,0 +1,14 @@ +{ + "no_channel": "Fitur iki ora didhukung kanggo channel utawa pangguna anonim.", + "no_query": "Mangga lebokna url sing kepengen mbok unduh..!", + "no_res": "Ora ana asil kanggo `{kweri}`", + "dl_btn": "Ngunduh", + "back": "Mbalik", + "yts_msg": "Diterbitake {pub}\n\n❯ Duration: {dur}\n❯ Ndeleng: {vi}\n❯ Uploader: {cname}\n\n", + "invalid_link": "Mangga lebokna URL Dhukungan YT-DLP sing valid", + "err_parse": "Gagal ngurai URL, mriksa log..", + "ngenteni": "Tulung ngenteni..", + "unauth": "Ora Tugasmu..", + "endlist": "Iku pungkasan dhaptar", + "vip-btn": "Amarga sawetara pangguna penyalahgunaan, video paling apik saiki mung sing nduwe bot iki." +} \ No newline at end of file diff --git a/misskaty/__init__.py b/misskaty/__init__.py new file mode 100644 index 00000000..53852a03 --- /dev/null +++ b/misskaty/__init__.py @@ -0,0 +1,79 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import time +from logging import ERROR, INFO, StreamHandler, basicConfig, getLogger, handlers + +from apscheduler.jobstores.mongodb import MongoDBJobStore +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from async_pymongo import AsyncClient +from pymongo import MongoClient +from pyrogram import Client + +from misskaty.core import misskaty_patch +from misskaty.vars import ( + API_HASH, + API_ID, + BOT_TOKEN, + DATABASE_NAME, + DATABASE_URI, + TZ, + USER_SESSION, +) + +basicConfig( + level=INFO, + format="[%(asctime)s - %(levelname)s] - %(name)s.%(funcName)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[ + handlers.RotatingFileHandler("MissKatyLogs.txt", mode="w+", maxBytes=1000000), + StreamHandler(), + ], +) +getLogger("pyrogram").setLevel(ERROR) +getLogger("openai").setLevel(ERROR) +getLogger("httpx").setLevel(ERROR) + +MOD_LOAD = [] +MOD_NOLOAD = ["subscene_dl"] +HELPABLE = {} +cleanmode = {} +botStartTime = time.time() +misskaty_version = "v2.10.13 - Stable" + +# Pyrogram Bot Client +app = Client( + "MissKatyBot", + api_id=API_ID, + api_hash=API_HASH, + bot_token=BOT_TOKEN, + mongodb=dict(connection=AsyncClient(DATABASE_URI), remove_peers=False), +) + +# Pyrogram UserBot Client +user = Client( + "YasirUBot", + session_string=USER_SESSION, +) + +jobstores = { + "default": MongoDBJobStore( + client=MongoClient(DATABASE_URI), database=DATABASE_NAME, collection="nightmode" + ) +} +scheduler = AsyncIOScheduler(jobstores=jobstores, timezone=TZ) + +app.start() +BOT_ID = app.me.id +BOT_NAME = app.me.first_name +BOT_USERNAME = app.me.username +if USER_SESSION: + user.start() + UBOT_ID = user.me.id + UBOT_NAME = user.me.first_name + UBOT_USERNAME = user.me.username +else: + UBOT_ID = None + UBOT_NAME = None + UBOT_USERNAME = None diff --git a/misskaty/__main__.py b/misskaty/__main__.py new file mode 100644 index 00000000..f174e681 --- /dev/null +++ b/misskaty/__main__.py @@ -0,0 +1,97 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved + """ +import asyncio +import importlib +import os +import pickle +import traceback +from logging import getLogger + +from pyrogram import __version__, idle +from pyrogram.raw.all import layer + +from database import dbname +from misskaty import BOT_NAME, BOT_USERNAME, HELPABLE, UBOT_NAME, app, scheduler +from misskaty.plugins import ALL_MODULES +from misskaty.plugins.web_scraper import web +from misskaty.vars import SUDO, USER_SESSION +from utils import auto_clean + +LOGGER = getLogger(__name__) +loop = asyncio.get_event_loop() + + +# Run Bot +async def start_bot(): + for module in ALL_MODULES: + imported_module = importlib.import_module(f"misskaty.plugins.{module}") + if hasattr(imported_module, "__MODULE__") and imported_module.__MODULE__: + imported_module.__MODULE__ = imported_module.__MODULE__ + if hasattr(imported_module, "__HELP__") and imported_module.__HELP__: + HELPABLE[imported_module.__MODULE__.lower()] = imported_module + bot_modules = "" + j = 1 + for i in ALL_MODULES: + if j == 4: + bot_modules += "|{:<15}|\n".format(i) + j = 0 + else: + bot_modules += "|{:<15}".format(i) + j += 1 + LOGGER.info("+===============================================================+") + LOGGER.info("| MissKatyPyro |") + LOGGER.info("+===============+===============+===============+===============+") + LOGGER.info(bot_modules) + LOGGER.info("+===============+===============+===============+===============+") + LOGGER.info("[INFO]: BOT STARTED AS @%s!", BOT_USERNAME) + + try: + LOGGER.info("[INFO]: SENDING ONLINE STATUS") + for i in SUDO: + if USER_SESSION: + await app.send_message( + i, + f"USERBOT AND BOT STARTED with Pyrogram v{__version__}..\nUserBot: {UBOT_NAME}\nBot: {BOT_NAME}\n\nwith Pyrogram v{__version__} (Layer {layer}) started on @{BOT_USERNAME}.\n\n{bot_modules}", + ) + else: + await app.send_message( + i, + f"BOT STARTED with Pyrogram v{__version__} as {BOT_NAME}\n\nwith Pyrogram v{__version__} (Layer {layer}) started on @{BOT_USERNAME}.\n\n{bot_modules}", + ) + except Exception as e: + LOGGER.error(str(e)) + scheduler.start() + if "web" not in await dbname.list_collection_names(): + webdb = dbname.web + for key, value in web.items(): + await webdb.insert_one({key: value}) + if os.path.exists("restart.pickle"): + with open("restart.pickle", "rb") as status: + chat_id, message_id = pickle.load(status) + os.remove("restart.pickle") + await app.edit_message_text( + chat_id=chat_id, + message_id=message_id, + text="Bot restarted successfully!", + ) + asyncio.create_task(auto_clean()) + await idle() + + +if __name__ == "__main__": + try: + loop.run_until_complete(start_bot()) + except KeyboardInterrupt: + pass + except Exception: + err = traceback.format_exc() + LOGGER.info(err) + finally: + loop.stop() + LOGGER.info( + "------------------------ Stopped Services ------------------------" + ) diff --git a/misskaty/core/decorator/__init__.py b/misskaty/core/decorator/__init__.py new file mode 100644 index 00000000..852264de --- /dev/null +++ b/misskaty/core/decorator/__init__.py @@ -0,0 +1,13 @@ +from .errors import capture_err +from .misc import asyncify, new_task +from .permissions import adminsOnly, require_admin +from .ratelimiter import ratelimiter + +__all__ = [ + "capture_err", + "asyncify", + "new_task", + "adminsOnly", + "require_admin", + "ratelimiter", +] diff --git a/misskaty/core/decorator/errors.py b/misskaty/core/decorator/errors.py new file mode 100644 index 00000000..9a587841 --- /dev/null +++ b/misskaty/core/decorator/errors.py @@ -0,0 +1,55 @@ +import os +import traceback +from datetime import datetime +from functools import wraps + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden +from pyrogram.types import CallbackQuery + +from misskaty.vars import LOG_CHANNEL + + +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + if isinstance(message, CallbackQuery): + sender = message.message.reply + chat = message.message.chat + msg = message.message.text or message.message.caption + else: + sender = message.reply + chat = message.chat + msg = message.text or message.caption + try: + return await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + return await client.leave_chat(message.chat.id) + except Exception as err: + exc = traceback.format_exc() + error_feedback = "ERROR | {} | {}\n\n{}\n\n{}\n".format( + message.from_user.id if message.from_user else 0, + chat.id if chat else 0, + msg, + exc, + ) + day = datetime.now() + tgl_now = datetime.now() + + cap_day = f"{day.strftime('%A')}, {tgl_now.strftime('%d %B %Y %H:%M:%S')}" + await sender( + "😭 An Internal Error Occurred while processing your Command, the Logs have been sent to the Owners of this Bot. Sorry for Inconvenience..." + ) + with open( + f"crash_{tgl_now.strftime('%d %B %Y')}.txt", "w+", encoding="utf-8" + ) as log: + log.write(error_feedback) + log.close() + await client.send_document( + LOG_CHANNEL, + f"crash_{tgl_now.strftime('%d %B %Y')}.txt", + caption=f"Crash Report of this Bot\n{cap_day}", + ) + os.remove(f"crash_{tgl_now.strftime('%d %B %Y')}.txt") + raise err + + return capture diff --git a/misskaty/core/decorator/misc.py b/misskaty/core/decorator/misc.py new file mode 100644 index 00000000..12e4be50 --- /dev/null +++ b/misskaty/core/decorator/misc.py @@ -0,0 +1,28 @@ +import asyncio +import logging +from functools import wraps + +LOGGER = logging.getLogger(__name__) + + +def asyncify(func): + async def inner(*args, **kwargs): + loop = asyncio.get_running_loop() + func_out = await loop.run_in_executor(None, func, *args, **kwargs) + return func_out + + return inner + + +def new_task(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + loop = asyncio.get_running_loop() + return loop.create_task(func(*args, **kwargs)) + except Exception as e: + LOGGER.error( + f"Failed to create task for {func.__name__} : {e}" + ) # skipcq: PYL-E0602 + + return wrapper diff --git a/misskaty/core/decorator/permissions.py b/misskaty/core/decorator/permissions.py new file mode 100644 index 00000000..87718924 --- /dev/null +++ b/misskaty/core/decorator/permissions.py @@ -0,0 +1,221 @@ +from functools import partial, wraps +from time import time +from traceback import format_exc as err +from typing import Optional, Union + +from pyrogram import Client, enums +from pyrogram.errors import ChannelPrivate, ChatAdminRequired, ChatWriteForbidden +from pyrogram.types import CallbackQuery, Message + +from misskaty import app +from misskaty.helper import Cache +from misskaty.vars import SUDO + +from ...helper.localization import ( + default_language, + get_lang, + get_locale_string, + langdict, +) + + +async def member_permissions(chat_id: int, user_id: int, client): + perms = [] + try: + member = (await client.get_chat_member(chat_id, user_id)).privileges + if member.can_post_messages: + perms.append("can_post_messages") + if member.can_edit_messages: + perms.append("can_edit_messages") + if member.can_delete_messages: + perms.append("can_delete_messages") + if member.can_restrict_members: + perms.append("can_restrict_members") + if member.can_promote_members: + perms.append("can_promote_members") + if member.can_change_info: + perms.append("can_change_info") + if member.can_invite_users: + perms.append("can_invite_users") + if member.can_pin_messages: + perms.append("can_pin_messages") + if member.can_manage_video_chats: + perms.append("can_manage_video_chats") + return perms + except: + return [] + + +async def check_perms( + message: Union[CallbackQuery, Message], + permissions: Optional[Union[list, str]], + complain_missing_perms: bool, + strings, +) -> bool: + if isinstance(message, CallbackQuery): + sender = partial(message.answer, show_alert=True) + chat = message.message.chat + else: + sender = message.reply_text + chat = message.chat + if not message.from_user: + return bool(message.sender_chat and message.sender_chat.id == message.chat.id) + try: + user = await chat.get_member(message.from_user.id) + except ChatAdminRequired: + return False + if user.status == enums.ChatMemberStatus.OWNER: + return True + + # No permissions specified, accept being an admin. + if not permissions and user.status == enums.ChatMemberStatus.ADMINISTRATOR: + return True + if user.status != enums.ChatMemberStatus.ADMINISTRATOR: + if complain_missing_perms: + await sender(strings("no_admin_error")) + return False + + if isinstance(permissions, str): + permissions = [permissions] + + missing_perms = [ + permission + for permission in permissions + if not getattr(user.privileges, permission) + ] + + if not missing_perms: + return True + if complain_missing_perms: + await sender( + strings("no_permission_error").format(permissions=", ".join(missing_perms)) + ) + return False + + +admins_in_chat = Cache(filename="admin_cache.db", path="cache", in_memory=False) + + +async def list_admins(chat_id: int): + if chat_id in admins_in_chat: + interval = time() - admins_in_chat[chat_id]["last_updated_at"] + if interval < 3600: + return admins_in_chat[chat_id]["data"] + + try: + admins_in_chat.add( + chat_id, + { + "last_updated_at": time(), + "data": [ + member.user.id + async for member in app.get_chat_members( + chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ], + }, + timeout=6 * 60 * 60, + ) + return admins_in_chat[chat_id]["data"] + except ChannelPrivate: + return + + +async def authorised(func, subFunc2, client, message, *args, **kwargs): + try: + await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await message.chat.leave() + except Exception as e: + try: + await message.reply_text(str(e.MESSAGE)) + except AttributeError: + await message.reply_text(str(e)) + e = err() + print(e) + return subFunc2 + + +async def unauthorised(message: Message, permission, subFunc2): + text = f"You don't have the required permission to perform this action.\n**Permission:** __{permission}__" + try: + await message.reply_text(text) + except ChatWriteForbidden: + await message.chat.leave() + return subFunc2 + + +def adminsOnly(permission): + def subFunc(func): + @wraps(func) + async def subFunc2(client, message: Message, *args, **kwargs): + chatID = message.chat.id + if not message.from_user: + # For anonymous admins + if message.sender_chat and message.sender_chat.id == message.chat.id: + return await authorised( + func, + subFunc2, + client, + message, + *args, + **kwargs, + ) + return await unauthorised(message, permission, subFunc2) + # For admins and sudo users + userID = message.from_user.id + permissions = await member_permissions(chatID, userID, client) + if userID not in SUDO and permission not in permissions: + return await unauthorised(message, permission, subFunc2) + return await authorised(func, subFunc2, client, message, *args, **kwargs) + + return subFunc2 + + return subFunc + + +def require_admin( + permissions: Union[list, str] = None, + allow_in_private: bool = False, + complain_missing_perms: bool = True, +): + def decorator(func): + @wraps(func) + async def wrapper( + client: Client, message: Union[CallbackQuery, Message], *args, **kwargs + ): + lang = await get_lang(message) + strings = partial( + get_locale_string, + langdict[lang].get("admin", langdict[default_language]["admin"]), + lang, + "admin", + ) + + if isinstance(message, CallbackQuery): + sender = partial(message.answer, show_alert=True) + msg = message.message + elif isinstance(message, Message): + sender = message.reply_text + msg = message + else: + raise NotImplementedError( + f"require_admin can't process updates with the type '{message.__name__}' yet." + ) + + # We don't actually check private and channel chats. + if msg.chat.type == enums.ChatType.PRIVATE: + if allow_in_private: + return await func(client, message, *args, *kwargs) + return await sender(strings("private_not_allowed")) + if msg.chat.type == enums.ChatType.CHANNEL: + return await func(client, message, *args, *kwargs) + has_perms = await check_perms( + message, permissions, complain_missing_perms, strings + ) + if has_perms: + return await func(client, message, *args, *kwargs) + + return wrapper + + return decorator diff --git a/misskaty/core/decorator/ratelimiter.py b/misskaty/core/decorator/ratelimiter.py new file mode 100644 index 00000000..bc1e69ab --- /dev/null +++ b/misskaty/core/decorator/ratelimiter.py @@ -0,0 +1,48 @@ +from functools import wraps +from typing import Callable, Union + +from cachetools import TTLCache +from pyrogram import Client +from pyrogram.errors import QueryIdInvalid +from pyrogram.types import CallbackQuery, Message + +from ..ratelimiter_func import RateLimiter + +ratelimit = RateLimiter() +# storing spammy user in cache for 1minute before allowing them to use commands again. +warned_users = TTLCache(maxsize=128, ttl=60) +warning_message = "Spam detected! ignoring your all requests for few minutes." + + +def ratelimiter(func: Callable) -> Callable: + """ + Restricts user's from spamming commands or pressing buttons multiple times + using leaky bucket algorithm and pyrate_limiter. + """ + + @wraps(func) + async def decorator(client: Client, update: Union[Message, CallbackQuery]): + userid = update.from_user.id if update.from_user else update.sender_chat.id + is_limited = await ratelimit.acquire(userid) + + if is_limited and userid not in warned_users: + if isinstance(update, Message): + await update.reply_text(warning_message) + warned_users[userid] = 1 + return + + elif isinstance(update, CallbackQuery): + try: + await update.answer(warning_message, show_alert=True) + except QueryIdInvalid: + warned_users[userid] = 1 + return + warned_users[userid] = 1 + return + + elif is_limited and userid in warned_users: + pass + else: + return await func(client, update) + + return decorator diff --git a/misskaty/core/keyboard.py b/misskaty/core/keyboard.py new file mode 100644 index 00000000..e80a1cc6 --- /dev/null +++ b/misskaty/core/keyboard.py @@ -0,0 +1,31 @@ +from pykeyboard import InlineKeyboard +from pyrogram.types import InlineKeyboardButton as Ikb + +from misskaty.helper.functions import get_urls_from_text as is_url + + +def keyboard(buttons_list, row_width: int = 2): + """ + Buttons builder, pass buttons in a list and it will + return pyrogram.types.IKB object + Ex: keyboard([["click here", "https://google.com"]]) + if theres, a url, it will make url button, else callback button + """ + buttons = InlineKeyboard(row_width=row_width) + data = [ + Ikb(text=str(i[0]), url=str(i[1])) + if is_url(i[1]) + else Ikb(text=str(i[0]), callback_data=str(i[1])) + for i in buttons_list + ] + + buttons.add(*data) + return buttons + + +def ikb(data: dict, row_width: int = 2): + """ + Converts a dict to pyrogram buttons + Ex: dict_to_keyboard({"click here": "this is callback data"}) + """ + return keyboard(data.items(), row_width=row_width) diff --git a/misskaty/core/misskaty_patch/__init__.py b/misskaty/core/misskaty_patch/__init__.py new file mode 100644 index 00000000..26a3e98a --- /dev/null +++ b/misskaty/core/misskaty_patch/__init__.py @@ -0,0 +1 @@ +from . import bound, decorators, listen, methods diff --git a/misskaty/core/misskaty_patch/bound/__init__.py b/misskaty/core/misskaty_patch/bound/__init__.py new file mode 100644 index 00000000..416f4b66 --- /dev/null +++ b/misskaty/core/misskaty_patch/bound/__init__.py @@ -0,0 +1,2 @@ +# skipcq +from .message import Message diff --git a/misskaty/core/misskaty_patch/bound/message.py b/misskaty/core/misskaty_patch/bound/message.py new file mode 100644 index 00000000..b21bc12d --- /dev/null +++ b/misskaty/core/misskaty_patch/bound/message.py @@ -0,0 +1,324 @@ +import html +import io +from asyncio import get_event_loop +from asyncio import sleep as asleep +from logging import getLogger +from typing import Union + +from pyrogram.errors import ( + ChatAdminRequired, + ChatWriteForbidden, + FloodWait, + MessageAuthorRequired, + MessageDeleteForbidden, + MessageIdInvalid, + MessageNotModified, + MessageTooLong, + TopicClosed, + ChatSendPlainForbidden +) +from pyrogram.types import Message + +LOGGER = getLogger(__name__) + +Message.input = property( + lambda m: m.text[m.text.find(m.command[0]) + len(m.command[0]) + 1 :] + if len(m.command) > 1 + else None +) + + +async def reply_text( + self: Message, text: str, as_raw: bool = False, del_in: int = 0, *args, **kwargs +) -> Union["Message", bool]: + """\nExample: + message.reply_msg("hello") + Parameters: + text (``str``): + Text of the message to be sent. + del_in (``int``): + Time in Seconds for delete that message. + quote (``bool``, *optional*): + If ``True``, the message will be sent as + a reply to this message. + If *reply_to_message_id* is passed, + this parameter will be ignored. + Defaults to ``True`` in group chats + and ``False`` in private chats. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using both + Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable + Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + disable_notification (``bool``, *optional*): + Sends the message silently. + Users will receive a notification with no sound. + reply_to_message_id (``int``, *optional*): + If the message is a reply, ID of the original message. + schedule_date (:py:obj:`~datetime.datetime`, *optional*): + Date when the message will be automatically sent. Unix time. + protect_content (``bool``, *optional*): + Protects the contents of the sent message from forwarding and saving. + reply_markup (:obj:`InlineKeyboardMarkup` + | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` + | :obj:`ForceReply`, *optional*): + Additional interface options. An object for an inline keyboard, + custom reply keyboard, + instructions to remove reply keyboard or to + force a reply from the user. + Returns: + On success, the sent Message or True is returned. + Raises: + RPCError: In case of a Telegram RPC error. + """ + try: + if as_raw: + msg = await self.reply_text( + text=f"{html.escape(text.html)}", *args, **kwargs + ) + else: + msg = await self.reply_text(text=text, *args, **kwargs) + if del_in == 0: + return msg + await asleep(del_in) + return bool(await msg.delete_msg()) + except FloodWait as e: + await asleep(e.value) + return await reply_text(self, text, *args, **kwargs) + except TopicClosed: + return + except (ChatWriteForbidden, ChatAdminRequired, ChatSendPlainForbidden): + LOGGER.info( + f"Leaving from {self.chat.title} [{self.chat.id}] because doesn't have enough permission." + ) + return await self.chat.leave() + + +async def edit_text( + self, text: str, del_in: int = 0, *args, **kwargs +) -> Union["Message", bool]: + """\nExample: + message.edit_msg("hello") + Parameters: + text (``str``): + New text of the message. + del_in (``int``): + Time in Seconds for delete that message. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using + both Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable + Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + reply_markup (:obj:`InlineKeyboardMarkup`, *optional*): + An InlineKeyboardMarkup object. + Returns: + On success, the edited + :obj:`Message` or True is returned. + Raises: + RPCError: In case of a Telegram RPC error. + """ + try: + msg = await self.edit_text(text, *args, **kwargs) + if del_in == 0: + return msg + await asleep(del_in) + return bool(await msg.delete_msg()) + except FloodWait as e: + LOGGER.warning(str(e)) + await asleep(e.value) + return await edit_text(self, text, *args, **kwargs) + except MessageNotModified: + return False + except (ChatWriteForbidden, ChatAdminRequired): + LOGGER.info( + f"Leaving from {self.chat.title} [{self.chat.id}] because doesn't have admin permission." + ) + return await self.chat.leave() + except (MessageAuthorRequired, MessageIdInvalid): + return await reply_text(self, text=text, *args, **kwargs) + + +async def edit_or_send_as_file( + self, text: str, del_in: int = 0, as_raw: bool = False, *args, **kwargs +) -> Union["Message", bool]: + """\nThis will first try to message.edit. + If it raises MessageTooLong error, + run message.send_as_file. + Example: + message.edit_or_send_as_file("some huge text") + Parameters: + text (``str``): + New text of the message. + del_in (``int``): + Time in Seconds for delete that message. + log (``bool`` | ``str``, *optional*): + If ``True``, the message will be forwarded + to the log channel. + If ``str``, the logger name will be updated. + sudo (``bool``, *optional*): + If ``True``, sudo users supported. + as_raw (``bool``, *optional*): + If ``False``, the message will be escaped with current parse mode. + default to ``False``. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using both + Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable + Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + reply_markup (:obj:`InlineKeyboardMarkup`, *optional*): + An InlineKeyboardMarkup object. + **kwargs (for message.send_as_file) + Returns: + On success, the edited + :obj:`Message` or True is returned. + Raises: + RPCError: In case of a Telegram RPC error. + """ + text = html.escape(text.html) if as_raw else text + try: + msg = await edit_text(self, text=text, *args, **kwargs) + if del_in == 0: + return msg + await asleep(del_in) + return bool(await msg.delete_msg()) + except (MessageTooLong, OSError): + return await reply_as_file(self, text=text, *args, **kwargs) + + +async def reply_or_send_as_file( + self, text: str, as_raw: bool = False, del_in: int = 0, *args, **kwargs +) -> Union["Message", bool]: + """\nThis will first try to message.reply. + If it raise MessageTooLong error, + run message.send_as_file. + Example: + message.reply_or_send_as_file("some huge text") + Parameters: + text (``str``): + Text of the message to be sent. + del_in (``int``): + Time in Seconds for delete that message. + quote (``bool``, *optional*): + If ``True``, the message will be sent + as a reply to this message. + If *reply_to_message_id* is passed, + this parameter will be ignored. + Defaults to ``True`` in group chats + and ``False`` in private chats. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using + both Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable + Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + disable_notification (``bool``, *optional*): + Sends the message silently. + Users will receive a notification with no sound. + reply_to_message_id (``int``, *optional*): + If the message is a reply, ID of the + original message. + reply_markup (:obj:`InlineKeyboardMarkup` + | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` + | :obj:`ForceReply`, *optional*): + Additional interface options. An object for an + inline keyboard, custom reply keyboard, + instructions to remove reply keyboard + or to force a reply from the user. + **kwargs (for message.send_as_file) + Returns: + On success, the sent Message or True is returned. + Raises: + RPCError: In case of a Telegram RPC error. + """ + text = html.escape(text.html) if as_raw else text + try: + return await reply_text(self, text=text, del_in=del_in, *args, **kwargs) + except MessageTooLong: + return await reply_as_file(self, text=text, **kwargs) + + +async def reply_as_file( + self, + text: str, + filename: str = "output.txt", + caption: str = "", + delete_message: bool = True, +): + """\nYou can send large outputs as file + Example: + message.reply_as_file(text="hello") + Parameters: + text (``str``): + Text of the message to be sent. + filename (``str``, *optional*): + file_name for output file. + caption (``str``, *optional*): + caption for output file. + delete_message (``bool``, *optional*): + If ``True``, the message will be deleted + after sending the file. + Returns: + On success, the sent Message is returned. + """ + reply_to_id = self.reply_to_message.id if self.reply_to_message else self.id + if delete_message: + get_event_loop().create_task(self.delete()) + doc = io.BytesIO(text.encode()) + doc.name = filename + return await self.reply_document( + document=doc, + caption=caption[:1024], + disable_notification=True, + reply_to_message_id=reply_to_id, + ) + + +async def delete(self, revoke: bool = True) -> bool: + """\nThis will first try to delete and ignore + it if it raises MessageDeleteForbidden + Parameters: + revoke (``bool``, *optional*): + Deletes messages on both parts. + This is only for private cloud chats and normal groups, messages on + channels and supergroups are always revoked (i.e.: deleted for everyone). + Defaults to True. + Returns: + True on success, False otherwise. + """ + try: + return bool(await self.delete(revoke=revoke)) + except FloodWait as e: + LOGGER.warning(str(e)) + await asleep(e.value) + return await delete(self, revoke) + except MessageDeleteForbidden: + return False + except Exception as e: + LOGGER.warning(str(e)) + + +Message.reply_msg = reply_text +Message.edit_msg = edit_text +Message.edit_or_send_as_file = edit_or_send_as_file +Message.reply_or_send_as_file = reply_or_send_as_file +Message.reply_as_file = reply_as_file +Message.delete_msg = delete diff --git a/misskaty/core/misskaty_patch/decorators/__init__.py b/misskaty/core/misskaty_patch/decorators/__init__.py new file mode 100644 index 00000000..a676061f --- /dev/null +++ b/misskaty/core/misskaty_patch/decorators/__init__.py @@ -0,0 +1,5 @@ +from .adminsOnly import adminsOnly +from .callback import callback +from .command import command + +__all__ = ["callback", "command", "adminsOnly"] diff --git a/misskaty/core/misskaty_patch/decorators/adminsOnly.py b/misskaty/core/misskaty_patch/decorators/adminsOnly.py new file mode 100644 index 00000000..02360502 --- /dev/null +++ b/misskaty/core/misskaty_patch/decorators/adminsOnly.py @@ -0,0 +1,199 @@ +# tgEasy - Easy for a brighter Shine. A monkey pather add-on for Pyrogram +# Copyright (C) 2021 - 2022 Jayant Hegde Kageri + +# This file is part of tgEasy. + +# tgEasy is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# tgEasy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with tgEasy. If not, see . + +import contextlib +import typing + +import pyrogram +from cachetools import TTLCache +from pyrogram.methods import Decorators + +from ..utils import check_rights, handle_error, is_admin + +ANON = TTLCache(maxsize=250, ttl=30) + + +async def anonymous_admin(m: pyrogram.types.Message): + """ + Helper function for Anonymous Admin Verification + """ + keyboard = pyrogram.types.InlineKeyboardMarkup( + [ + [ + pyrogram.types.InlineKeyboardButton( + text="Verify!", + callback_data=f"anon.{m.id}", + ), + ] + ] + ) + return await m.reply_text( + "Click here to prove you are admin with the required rights to perform this action!", + reply_markup=keyboard, + ) + + +async def anonymous_admin_verification( + self, CallbackQuery: pyrogram.types.CallbackQuery +): + if int( + f"{CallbackQuery.message.chat.id}{CallbackQuery.data.split('.')[1]}" + ) not in set(ANON.keys()): + try: + await CallbackQuery.message.edit_text("Button has been Expired.") + except pyrogram.types.RPCError: + with contextlib.suppress(pyrogram.types.RPCError): + await CallbackQuery.message.delete() + return + cb = ANON.pop( + int(f"{CallbackQuery.message.chat.id}{CallbackQuery.data.split('.')[1]}") + ) + member = await CallbackQuery.message.chat.get_member(CallbackQuery.from_user.id) + if member.status not in ( + pyrogram.enums.ChatMemberStatus.OWNER, + pyrogram.enums.ChatMemberStatus.ADMINISTRATOR, + ): + return await CallbackQuery.answer("You need to be an admin to do this.") + permission = cb[2] + + if isinstance(permission, str) and not await check_rights( + CallbackQuery.message.chat.id, + CallbackQuery.from_user.id, + permission, + client=self, + ): + return await CallbackQuery.message.edit_text( + f"You are Missing the following Rights to use this Command:\n{permission}", + ) + if isinstance(permission, list): + permissions = "" + for perm in permission: + if not await check_rights( + CallbackQuery.message.chat.id, + CallbackQuery.from_user.id, + perm, + client=self, + ): + permissions += f"\n{perm}" + if permissions != "": + return await CallbackQuery.message.edit_text( + f"You are Missing the following Rights to use this Command:{permissions}", + ) + try: + await CallbackQuery.message.delete() + await cb[1](self, cb[0]) + except pyrogram.errors.exceptions.forbidden_403.ChatAdminRequired: + return await CallbackQuery.message.edit_text( + "I must be admin to execute this Command", + ) + except BaseException as e: + return await handle_error(e, CallbackQuery) + + +def adminsOnly( + self, + permission: typing.Union[str, list], + TRUST_ANON_ADMINS: typing.Union[bool, bool] = False, +): + """ + # `tgEasy.tgClient.adminsOnly` + - A decorater for running the function only if the admin have the specified Rights. + - If the admin is Anonymous Admin, it also checks his rights by making a Callback. + - Parameters: + - permission (str): + - Permission which the User must have to use the Functions + + - TRUST_ANON_ADMIN (bool) **optional**: + - If the user is an Anonymous Admin, then it bypasses his right check. + + # Example + .. code-block:: python + from tgEasy import tgClient + import pyrogram + + app = tgClient(pyrogram.Client()) + + @app.command("start") + @app.adminsOnly("can_change_info") + async def start(client, message): + await message.reply_text(f"Hello Admin {message.from_user.mention}") + """ + + def wrapper(func): + async def decorator(client, message): + permissions = "" + if message.chat.type != pyrogram.enums.ChatType.SUPERGROUP: + return await message.reply_text( + "This command can be used in supergroups only.", + ) + if message.sender_chat and not TRUST_ANON_ADMINS: + ANON[int(f"{message.chat.id}{message.id}")] = ( + message, + func, + permission, + ) + return await anonymous_admin(message) + if not await is_admin( + message.chat.id, + message.from_user.id, + client=client, + ): + return await message.reply_text( + "Only admins can execute this Command!", + ) + if isinstance(permission, str) and not await check_rights( + message.chat.id, + message.from_user.id, + permission, + client=client, + ): + return await message.reply_text( + f"You are Missing the following Rights to use this Command:\n{permission}", + ) + if isinstance(permission, list): + for perm in permission: + if not await check_rights( + message.chat.id, + message.from_user.id, + perm, + client=client, + ): + permissions += f"\n{perm}" + if permissions != "": + return await message.reply_text( + f"You are Missing the following Rights to use this Command:{permissions}", + ) + try: + await func(client, message) + except pyrogram.errors.exceptions.forbidden_403.ChatWriteForbidden: + await client.leave_chat(message.chat.id) + except BaseException as exception: + await handle_error(exception, message) + + self.add_handler( + pyrogram.handlers.CallbackQueryHandler( + anonymous_admin_verification, + pyrogram.filters.regex("^anon."), + ), + ) + return decorator + + return wrapper + + +Decorators.adminsOnly = adminsOnly diff --git a/misskaty/core/misskaty_patch/decorators/callback.py b/misskaty/core/misskaty_patch/decorators/callback.py new file mode 100644 index 00000000..7f336c1d --- /dev/null +++ b/misskaty/core/misskaty_patch/decorators/callback.py @@ -0,0 +1,102 @@ +# tgEasy - Easy for a brighter Shine. A monkey pather add-on for Pyrogram +# Copyright (C) 2021 - 2022 Jayant Hegde Kageri + +# This file is part of tgEasy. + +# tgEasy is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# tgEasy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with tgEasy. If not, see . + +import typing + +import pyrogram +from pyrogram.methods import Decorators + +from ..utils import handle_error + + +def callback( + self, + data: typing.Union[str, list], + self_admin: typing.Union[bool, bool] = False, + filtercb: typing.Union[pyrogram.filters.Filter] = None, + *args, + **kwargs, +): + """ + ### `Client.callback` + + - A decorater to Register Callback Quiries in simple way and manage errors in that Function itself, alternative for `@pyrogram.Client.on_callback_query(pyrogram.filters.regex('^data.*'))` + - Parameters: + - data (str || list): + - The callback query to be handled for a function + + - self_admin (bool) **optional**: + - If True, the command will only executeed if the Bot is Admin in the Chat, By Default False + + - filter (`~pyrogram.filters`) **optional**: + - Pyrogram Filters, hope you know about this, for Advaced usage. Use `and` for seaperating filters. + + #### Example + .. code-block:: python + import pyrogram + + app = pyrogram.Client() + + @app.command("start") + async def start(client, message): + await message.reply_text( + f"Hello {message.from_user.mention}", + reply_markup=pyrogram.types.InlineKeyboardMarkup([[ + pyrogram.types.InlineKeyboardButton( + "Click Here", + "data" + ) + ]]) + ) + + @app.callback("data") + async def data(client, CallbackQuery): + await CallbackQuery.answer("Hello :)", show_alert=True) + """ + if filtercb: + filtercb = pyrogram.filters.regex(f"^{data}.*") & args["filter"] + else: + filtercb = pyrogram.filters.regex(f"^{data}.*") + + def wrapper(func): + async def decorator(client, CallbackQuery: pyrogram.types.CallbackQuery): + if self_admin: + me = await client.get_chat_member( + CallbackQuery.message.chat.id, (await client.get_me()).id + ) + if me.status not in ( + pyrogram.enums.ChatMemberStatus.OWNER, + pyrogram.enums.ChatMemberStatus.ADMINISTRATOR, + ): + return await CallbackQuery.message.edit_text( + "I must be admin to execute this Command" + ) + try: + await func(client, CallbackQuery) + except pyrogram.errors.exceptions.forbidden_403.ChatAdminRequired: + pass + except BaseException as e: + return await handle_error(e, CallbackQuery) + + self.add_handler(pyrogram.handlers.CallbackQueryHandler(decorator, filtercb)) + return decorator + + return wrapper + + +Decorators.on_cb = callback diff --git a/misskaty/core/misskaty_patch/decorators/command.py b/misskaty/core/misskaty_patch/decorators/command.py new file mode 100644 index 00000000..46198467 --- /dev/null +++ b/misskaty/core/misskaty_patch/decorators/command.py @@ -0,0 +1,133 @@ +import typing + +import pyrogram +from pyrogram.methods import Decorators + +from misskaty.core import pyro_cooldown +from misskaty.vars import COMMAND_HANDLER + +from ..utils import handle_error + + +def command( + self, + cmd: typing.Union[str, list], + is_disabled: typing.Union[bool, bool] = False, + pm_only: typing.Union[bool, bool] = False, + group_only: typing.Union[bool, bool] = False, + self_admin: typing.Union[bool, bool] = False, + self_only: typing.Union[bool, bool] = False, + no_channel: typing.Union[bool, bool] = False, + handler: typing.Optional[list] = None, + filtercmd: typing.Union[pyrogram.filters.Filter] = None, + *args, + **kwargs +): + """ + ### `tgClient.command` + - A decorater to Register Commands in simple way and manage errors in that Function itself, alternative for `@pyrogram.Client.on_message(pyrogram.filters.command('command'))` + - Parameters: + - cmd (str || list): + - The command to be handled for a function + + - group_only (bool) **optional**: + - If True, the command will only executed in Groups only, By Default False. + + - pm_only (bool) **optional**: + - If True, the command will only executed in Private Messages only, By Default False. + + - self_only (bool) **optional**: + - If True, the command will only excute if used by Self only, By Default False. + + - handler (list) **optional**: + - If set, the command will be handled by the specified Handler, By Default `Config.HANDLERS`. + + - self_admin (bool) **optional**: + - If True, the command will only executeed if the Bot is Admin in the Chat, By Default False + + - filtercmd (`~pyrogram.filters`) **optional**: + - Pyrogram Filters, hope you know about this, for Advaced usage. Use `and` for seaperating filters. + + #### Example + .. code-block:: python + import pyrogram + + app = pyrogram.Client() + + @app.on_cmd("start", is_disabled=False, group_only=False, pm_only=False, self_admin=False, self_only=False, pyrogram.filters.chat("777000") and pyrogram.filters.text) + async def start(client, message): + await message.reply_text(f"Hello {message.from_user.mention}") + """ + if handler is None: + handler = COMMAND_HANDLER + if filtercmd: + if self_only: + filtercmd = ( + pyrogram.filters.command(cmd, prefixes=handler) + & filtercmd + & pyrogram.filters.me + ) + else: + filtercmd = ( + pyrogram.filters.command(cmd, prefixes=handler) + & filtercmd + & pyrogram.filters.me + & pyro_cooldown.wait(7) + ) + else: + if self_only: + filtercmd = ( + pyrogram.filters.command(cmd, prefixes=handler) & pyrogram.filters.me + ) + else: + filtercmd = pyrogram.filters.command( + cmd, prefixes=handler + ) & pyro_cooldown.wait(7) + + def wrapper(func): + async def decorator(client, message: pyrogram.types.Message): + if is_disabled: + return await message.reply_text( + "Sorry, this command has been disabled by owner." + ) + if not message.from_user and no_channel: + return await message.reply_text( + "I'm cannot identify user. Use my command in private chat." + ) + if self_admin and message.chat.type != pyrogram.enums.ChatType.SUPERGROUP: + return await message.reply_text( + "This command can be used in supergroups only." + ) + if self_admin: + me = await client.get_chat_member( + message.chat.id, (await client.get_me()).id + ) + if me.status not in ( + pyrogram.enums.ChatMemberStatus.OWNER, + pyrogram.enums.ChatMemberStatus.ADMINISTRATOR, + ): + return await message.reply_text( + "I must be admin to execute this Command" + ) + if group_only and message.chat.type != pyrogram.enums.ChatType.SUPERGROUP: + return await message.reply_text( + "This command can be used in supergroups only." + ) + if pm_only and message.chat.type != pyrogram.enums.ChatType.PRIVATE: + return await message.reply_text("This command can be used in PMs only.") + try: + await func(client, message) + except pyrogram.errors.exceptions.forbidden_403.ChatWriteForbidden: + await client.leave_chat(message.chat.id) + except BaseException as exception: + return await handle_error(exception, message) + + self.add_handler( + pyrogram.handlers.MessageHandler(callback=decorator, filters=filtercmd) + ) + return decorator + + return wrapper + + +Decorators.on_cmd = command diff --git a/misskaty/core/misskaty_patch/listen/__init__.py b/misskaty/core/misskaty_patch/listen/__init__.py new file mode 100644 index 00000000..1657d965 --- /dev/null +++ b/misskaty/core/misskaty_patch/listen/__init__.py @@ -0,0 +1,2 @@ +# skipcq +from .listen import Chat, Client, MessageHandler, User diff --git a/misskaty/core/misskaty_patch/listen/listen.py b/misskaty/core/misskaty_patch/listen/listen.py new file mode 100644 index 00000000..5453e9aa --- /dev/null +++ b/misskaty/core/misskaty_patch/listen/listen.py @@ -0,0 +1,386 @@ +""" +pyromod - A monkeypatcher add-on for Pyrogram +Copyright (C) 2020 Cezar H. + +This file is part of pyromod. + +pyromod is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +pyromod is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with pyromod. If not, see . +""" + +import asyncio +import logging +from enum import Enum +from inspect import iscoroutinefunction +from typing import Callable, Optional, Union + +import pyrogram +from pyrogram.errors import MessageIdInvalid + +from ..utils import PyromodConfig, patch, patchable + +logger = logging.getLogger(__name__) + + +class ListenerStopped(Exception): + pass + + +class ListenerTimeout(Exception): + pass + + +class ListenerTypes(Enum): + MESSAGE = "message" + CALLBACK_QUERY = "callback_query" + + +@patch(pyrogram.client.Client) +class Client: + @patchable() + def __init__(self, *args, **kwargs): + self.listeners = {listener_type: {} for listener_type in ListenerTypes} + self.old__init__(*args, **kwargs) + + @patchable() + async def listen( + self, + identifier: tuple, + filters=None, + listener_type=ListenerTypes.MESSAGE, + timeout=None, + unallowed_click_alert=True, + ): + if type(listener_type) != ListenerTypes: + raise TypeError( + "Parameter listener_type should be a" + " value from pyromod.listen.ListenerTypes" + ) + + future = self.loop.create_future() + future.add_done_callback( + lambda f: self.stop_listening(identifier, listener_type) + ) + + listener_data = { + "future": future, + "filters": filters, + "unallowed_click_alert": unallowed_click_alert, + } + + self.listeners[listener_type].update({identifier: listener_data}) + + try: + return await asyncio.wait_for(future, timeout) + except asyncio.exceptions.TimeoutError: + if callable(PyromodConfig.timeout_handler): + PyromodConfig.timeout_handler(identifier, listener_data, timeout) + elif PyromodConfig.throw_exceptions: + raise ListenerTimeout(timeout) + + @patchable() + async def ask( + self, + text, + identifier: tuple, + filters=None, + listener_type=ListenerTypes.MESSAGE, + timeout=None, + *args, + **kwargs, + ): + request = await self.send_message(identifier[0], text, *args, **kwargs) + response = await self.listen(identifier, filters, listener_type, timeout) + if response: + response.request = request + + return response + + # needed for matching when message_id or user_id is null, and to take precedence + @patchable() + def match_listener( + self, + data: Optional[tuple] = None, + listener_type: ListenerTypes = ListenerTypes.MESSAGE, + identifier_pattern: Optional[tuple] = None, + ) -> tuple: + if data: + listeners = self.listeners[listener_type] + # case with 3 args on identifier + # most probably waiting for a specific user + # to click a button in a specific message + if data in listeners: + return listeners[data], data + + # cases with 2 args on identifier + # (None, user, message) does not make + # sense since the message_id is not unique + elif (data[0], data[1], None) in listeners: + matched = (data[0], data[1], None) + elif (data[0], None, data[2]) in listeners: + matched = (data[0], None, data[2]) + + # cases with 1 arg on identifier + # (None, None, message) does not make sense as well + elif (data[0], None, None) in listeners: + matched = (data[0], None, None) + elif (None, data[1], None) in listeners: + matched = (None, data[1], None) + else: + return None, None + + return listeners[matched], matched + elif identifier_pattern: + + def match_identifier(pattern, identifier): + comparison = ( + pattern[0] in (identifier[0], None), + pattern[1] in (identifier[1], None), + pattern[2] in (identifier[2], None), + ) + return comparison == (True, True, True) + + for identifier, listener in self.listeners[listener_type].items(): + if match_identifier(identifier_pattern, identifier): + return listener, identifier + return None, None + + @patchable() + def stop_listening( + self, + data: Optional[tuple] = None, + listener_type: ListenerTypes = ListenerTypes.MESSAGE, + identifier_pattern: Optional[tuple] = None, + ): + listener, identifier = self.match_listener( + data, listener_type, identifier_pattern + ) + + if not listener: + return + elif listener["future"].done(): + del self.listeners[listener_type][identifier] + return + + if callable(PyromodConfig.stopped_handler): + PyromodConfig.stopped_handler(identifier, listener) + elif PyromodConfig.throw_exceptions: + listener["future"].set_exception(ListenerStopped()) + + del self.listeners[listener_type][identifier] + + +@patch(pyrogram.handlers.message_handler.MessageHandler) +class MessageHandler: + @patchable() + def __init__(self, callback: Callable, filters=None): + self.registered_handler = callback + self.old__init__(self.resolve_future, filters) + + @patchable() + async def check(self, client, message): + if user := getattr(message, "from_user", None): + user = user.id + try: + listener = client.match_listener( + (message.chat.id, user, message.id), + ListenerTypes.MESSAGE, + )[0] + except AttributeError as err: + logger.warning(f"Get : {err}\n\n{message}") + raise err + + listener_does_match = handler_does_match = False + + if listener: + filters = listener["filters"] + if callable(filters): + if iscoroutinefunction(filters.__call__): + listener_does_match = await filters(client, message) + else: + listener_does_match = await client.loop.run_in_executor( + None, filters, client, message + ) + else: + listener_does_match = True + + if callable(self.filters): + if iscoroutinefunction(self.filters.__call__): + handler_does_match = await self.filters(client, message) + else: + handler_does_match = await client.loop.run_in_executor( + None, self.filters, client, message + ) + else: + handler_does_match = True + + # let handler get the chance to handle if listener + # exists but its filters doesn't match + return listener_does_match or handler_does_match + + @patchable() + async def resolve_future(self, client, message, *args): + listener_type = ListenerTypes.MESSAGE + if user := getattr(message, "from_user", None): + user = user.id + listener, identifier = client.match_listener( + (message.chat.id, user, message.id), + listener_type, + ) + listener_does_match = False + if listener: + filters = listener["filters"] + if callable(filters): + if iscoroutinefunction(filters.__call__): + listener_does_match = await filters(client, message) + else: + listener_does_match = await client.loop.run_in_executor( + None, filters, client, message + ) + else: + listener_does_match = True + + if listener_does_match: + if not listener["future"].done(): + listener["future"].set_result(message) + del client.listeners[listener_type][identifier] + raise pyrogram.StopPropagation + else: + await self.registered_handler(client, message, *args) + + +@patch(pyrogram.handlers.callback_query_handler.CallbackQueryHandler) +class CallbackQueryHandler: + @patchable() + def __init__(self, callback: Callable, filters=None): + self.registered_handler = callback + self.old__init__(self.resolve_future, filters) + + @patchable() + async def check(self, client, query): + chatID, mID = None, None + if message := getattr(query, "message", None): + chatID, mID = message.chat.id, message.id + try: + listener = client.match_listener( + (chatID, query.from_user.id, mID), + ListenerTypes.CALLBACK_QUERY, + )[0] + except AttributeError as err: + logger.warning(f"Get : {err}\n\n{message}") + raise err + + # managing unallowed user clicks + if PyromodConfig.unallowed_click_alert: + permissive_listener = client.match_listener( + identifier_pattern=( + chatID, + None, + mID, + ), + listener_type=ListenerTypes.CALLBACK_QUERY, + )[0] + + if (permissive_listener and not listener) and permissive_listener[ + "unallowed_click_alert" + ]: + alert = ( + permissive_listener["unallowed_click_alert"] + if type(permissive_listener["unallowed_click_alert"]) is str + else PyromodConfig.unallowed_click_alert_text + ) + try: + await query.answer(alert) + except MessageIdInvalid: + pass + return False + + filters = listener["filters"] if listener else self.filters + + if callable(filters): + if iscoroutinefunction(filters.__call__): + return await filters(client, query) + else: + return await client.loop.run_in_executor(None, filters, client, query) + else: + return True + + @patchable() + async def resolve_future(self, client, query, *args): + listener_type = ListenerTypes.CALLBACK_QUERY + chatID, mID = None, None + if message := getattr(query, "message", None): + chatID, mID = message.chat.id, message.id + listener, identifier = client.match_listener( + (chatID, query.from_user.id, mID), + listener_type, + ) + + if listener and not listener["future"].done(): + listener["future"].set_result(query) + del client.listeners[listener_type][identifier] + else: + await self.registered_handler(client, query, *args) + + +@patch(pyrogram.types.messages_and_media.message.Message) +class Message(pyrogram.types.messages_and_media.message.Message): + @patchable() + async def wait_for_click( + self, + from_user_id: Optional[int] = None, + timeout: Optional[int] = None, + filters=None, + alert: Union[str, bool] = True, + ): + return await self._client.listen( + (self.chat.id, from_user_id, self.id), + listener_type=ListenerTypes.CALLBACK_QUERY, + timeout=timeout, + filters=filters, + unallowed_click_alert=alert, + ) + + +@patch(pyrogram.types.user_and_chats.chat.Chat) +class Chat(pyrogram.types.Chat): + @patchable() + def listen(self, *args, **kwargs): + return self._client.listen((self.id, None, None), *args, **kwargs) + + @patchable() + def ask(self, text, *args, **kwargs): + return self._client.ask(text, (self.id, None, None), *args, **kwargs) + + @patchable() + def stop_listening(self, *args, **kwargs): + return self._client.stop_listening( + *args, identifier_pattern=(self.id, None, None), **kwargs + ) + + +@patch(pyrogram.types.user_and_chats.user.User) +class User(pyrogram.types.User): + @patchable() + def listen(self, *args, **kwargs): + return self._client.listen((None, self.id, None), *args, **kwargs) + + @patchable() + def ask(self, text, *args, **kwargs): + return self._client.ask(text, (self.id, self.id, None), *args, **kwargs) + + @patchable() + def stop_listening(self, *args, **kwargs): + return self._client.stop_listening( + *args, identifier_pattern=(None, self.id, None), **kwargs + ) diff --git a/misskaty/core/misskaty_patch/methods/__init__.py b/misskaty/core/misskaty_patch/methods/__init__.py new file mode 100644 index 00000000..3a8c831f --- /dev/null +++ b/misskaty/core/misskaty_patch/methods/__init__.py @@ -0,0 +1,4 @@ +# skipcq +from .edit_message_text import edit_message_text +from .send_as_file import send_as_file +from .send_message import send_message diff --git a/misskaty/core/misskaty_patch/methods/edit_message_text.py b/misskaty/core/misskaty_patch/methods/edit_message_text.py new file mode 100644 index 00000000..019a8344 --- /dev/null +++ b/misskaty/core/misskaty_patch/methods/edit_message_text.py @@ -0,0 +1,61 @@ +import asyncio +from typing import Union + +from pyrogram import Client + + +async def edit_message_text( + self, + chat_id: Union[int, str], + message_id: int, + text: str, + del_in: int = 0, + *args, + **kwargs +) -> Union["Message", bool]: + """\nExample: + message.edit_text("hello") + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved Messages) + you can simply use "me" or "self". + For a contact that exists in your Telegram address book + you can use his phone number (str). + message_id (``int``): + Message identifier in the chat specified in chat_id. + text (``str``): + New text of the message. + del_in (``int``): + Time in Seconds for delete that message. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using + both Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable + Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + entities (List of :obj:`~pyrogram.types.MessageEntity`): + List of special entities that appear in message text, + which can be specified instead of *parse_mode*. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + reply_markup (:obj:`InlineKeyboardMarkup`, *optional*): + An InlineKeyboardMarkup object. + Returns: + On success, the edited + :obj:`Message` or True is returned. + Raises: + RPCError: In case of a Telegram RPC error. + """ + msg = await self.edit_message_text( + chat_id=chat_id, message_id=message_id, text=text, *args, **kwargs + ) + if del_in == 0: + return msg + await asyncio.sleep(del_in) + return bool(await msg.delete()) + + +Client.edit_msg_text = edit_message_text diff --git a/misskaty/core/misskaty_patch/methods/send_as_file.py b/misskaty/core/misskaty_patch/methods/send_as_file.py new file mode 100644 index 00000000..b5722140 --- /dev/null +++ b/misskaty/core/misskaty_patch/methods/send_as_file.py @@ -0,0 +1,48 @@ +import io +from typing import Optional, Union + +from pyrogram import Client + + +async def send_as_file( + self, + chat_id: Union[int, str], + text: str, + filename: str = "output.txt", + caption: str = "", + reply_to_message_id: Optional[int] = None, +) -> "Message": + """\nYou can send large outputs as file + Example: + @userge.send_as_file(chat_id=12345, text="hello") + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved Messages) + you can simply use "me" or "self". + For a contact that exists in your Telegram address book + you can use his phone number (str). + text (``str``): + Text of the message to be sent. + filename (``str``, *optional*): + file_name for output file. + caption (``str``, *optional*): + caption for output file. + reply_to_message_id (``int``, *optional*): + If the message is a reply, ID of the original message. + Returns: + On success, the sent Message is returned. + """ + doc = io.BytesIO(text.encode()) + doc.name = filename + + return await self.send_document( + chat_id=chat_id, + document=doc, + caption=caption[:1024], + disable_notification=True, + reply_to_message_id=reply_to_message_id, + ) + + +Client.send_as_file = send_as_file diff --git a/misskaty/core/misskaty_patch/methods/send_message.py b/misskaty/core/misskaty_patch/methods/send_message.py new file mode 100644 index 00000000..2a2f4194 --- /dev/null +++ b/misskaty/core/misskaty_patch/methods/send_message.py @@ -0,0 +1,63 @@ +import asyncio +from typing import Union + +from pyrogram import Client + + +async def send_message( + self, chat_id: Union[int, str], text: str, del_in: int = 0, *args, **kwargs +) -> Union["Message", bool]: + """\nSend text messages. + Example: + @userge.send_message(chat_id=12345, text='test') + Parameters: + chat_id (``int`` | ``str``): + Unique identifier (int) or username (str) of the target chat. + For your personal cloud (Saved Messages) + you can simply use "me" or "self". + For a contact that exists in your Telegram address book + you can use his phone number (str). + text (``str``): + Text of the message to be sent. + del_in (``int``): + Time in Seconds for delete that message. + log (``bool`` | ``str``, *optional*): + If ``True``, the message will be forwarded to the log channel. + If ``str``, the logger name will be updated. + parse_mode (:obj:`enums.ParseMode`, *optional*): + By default, texts are parsed using both Markdown and HTML styles. + You can combine both syntaxes together. + Pass "markdown" or "md" to enable Markdown-style parsing only. + Pass "html" to enable HTML-style parsing only. + Pass None to completely disable style parsing. + entities (List of :obj:`~pyrogram.types.MessageEntity`): + List of special entities that appear in message text, + which can be specified instead of *parse_mode*. + disable_web_page_preview (``bool``, *optional*): + Disables link previews for links in this message. + disable_notification (``bool``, *optional*): + Sends the message silently. + Users will receive a notification with no sound. + reply_to_message_id (``int``, *optional*): + If the message is a reply, ID of the original message. + schedule_date (:py:obj:`~datetime.datetime`, *optional*): + Date when the message will be automatically sent. Unix time. + protect_content (``bool``, *optional*): + Protects the contents of the sent message from forwarding and saving. + reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` + | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*): + Additional interface options. An object for an inline keyboard, + custom reply keyboard, instructions to remove + reply keyboard or to force a reply from the user. + Returns: + :obj:`Message`: On success, the sent text message or True is returned. + """ + msg = await self.send_message(chat_id=chat_id, text=text, *args, **kwargs) + if del_in == 0: + return msg + if del_in > 0: + await asyncio.sleep(del_in) + return bool(await msg.delete()) + + +Client.send_msg = send_message diff --git a/misskaty/core/misskaty_patch/utils/__init__.py b/misskaty/core/misskaty_patch/utils/__init__.py new file mode 100644 index 00000000..4cf62927 --- /dev/null +++ b/misskaty/core/misskaty_patch/utils/__init__.py @@ -0,0 +1,5 @@ +# skipcq +from .admin_utils import check_rights, is_admin +from .get_user import get_user +from .handler_error import handle_error +from .utils import PyromodConfig, patch, patchable diff --git a/misskaty/core/misskaty_patch/utils/admin_utils.py b/misskaty/core/misskaty_patch/utils/admin_utils.py new file mode 100644 index 00000000..d2ca8434 --- /dev/null +++ b/misskaty/core/misskaty_patch/utils/admin_utils.py @@ -0,0 +1,158 @@ +# tgEasy - Easy for a brighter Shine. A monkey pather add-on for Pyrogram +# Copyright (C) 2021 - 2022 Jayant Hegde Kageri + +# This file is part of tgEasy. + +# tgEasy is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# tgEasy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with tgEasy. If not, see . + +import typing + +import pyrogram + + +async def check_rights( + chat_id: typing.Union[int, int], + user_id: typing.Union[int, int], + rights: typing.Union[str, list], + client, +) -> bool: + """ + ### `check_rights` + - Checks the Rights of an User + - This is an Helper Function for `adminsOnly` + + - Parameters: + - chat_id (int): + - The Chat ID of Which Chat have to check the Rights. + + - user_id (int): + - The User ID of Whose Rights have to Check. + + - rights (str): + - The Rights have to Check. + + - client (`pyrogram.Client`): + - From which Client to Check the Rights. + + - Returns: + - `True` if the User have the Right. + - `False` if the User don't have the Right. + + #### Example + .. code-block:: python + import pyrogram + + app = pyrogram.Client() + + @app.command("ban", group_only=True, self_admin=True) + async def ban(client, message): + if not await check_rights(message.chat.id, message.from_user.id, "can_restrict_members"): + return await message.reply_text("You don't have necessary rights to use this Command.") + user = await get_user(message) + await message.chat.kick_member(user.id) + """ + try: + user = await client.get_chat_member(chat_id, user_id) + except Exception: + return False + if user.status == "user": + return False + if user.status in ( + pyrogram.enums.ChatMemberStatus.OWNER, + pyrogram.enums.ChatMemberStatus.ADMINISTRATOR, + ): + permission = [] + if user.privileges.can_manage_chat: + permission.append("can_manage_chat") + + if user.privileges.can_delete_messages: + permission.append("can_delete_messages") + + if user.privileges.can_manage_video_chats: + permission.append("can_manage_video_chats") + + if user.privileges.can_restrict_members: + permission.append("can_restrict_members") + + if user.privileges.can_promote_members: + permission.append("can_promote_members") + + if user.privileges.can_change_info: + permission.append("can_change_info") + + if user.privileges.can_post_messages: + permission.append("can_post_messages") + + if user.privileges.can_edit_messages: + permission.append("can_edit_messages") + + if user.privileges.can_invite_users: + permission.append("can_invite_users") + + if user.privileges.can_pin_messages: + permission.append("can_pin_messages") + + if user.privileges.is_anonymous: + permission.append("is_anonymous") + + if isinstance(rights, str): + return rights in permission + if isinstance(rights, list): + for right in rights: + return right in permission + return False + + +async def is_admin( + chat_id: typing.Union[int, str], user_id: typing.Union[int, str], client +) -> bool: + """ + ### `is_admin` + - A Functions to Check if the User is Admin or not + + - Parameters: + - chat_id (int): + - The Chat ID of Which Chat have to check the Admin Status. + + - user_id (int): + - The User ID of Whose Admin Status have to Check. + + - client (`pyrogram.Client`): + - From which Client to Check the Admin Status. + + - Returns: + - `True` if the User is Admin. + - `False` if the User is't Admin. + #### Example + .. code-block:: python + import pyrogram + + app = pyrogram.Client() + + @app.command("ban", group_only=True, self_admin=True) + @app.adminsOnly("can_restrict_members") + async def ban(client, message): + if await is_admin(message.chat.id, (await get_user(mesasge)).id): + return await message.reply_text("You can't Ban Admins.") + await message.chat.kick_member((await get_user(message)).id) + await message.reply_text("User has been Banned.") + """ + try: + user = await client.get_chat_member(chat_id, user_id) + except Exception: + return False + return user.status in ( + pyrogram.enums.ChatMemberStatus.OWNER, + pyrogram.enums.ChatMemberStatus.ADMINISTRATOR, + ) diff --git a/misskaty/core/misskaty_patch/utils/get_user.py b/misskaty/core/misskaty_patch/utils/get_user.py new file mode 100644 index 00000000..0cf6f0e5 --- /dev/null +++ b/misskaty/core/misskaty_patch/utils/get_user.py @@ -0,0 +1,122 @@ +# tgEasy - Easy for a brighter Shine. A monkey pather add-on for Pyrogram +# Copyright (C) 2021 - 2022 Jayant Hegde Kageri + +# This file is part of tgEasy. + +# tgEasy is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# tgEasy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with tgEasy. If not, see . + +import contextlib +import typing + +import pyrogram + + +async def get_user( + m: typing.Union[pyrogram.types.Message, pyrogram.types.CallbackQuery] +) -> pyrogram.types.User or bool: + """ + ### `tgEasy.get_user` + - Gets a User from Message/RepliedMessage/CallbackQuery + - Parameters: + - m (`~pyrogram.types.Message` || `~pyrogram.types.CallbackQuery`) + - Returns: + - `pyrogram.types.User` on Success + - `False` on Error + + #### Example + .. code-block:: python + from tgEasy import get_user, command, adminsOnly + + @command("ban", group_only=True, self_admin=True) + @adminsOnly("can_restrict_members") + async def ban(client, message): + user = await get_user(message) + await message.chat.kick_member(user.id) + """ + if isinstance(m, pyrogram.types.Message): + message = m + client = m._client + if isinstance(m, pyrogram.types.CallbackQuery): + message = m.message + client = message._client + if message.reply_to_message: + if message.reply_to_message.sender_chat: + return False + return await client.get_users(message.reply_to_message.from_user.id) + + command = message.command[1] if len(message.command) > 1 else None + if command and (command.startswith("@") or command.isdigit()): + with contextlib.suppress( + pyrogram.errors.exceptions.bad_request_400.UsernameNotOccupied, + pyrogram.errors.exceptions.bad_request_400.UsernameInvalid, + pyrogram.errors.exceptions.bad_request_400.PeerIdInvalid, + IndexError, + ): + return await client.get_users(message.command[1]) + if message.entities: + for mention in message.entities: + if mention.type == "text_mention": + user = mention.user.id + break + with contextlib.suppress(Exception): + return await client.get_users(user) + return False + + +async def get_user_adv( + m: typing.Union[pyrogram.types.Message, pyrogram.types.CallbackQuery] +) -> pyrogram.types.User or bool: + """ + ### `tgEasy.get_user_adv` + - A Function to Get the User from the Message/CallbackQuery, If there is None arguments, returns the From User. + - Parameters: + - m (`pyrogram.types.Message` || `pyrogram.types.CallbackQuery`): + - Message or Callbackquery. + - Returns: + - `pyrogram.types.User` on Success + - `False` on Error + + #### Example + .. code-block:: python + from tgEasy import command, get_user_adv + + @command("id") + async def id(client, message): + user = await get_user_adv(message) + await message.reply_text(f"Your ID is `{user.id}`") + """ + if isinstance(m, pyrogram.types.Message): + message = m + if isinstance(m, pyrogram.types.CallbackQuery): + message = m.message + if message.sender_chat: + return False + with contextlib.suppress(IndexError, AttributeError): + if len(message.command) > 1: + if message.command[1].startswith("@"): + return await get_user(message) + if message.command[1].isdigit(): + return await get_user(message) + if "text_mention" in message.entities: + return await get_user(message) + if "from_user" in str(message.reply_to_message): + return await get_user(message) + with contextlib.suppress(Exception): + if "sender_chat" in str(message.reply_to_message): + return False + if "from_user" in str(message.reply_to_message): + return await message._client.get_users( + message.reply_to_message.from_user.id + ) + return await message._client.get_users(message.from_user.id) diff --git a/misskaty/core/misskaty_patch/utils/handler_error.py b/misskaty/core/misskaty_patch/utils/handler_error.py new file mode 100644 index 00000000..89c7f97e --- /dev/null +++ b/misskaty/core/misskaty_patch/utils/handler_error.py @@ -0,0 +1,93 @@ +# tgEasy - Easy for a brighter Shine. A monkey pather add-on for Pyrogram +# Copyright (C) 2021 - 2022 Jayant Hegde Kageri + +# This file is part of tgEasy. + +# tgEasy is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# tgEasy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public License +# along with tgEasy. If not, see . +import contextlib +import logging +import os +import traceback +import typing +from datetime import datetime + +import pyrogram + +from misskaty.vars import LOG_CHANNEL + +LOGGER = logging.getLogger(__name__) + + +async def handle_error( + _, m: typing.Union[pyrogram.types.Message, pyrogram.types.CallbackQuery] +): + """ + ### `handle_error` + - A Function to Handle the Errors in Functions. + - This Sends the Error Log to the Log Group and Replies Sorry Message for the Users. + - This is Helper for all of the functions for handling the Errors. + + - Parameters: + - error: + - The Exceptation. + + - m (`pyrogram.types.Message` or `pyrogram.types.CallbackQuery`): + - The Message or Callback Query where the Error occurred. + + """ + + day = datetime.now() + tgl_now = datetime.now() + cap_day = f"{day.strftime('%A')}, {tgl_now.strftime('%d %B %Y %H:%M:%S')}" + f_errname = f"crash_{tgl_now.strftime('%d %B %Y')}.txt" + LOGGER.error(traceback.format_exc()) + with open(f_errname, "w+", encoding="utf-8") as log: + log.write(traceback.format_exc()) + log.close() + if isinstance(m, pyrogram.types.Message): + with contextlib.suppress(Exception): + try: + await m.reply_photo( + "https://telegra.ph/file/3c9162b242567ae25d5af.jpg", + caption="An Internal Error Occurred while Processing your Command, the Logs have been sent to the Owners of this Bot. Sorry for Inconvenience", + ) + except: + await m.reply_msg( + "An Internal Error Occurred while Processing your Command, the Logs have been sent to the Owners of this Bot. Sorry for Inconvenience" + ) + await m._client.send_document( + LOG_CHANNEL, + f_errname, + caption=f"Crash Report of this Bot\n{cap_day}", + ) + if isinstance(m, pyrogram.types.CallbackQuery): + with contextlib.suppress(Exception): + await m.message.delete() + try: + await m.reply_photo( + "https://telegra.ph/file/3c9162b242567ae25d5af.jpg", + caption="An Internal Error Occurred while Processing your Command, the Logs have been sent to the Owners of this Bot. Sorry for Inconvenience", + ) + except: + await m.message.reply_msg( + "An Internal Error Occurred while Processing your Command, the Logs have been sent to the Owners of this Bot. Sorry for Inconvenience" + ) + await m.message._client.send_document( + LOG_CHANNEL, + f_errname, + caption=f"Crash Report of this Bot\n{cap_day}", + ) + if os.path.exists(f_errname): + os.remove(f_errname) + return True diff --git a/misskaty/core/misskaty_patch/utils/utils.py b/misskaty/core/misskaty_patch/utils/utils.py new file mode 100644 index 00000000..90571767 --- /dev/null +++ b/misskaty/core/misskaty_patch/utils/utils.py @@ -0,0 +1,123 @@ +""" +pyromod - A monkeypatcher add-on for Pyrogram +Copyright (C) 2020 Cezar H. + +This file is part of pyromod. + +pyromod is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +pyromod is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with pyromod. If not, see . +""" +from contextlib import asynccontextmanager, contextmanager +from inspect import iscoroutinefunction +from logging import getLogger +from typing import Callable + +from pyrogram.sync import async_to_sync + +logger = getLogger(__name__) + + +class PyromodConfig: + timeout_handler = None + stopped_handler = None + throw_exceptions = True + unallowed_click_alert = True + unallowed_click_alert_text = "[pyromod] You're not expected to click this button." + + +def patch(obj): + def is_patchable(item): + return getattr(item[1], "patchable", False) + + def wrapper(container): + for name, func in filter(is_patchable, container.__dict__.items()): + old = getattr(obj, name, None) + if old is not None: # Not adding 'old' to new func + setattr(obj, f"old{name}", old) + + # Worse Code + tempConf = { + i: getattr(func, i, False) + for i in ["is_property", "is_static", "is_context"] + } + + async_to_sync(container, name) + func = getattr(container, name) + + for tKey, tValue in tempConf.items(): + setattr(func, tKey, tValue) + + if func.is_property: + func = property(func) + elif func.is_static: + func = staticmethod(func) + elif func.is_context: + if iscoroutinefunction(func.__call__): + func = asynccontextmanager(func) + else: + func = contextmanager(func) + + logger.info( + f"Patch Attribute To {obj.__name__} From {container.__name__} : {name}" + ) + setattr(obj, name, func) + return container + + return wrapper + + +def patchable( + is_property: bool = False, is_static: bool = False, is_context: bool = False +) -> Callable: + """ + A decorator that marks a function as patchable. + + Usage: + + @patchable(is_property=True) + def my_property(): + ... + + @patchable(is_static=True) + def my_static_method(): + ... + + @patchable(is_context=True) + def my_context_manager(): + ... + + @patchable(is_property=False, is_static=False, is_context=False) + def my_function(): + ... + + @patchable() + def default_usage(): + ... + + Parameters: + - is_property (bool): whether the function is a property. Default is False. + - is_static (bool): whether the function is a static method. Default is False. + - is_context (bool): whether the function is a context manager. Default is False. + + Returns: + - A callable object that marks the function as patchable. + """ + + def wrapper(func: Callable) -> Callable: + func.patchable = True + func.is_property = is_property + func.is_static = is_static + func.is_context = is_context + return func + + return wrapper diff --git a/misskaty/core/pyro_cooldown.py b/misskaty/core/pyro_cooldown.py new file mode 100644 index 00000000..04a43937 --- /dev/null +++ b/misskaty/core/pyro_cooldown.py @@ -0,0 +1,51 @@ +import asyncio + +from pyrogram import filters +from pyrogram.errors import MessageDeleteForbidden + +from misskaty.vars import SUDO + +data = {} + + +async def task(msg, warn=False, sec=None): + if warn: + user = msg.from_user or msg.sender_chat + ids = await msg.reply_msg( + f"Sorry {user.mention if msg.from_user else msg.sender_chat.title} [{user.id}], you must wait for {sec}s before using this feature again.." + ) + try: + await msg.delete_msg() + except MessageDeleteForbidden: + pass + await asyncio.sleep(sec) + await ids.edit_msg( + f"Alright {user.mention if msg.from_user else msg.sender_chat.title} [{user.id}], your cooldown is over you can command again.", + del_in=3, + ) + + +def wait(sec): + async def ___(flt, _, msg): + user_id = msg.from_user.id if msg.from_user else msg.sender_chat.id + if user_id in SUDO: + return True + if user_id in data: + if msg.date.timestamp() >= data[user_id]["timestamp"] + flt.data: + data[user_id] = {"timestamp": msg.date.timestamp(), "warned": False} + return True + else: + if not data[user_id]["warned"]: + data[user_id]["warned"] = True + asyncio.ensure_future( + task(msg, True, flt.data) + ) # for super accuracy use (future - time.time()) + return False # cause we dont need delete again + + asyncio.ensure_future(task(msg)) + return False + else: + data.update({user_id: {"timestamp": msg.date.timestamp(), "warned": False}}) + return True + + return filters.create(___, data=sec) diff --git a/misskaty/core/ratelimiter_func.py b/misskaty/core/ratelimiter_func.py new file mode 100644 index 00000000..3ea75873 --- /dev/null +++ b/misskaty/core/ratelimiter_func.py @@ -0,0 +1,49 @@ +from typing import Union + +from pyrate_limiter import ( + BucketFullException, + Duration, + Limiter, + MemoryListBucket, + RequestRate, +) + + +class RateLimiter: + """ + Implement rate limit logic using leaky bucket + algorithm, via pyrate_limiter. + (https://pypi.org/project/pyrate-limiter/) + """ + + def __init__(self) -> None: + # 1 requests per seconds + self.second_rate = RequestRate(1, Duration.SECOND) + + # 15 requests per minute. + self.minute_rate = RequestRate(15, Duration.MINUTE) + + # 100 requests per hour + self.hourly_rate = RequestRate(100, Duration.HOUR) + + # 500 requests per day + self.daily_rate = RequestRate(500, Duration.DAY) + + self.limiter = Limiter( + self.minute_rate, + self.hourly_rate, + self.daily_rate, + bucket_class=MemoryListBucket, + ) + + async def acquire(self, userid: Union[int, str]) -> bool: + """ + Acquire rate limit per userid and return True / False + based on userid ratelimit status. + """ + + try: + self.limiter.try_acquire(userid) + return False + except BucketFullException: + return True diff --git a/misskaty/helper/__init__.py b/misskaty/helper/__init__.py new file mode 100644 index 00000000..ba04e3ad --- /dev/null +++ b/misskaty/helper/__init__.py @@ -0,0 +1,15 @@ +from .ffmpeg_helper import * +from .files import * +from .functions import * +from .http import * +from .human_read import * +from .kuso_utils import * +from .media_helper import * +from .misc import * +from .pyro_progress import * +from .stickerset import * +from .subscene_helper import * +from .time_gap import * +from .tools import * +from .ytdl_helper import * +from .sqlite_helper import Cache \ No newline at end of file diff --git a/misskaty/helper/eval_helper.py b/misskaty/helper/eval_helper.py new file mode 100644 index 00000000..86f1c49c --- /dev/null +++ b/misskaty/helper/eval_helper.py @@ -0,0 +1,159 @@ +import ast +import os +import traceback +from typing import List, Optional + + +# We dont modify locals VVVV ; this lets us keep the message available to the user-provided function +async def meval(code, globs, **kwargs): + # This function is released in the public domain. Feel free to kang it (although I like credit) + # Note to self: please don't set globals here as they will be lost. + # Don't clutter locals + locs = {} + # Restore globals latertypes + globs = globs.copy() + # This code saves __name__ and __package into a kwarg passed to the function. + # It is set before the users code runs to make sure relative imports work + global_args = "_globs" + while global_args in globs.keys(): + # Make sure there's no name collision, just keep prepending _s + global_args = f"_{global_args}" + kwargs[global_args] = {} + for glob in ["__name__", "__package__"]: + # Copy data to args we are sending + kwargs[global_args][glob] = globs[glob] + + root = ast.parse(code, "exec") + code = root.body + + ret_name = "_ret" + ok = False + while True: + if ret_name in globs.keys(): + ret_name = f"_{ret_name}" + continue + for node in ast.walk(root): + if isinstance(node, ast.Name) and node.id == ret_name: + ret_name = f"_{ret_name}" + break + ok = True + if ok: + break + + if not code: + return None + + if not any(isinstance(node, ast.Return) for node in code): + for i in range(len(code)): + if isinstance(code[i], ast.Expr) and ( + i == len(code) - 1 or not isinstance(code[i].value, ast.Call) + ): + code[i] = ast.copy_location( + ast.Expr( + ast.Call( + func=ast.Attribute( + value=ast.Name(id=ret_name, ctx=ast.Load()), + attr="append", + ctx=ast.Load(), + ), + args=[code[i].value], + keywords=[], + ) + ), + code[-1], + ) + else: + for node in code: + if isinstance(node, ast.Return): + node.value = ast.List(elts=[node.value], ctx=ast.Load()) + + code.append( + ast.copy_location( + ast.Return(value=ast.Name(id=ret_name, ctx=ast.Load())), code[-1] + ) + ) + + # globals().update(**) + glob_copy = ast.Expr( + ast.Call( + func=ast.Attribute( + value=ast.Call( + func=ast.Name(id="globals", ctx=ast.Load()), args=[], keywords=[] + ), + attr="update", + ctx=ast.Load(), + ), + args=[], + keywords=[ + ast.keyword(arg=None, value=ast.Name(id=global_args, ctx=ast.Load())) + ], + ) + ) + ast.fix_missing_locations(glob_copy) + code.insert(0, glob_copy) + ret_decl = ast.Assign( + targets=[ast.Name(id=ret_name, ctx=ast.Store())], + value=ast.List(elts=[], ctx=ast.Load()), + ) + ast.fix_missing_locations(ret_decl) + code.insert(1, ret_decl) + args = [] + for a in list(map(lambda x: ast.arg(x, None), kwargs.keys())): + ast.fix_missing_locations(a) + args += [a] + args = ast.arguments( + args=[], + vararg=None, + kwonlyargs=args, + kwarg=None, + defaults=[], + kw_defaults=[None for _ in range(len(args))], + ) + args.posonlyargs = [] + fun = ast.AsyncFunctionDef( + name="tmp", args=args, body=code, decorator_list=[], returns=None + ) + ast.fix_missing_locations(fun) + mod = ast.parse("") + mod.body = [fun] + comp = compile(mod, "", "exec") + + exec(comp, {}, locs) + + r = await locs["tmp"](**kwargs) + for i in range(len(r)): + if hasattr(r[i], "__await__"): + r[i] = await r[i] # workaround for 3.5 + i = 0 + while i < len(r) - 1: + if r[i] is None: + del r[i] + else: + i += 1 + if len(r) == 1: + [r] = r + elif not r: + r = None + return r + + +def format_exception( + exp: BaseException, tb: Optional[List[traceback.FrameSummary]] = None +) -> str: + """Formats an exception traceback as a string, similar to the Python interpreter.""" + + if tb is None: + tb = traceback.extract_tb(exp.__traceback__) + + # Replace absolute paths with relative paths + cwd = os.getcwd() + for frame in tb: + if cwd in frame.filename: + frame.filename = os.path.relpath(frame.filename) + + stack = "".join(traceback.format_list(tb)) + msg = str(exp) + if msg: + msg = f": {msg}" + + return f"Traceback (most recent call last):\n{stack}{type(exp).__name__}{msg}" diff --git a/misskaty/helper/ffmpeg_helper.py b/misskaty/helper/ffmpeg_helper.py new file mode 100644 index 00000000..f9dfdf7a --- /dev/null +++ b/misskaty/helper/ffmpeg_helper.py @@ -0,0 +1,77 @@ +import asyncio +import os +import time + +from pyrogram.errors import FloodWait +from pyrogram.types import InputMediaPhoto + +from misskaty.plugins.dev import shell_exec + + +def hhmmss(seconds): + return time.strftime("%H:%M:%S", time.gmtime(seconds)) + + +async def take_ss(video_file): + out_put_file_name = f"genss{str(time.time())}.png" + cmd = f"vcsi '{video_file}' -t -w 1340 -g 4x4 --timestamp-font assets/DejaVuSans.ttf --metadata-font assets/DejaVuSans-Bold.ttf --template misskaty/helper/ssgen_template.html --quality 100 --end-delay-percent 20 --metadata-font-size 30 --timestamp-font-size 20 -o {out_put_file_name}" + await shell_exec(cmd) + return out_put_file_name if os.path.lexists(out_put_file_name) else None + + +async def ssgen_link(video, output_directory, ttl): + out_put_file_name = f"{output_directory}/{str(time.time())}.png" + cmd = [ + "ffmpeg", + "-ss", + str(ttl), + "-i", + video, + "-vframes", + "1", + "-f", + "image2", + out_put_file_name, + ] + process = await asyncio.create_subprocess_exec( + *cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + + stdout, stderr = await process.communicate() + stderr.decode().strip() + stdout.decode().strip() + return out_put_file_name if os.path.isfile(out_put_file_name) else None + + +async def genss_link(msg, video_link, output_directory, min_duration, no_of_photos): + metadata = ( + await shell_exec( + f"ffprobe -i {video_link} -show_entries format=duration -v quiet -of csv='p=0'" + ) + )[0] + duration = round(float(metadata)) + if duration > min_duration: + images = [] + ttl_step = duration // no_of_photos + current_ttl = ttl_step + for looper in range(no_of_photos): + ss_img = await ssgen_link(video_link, output_directory, current_ttl) + images.append( + InputMediaPhoto( + media=ss_img, caption=f"Screenshot at {hhmmss(current_ttl)}" + ) + ) + try: + await msg.edit( + f"📸 Take Screenshoot:\n{looper+1} of {no_of_photos} screenshot generated.." + ) + except FloodWait as e: + await asyncio.sleep(e.value) + await msg.edit( + f"📸 Take Screenshoot:\n{looper+1} of {no_of_photos} screenshot generated.." + ) + current_ttl = current_ttl + ttl_step + await asyncio.sleep(2) + return images + else: + return None diff --git a/misskaty/helper/files.py b/misskaty/helper/files.py new file mode 100644 index 00000000..d8f8079f --- /dev/null +++ b/misskaty/helper/files.py @@ -0,0 +1,88 @@ +""" +MIT License +Copyright (c) 2021 TheHamkerCat +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 math +import os + +from PIL import Image +from pyrogram import Client, raw +from pyrogram.file_id import FileId + +STICKER_DIMENSIONS = (512, 512) + + +async def resize_file_to_sticker_size(file_path: str) -> str: + im = Image.open(file_path) + if (im.width, im.height) < STICKER_DIMENSIONS: + size1 = im.width + size2 = im.height + if im.width > im.height: + scale = STICKER_DIMENSIONS[0] / size1 + size1new = STICKER_DIMENSIONS[0] + size2new = size2 * scale + else: + scale = STICKER_DIMENSIONS[1] / size2 + size1new = size1 * scale + size2new = STICKER_DIMENSIONS[1] + size1new = math.floor(size1new) + size2new = math.floor(size2new) + sizenew = (size1new, size2new) + im = im.resize(sizenew) + else: + im.thumbnail(STICKER_DIMENSIONS) + try: + os.remove(file_path) + return f"{file_path}.png" + finally: + im.save(file_path) + + +async def upload_document( + client: Client, file_path: str, chat_id: int +) -> raw.base.InputDocument: + media = await client.send( + raw.functions.messages.UploadMedia( + peer=await client.resolve_peer(chat_id), + media=raw.types.InputMediaUploadedDocument( + mime_type=client.guess_mime_type(file_path) or "application/zip", + file=await client.save_file(file_path), + attributes=[ + raw.types.DocumentAttributeFilename( + file_name=os.path.basename(file_path) + ) + ], + ), + ) + ) + return raw.types.InputDocument( + id=media.document.id, + access_hash=media.document.access_hash, + file_reference=media.document.file_reference, + ) + + +async def get_document_from_file_id( + file_id: str, +) -> raw.base.InputDocument: + decoded = FileId.decode(file_id) + return raw.types.InputDocument( + id=decoded.media_id, + access_hash=decoded.access_hash, + file_reference=decoded.file_reference, + ) diff --git a/misskaty/helper/functions.py b/misskaty/helper/functions.py new file mode 100644 index 00000000..3b5d2c8b --- /dev/null +++ b/misskaty/helper/functions.py @@ -0,0 +1,135 @@ +from datetime import datetime, timedelta +from re import findall +from re import sub as re_sub +from string import ascii_lowercase + +from pyrogram import enums + +from misskaty import app + + +def get_urls_from_text(text: str) -> bool: + regex = r"""(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-] + [.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|( + \([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\ + ()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))""".strip() + return [x[0] for x in findall(regex, text)] + + +async def alpha_to_int(user_id_alphabet: str) -> int: + alphabet = list(ascii_lowercase)[:10] + user_id = "" + for i in user_id_alphabet: + index = alphabet.index(i) + user_id += str(index) + return int(user_id) + + +async def int_to_alpha(user_id: int) -> str: + alphabet = list(ascii_lowercase)[:10] + user_id = str(user_id) + return "".join(alphabet[int(i)] for i in user_id) + + +async def extract_userid(message, text: str): + """ + NOT TO BE USED OUTSIDE THIS FILE + """ + + def is_int(text: str): + try: + int(text) + except ValueError: + return False + return True + + text = text.strip() + + if is_int(text): + return int(text) + + entities = message.entities + if len(entities) < 2: + return (await app.get_users(text)).id + entity = entities[1] + if entity.type == enums.MessageEntityType.MENTION: + return (await app.get_users(text)).id + if entity.type == enums.MessageEntityType.MENTION: + return entity.user.id + return None + + +async def extract_user_and_reason(message, sender_chat=False): + args = message.text.strip().split() + text = message.text + user = None + reason = None + if message.reply_to_message: + reply = message.reply_to_message + # if reply to a message and no reason is given + if reply.from_user: + id_ = reply.from_user.id + + elif reply.sender_chat and reply.sender_chat != message.chat.id and sender_chat: + id_ = reply.sender_chat.id + else: + return None, None + reason = None if len(args) < 2 else text.split(None, 1)[1] + return id_, reason + + # if not reply to a message and no reason is given + if len(args) == 2: + user = text.split(None, 1)[1] + return await extract_userid(message, user), None + + # if reason is given + if len(args) > 2: + user, reason = text.split(None, 2)[1:] + return await extract_userid(message, user), reason + + return user, reason + + +async def extract_user(message): + return (await extract_user_and_reason(message))[0] + + +async def time_converter(message, time_value: str) -> int: + unit = ["m", "h", "d"] # m == minutes | h == hours | d == days + check_unit = "".join(list(filter(time_value[-1].lower().endswith, unit))) + currunt_time = datetime.now() + time_digit = time_value[:-1] + if not time_digit.isdigit(): + return await message.reply_text("Incorrect time specified") + if check_unit == "m": + temp_time = currunt_time + timedelta(minutes=int(time_digit)) + elif check_unit == "h": + temp_time = currunt_time + timedelta(hours=int(time_digit)) + elif check_unit == "d": + temp_time = currunt_time + timedelta(days=int(time_digit)) + else: + return await message.reply_text("Incorrect time specified.") + return int(datetime.timestamp(temp_time)) + + +def extract_text_and_keyb(ikb, text: str, row_width: int = 2): + keyboard = {} + try: + text = text.strip() + text = text.removeprefix("`") + text = text.removesuffix("`") + text, keyb = text.split("~") + + keyb = findall(r"\[.+\,.+\]", keyb) + for btn_str in keyb: + btn_str = re_sub(r"[\[\]]", "", btn_str) + btn_str = btn_str.split(",") + btn_txt, btn_url = btn_str[0], btn_str[1].strip() + + if not get_urls_from_text(btn_url): + continue + keyboard[btn_txt] = btn_url + keyboard = ikb(keyboard, row_width) + except Exception: + return + return text, keyboard diff --git a/misskaty/helper/http.py b/misskaty/helper/http.py new file mode 100644 index 00000000..3345a068 --- /dev/null +++ b/misskaty/helper/http.py @@ -0,0 +1,61 @@ +from asyncio import gather + +import httpx +from aiohttp import ClientSession + +# Aiohttp Async Client +session = ClientSession() + +# HTTPx Async Client +http = httpx.AsyncClient( + http2=True, + verify=False, + timeout=httpx.Timeout(40), +) + + +async def get(url: str, *args, **kwargs): + async with session.get(url, *args, **kwargs) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data + + +async def head(url: str, *args, **kwargs): + async with session.head(url, *args, **kwargs) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data + + +async def post(url: str, *args, **kwargs): + async with session.post(url, *args, **kwargs) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data + + +async def multiget(url: str, times: int, *args, **kwargs): + return await gather(*[get(url, *args, **kwargs) for _ in range(times)]) + + +async def multihead(url: str, times: int, *args, **kwargs): + return await gather(*[head(url, *args, **kwargs) for _ in range(times)]) + + +async def multipost(url: str, times: int, *args, **kwargs): + return await gather(*[post(url, *args, **kwargs) for _ in range(times)]) + + +async def resp_get(url: str, *args, **kwargs): + return await session.get(url, *args, **kwargs) + + +async def resp_post(url: str, *args, **kwargs): + return await session.post(url, *args, **kwargs) diff --git a/misskaty/helper/human_read.py b/misskaty/helper/human_read.py new file mode 100644 index 00000000..93105efa --- /dev/null +++ b/misskaty/helper/human_read.py @@ -0,0 +1,62 @@ +SIZE_UNITS = ["B", "KB", "MB", "GB", "TB", "PB"] + + +def get_readable_file_size(size_in_bytes) -> str: + if size_in_bytes is None: + return "0B" + index = 0 + while size_in_bytes >= 1024: + size_in_bytes /= 1024 + index += 1 + try: + return f"{round(size_in_bytes, 2)}{SIZE_UNITS[index]}" + except IndexError: + return "File too large" + + +def get_readable_time(seconds: int) -> str: + result = "" + (days, remainder) = divmod(seconds, 86400) + days = int(days) + if days != 0: + result += f"{days}d " + (hours, remainder) = divmod(remainder, 3600) + hours = int(hours) + if hours != 0: + result += f"{hours}h " + (minutes, seconds) = divmod(remainder, 60) + minutes = int(minutes) + if minutes != 0: + result += f"{minutes}m " + seconds = int(seconds) + result += f"{seconds}s " + return result + + +def get_readable_bitrate(bitrate_kbps): + return ( + f"{str(round(bitrate_kbps / 1000, 2))} Mb/s" + if bitrate_kbps > 10000 + else f"{str(round(bitrate_kbps, 2))} kb/s" + ) + + +def get_readable_time2(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "m", "h", "d", "w", "m", "y"] + while count < 4: + count += 1 + remainder, result = divmod(seconds, 60) if count < 3 else 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 += f"{time_list.pop()}, " + time_list.reverse() + ping_time += ":".join(time_list) + return ping_time diff --git a/misskaty/helper/kuso_utils.py b/misskaty/helper/kuso_utils.py new file mode 100644 index 00000000..f1104e88 --- /dev/null +++ b/misskaty/helper/kuso_utils.py @@ -0,0 +1,197 @@ +import logging +import traceback +from html import escape + +import chevron +from bs4 import BeautifulSoup +from telegraph.aio import Telegraph + +from misskaty import BOT_USERNAME +from misskaty.helper.http import http + +LOGGER = logging.getLogger(__name__) + +headers = { + "Accept": "*/*", + "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582", +} + + +async def kusonimeBypass(url: str, slug=None): + result = {} + _url = url + if slug: + noslug_url = "https://kusonime.com/{slug}" + _url = noslug_url.format({"slug": slug}) + try: + page = await http.get(_url, headers=headers) + soup = BeautifulSoup(page.text, "lxml") + thumb = soup.find("div", {"class": "post-thumb"}).find("img").get("src") + data = [] + try: + title = soup.find("h1", {"class": "jdlz"}).text # fix title njing haha + season = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(3)" + )[0] + .text.split(":") + .pop() + .strip() + ) + tipe = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(5)" + )[0] + .text.split(":") + .pop() + .strip() + ) + status_anime = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(6)" + )[0] + .text.split(":") + .pop() + .strip() + ) + ep = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(7)" + )[0] + .text.split(":") + .pop() + .strip() + ) + score = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(8)" + )[0] + .text.split(":") + .pop() + .strip() + ) + duration = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(9)" + )[0] + .text.split(":") + .pop() + .strip() + ) + rilis = ( + soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(10)" + )[0] + .text.split(":") + .pop() + .strip() + ) + except Exception: + e = traceback.format_exc() + LOGGER.error(e) + title, season, tipe, status_anime, ep, score, duration, rilis = ( + "None", + "None", + "None", + "None", + 0, + 0, + 0, + "None", + ) + genre = [] + for _genre in soup.select( + "#venkonten > div.vezone > div.venser > div.venutama > div.lexot > div.info > p:nth-child(2)" + ): + gen = _genre.text.split(":").pop().strip().split(", ") + genre = gen + for _, smokedl in enumerate( + soup.find("div", {"class": "dlbodz"}).find_all( + "div", {"class": "smokeddlrh"} + ), + start=1, + ): + mendata = {"name": title, "links": []} + for smokeurl in smokedl.find_all("div", {"class": "smokeurlrh"}): + quality = smokeurl.find("strong").text + links = [] + for link in smokeurl.find_all("a"): + url = link.get("href") + client = link.text + links.append({"client": client, "url": url}) + mendata["links"].append({"quality": quality, "link_download": links}) + data.append(mendata) + result |= { + "error": False, + "title": title, + "thumb": thumb, + "genre": genre, + "genre_string": ", ".join(genre), + "status_anime": status_anime, + "season": season, + "tipe": tipe, + "ep": ep, + "score": score, + "duration": duration, + "rilis": rilis, + "data": data, + } + except Exception: + err = traceback.format_exc() + LOGGER.error(err) + result |= {"error": True, "error_message": err} + await http.delete(_url) + return result + + +async def byPassPh(url: str, name: str): + kusonime = await kusonimeBypass(url) + results = {"error": True, "error_message": kusonime} + if not kusonime["error"]: + template = """ + + +

    Title : {{title}}

    +

    Genre : {{genre_string}}

    +

    Season : {{season}}

    +

    Type : {{tipe}}

    +

    Status : {{status_anime}}

    +

    Total Episode : {{ep}}

    +

    Score : {{score}}

    +

    Duration : {{duration}}

    +

    Released on : {{rilis}}

    +

    +{{#data}} +

    {{name}}

    + {{#links}} +

    Resolution: {{quality}}

    + {{#link_download}} +

    {{client}}

    + {{/link_download}} + {{/links}} +
    +{{/data}} +""".strip() + html = chevron.render(template, kusonime) + telegraph = Telegraph() + if not telegraph.get_access_token(): + await telegraph.create_account(short_name=BOT_USERNAME) + page = await telegraph.create_page( + f"{kusonime.get('title')} By {escape(name)}", html_content=html + ) + results |= {"error": False, "url": f'https://telegra.ph/{page["path"]}'} + del results["error_message"] + return results + + +class Kusonime: + def __init__(self): # skipcq + pass + + @staticmethod + async def byPass(url): + return await kusonimeBypass(url) + + @staticmethod + async def telegraph(url, name): + return await byPassPh(url, name) diff --git a/misskaty/helper/localization.py b/misskaty/helper/localization.py new file mode 100644 index 00000000..9168d35b --- /dev/null +++ b/misskaty/helper/localization.py @@ -0,0 +1,106 @@ +import inspect +import json +import os.path +from functools import partial, wraps +from glob import glob +from typing import Dict, List + +from pyrogram.enums import ChatType +from pyrogram.types import CallbackQuery, InlineQuery, Message + +from database.locale_db import get_db_lang + +enabled_locales: List[str] = [ + # "en-GB", # English (United Kingdom) + "en-US", # English (United States) + "id-ID", # Indonesian + "id-JW", # Javanese +] + +default_language: str = "en-US" + + +def cache_localizations(files: List[str]) -> Dict[str, Dict[str, Dict[str, str]]]: + ldict = {lang: {} for lang in enabled_locales} + for file in files: + _, lname, pname = file.split(os.path.sep) + pname = pname.split(".")[0] + dic = json.load(open(file, encoding="utf-8")) + dic.update(ldict[lname].get(pname, {})) + ldict[lname][pname] = dic + return ldict + + +jsons: List[str] = [] + +for locale in enabled_locales: + jsons += glob(os.path.join("locales", locale, "*.json")) + +langdict = cache_localizations(jsons) + + +def get_locale_string( + dic: dict, language: str, default_context: str, key: str, context: str = None +) -> str: + if context: + default_context = context + dic = langdict[language].get(context, langdict[default_language][context]) + res: str = ( + dic.get(key) or langdict[default_language][default_context].get(key) or key + ) + return res + + +async def get_lang(message) -> str: + if isinstance(message, CallbackQuery): + chat = message.message.chat + elif isinstance(message, Message): + chat = message.chat + elif isinstance(message, InlineQuery): + chat, chat.type = message.from_user, ChatType.PRIVATE + else: + raise TypeError(f"Update type '{message.__name__}' is not supported.") + + lang = await get_db_lang(chat.id) + + if chat.type == ChatType.PRIVATE: + lang = lang or message.from_user.language_code or default_language + else: + lang = lang or default_language + # User has a language_code without hyphen + if len(lang.split("-")) == 1: + # Try to find a language that starts with the provided language_code + for locale_ in enabled_locales: + if locale_.startswith(lang): + lang = locale_ + elif lang.split("-")[1].islower(): + lang = lang.split("-") + lang[1] = lang[1].upper() + lang = "-".join(lang) + return lang if lang in enabled_locales else default_language + + +def use_chat_lang(context: str = None): + if not context: + cwd = os.getcwd() + frame = inspect.stack()[1] + + fname = frame.filename + + if fname.startswith(cwd): + fname = fname[len(cwd) + 1 :] + context = fname.split(os.path.sep)[2].split(".")[0] + + def decorator(func): + @wraps(func) + async def wrapper(client, message): + lang = await get_lang(message) + + dic = langdict.get(lang, langdict[default_language]) + + lfunc = partial(get_locale_string, dic.get(context, {}), lang, context) + return await func(client, message, lfunc) + + return wrapper + + return decorator diff --git a/misskaty/helper/media_helper.py b/misskaty/helper/media_helper.py new file mode 100644 index 00000000..1efb8564 --- /dev/null +++ b/misskaty/helper/media_helper.py @@ -0,0 +1,78 @@ +import asyncio +import os +import shlex +from typing import Tuple + +from telegraph.aio import Telegraph + +from misskaty import BOT_USERNAME + + +async def post_to_telegraph(is_media: bool, title=None, content=None, media=None): + telegraph = Telegraph() + if telegraph.get_access_token() is None: + await telegraph.create_account(short_name=BOT_USERNAME) + if is_media: + # Create a Telegram Post Foto/Video + response = await telegraph.upload_file(media) + return f"https://telegra.ph{response[0]['src']}" + # Create a Telegram Post using HTML Content + response = await telegraph.create_page( + title, + html_content=content, + author_url=f"https://t.me/{BOT_USERNAME}", + author_name=BOT_USERNAME, + ) + return response["url"] + + +async def run_subprocess(cmd): + process = await asyncio.create_subprocess_exec( + *cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + return await process.communicate() + + +async def get_media_info(file_link): + ffprobe_cmd = [ + "ffprobe", + "-headers", + "IAM:''", + "-i", + file_link, + "-v", + "quiet", + "-of", + "json", + "-show_streams", + "-show_format", + "-show_chapters", + "-show_programs", + ] + data, _ = await run_subprocess(ffprobe_cmd) + return data + + +async def runcmd(cmd: str) -> Tuple[str, str, int, int]: + """run command in terminal""" + args = shlex.split(cmd) + process = await asyncio.create_subprocess_exec( + *args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await process.communicate() + return ( + stdout.decode("utf-8", "replace").strip(), + stderr.decode("utf-8", "replace").strip(), + process.returncode, + process.pid, + ) + + +# Solves ValueError: No closing quotation by removing ' or " in file name +def safe_filename(path_): + if path_ is None: + return + safename = path_.replace("'", "").replace('"', "") + if safename != path_: + os.rename(path_, safename) + return safename diff --git a/misskaty/helper/mediainfo_paste.py b/misskaty/helper/mediainfo_paste.py new file mode 100644 index 00000000..d65956ac --- /dev/null +++ b/misskaty/helper/mediainfo_paste.py @@ -0,0 +1,226 @@ +css = """ + + +""" + +import json +import re + +from .http import http + + +def html_builder(title: str, text: str) -> str: + """ + Make proper html with css from given content. + """ + + heading = "{content}" + subheading = "{content}" + infobox = "" + subtitlebox = "" + icon = "" + html_msg = f"{heading.format(content=title)}" + + for line in text.splitlines(): + if ":" not in line and bool(line): + if "Text #" in line: + if bool(re.search("Text #1$", line)): + subtitle_count = len(re.findall("Text #", text)) + html_msg += icon.format( + icon_url="https://te.legra.ph/file/9d4a676445544d0f2d6db.png" + ) + html_msg += subheading.format( + content=f"Subtitles ({subtitle_count} subtitle)" + ) + html_msg += "" + + elif "General" in line: + html_msg += icon.format( + icon_url="https://te.legra.ph/file/638fb0416f2600e7c5aa3.png" + ) + html_msg += subheading.format(content="General") + + elif "Video" in line: + html_msg += icon.format( + icon_url="https://te.legra.ph/file/fbc30d71cf71c9a54e59d.png" + ) + html_msg += subheading.format(content="Video") + + elif "Audio" in line: + html_msg += icon.format( + icon_url="https://te.legra.ph/file/a3c431be457fedbae2286.png" + ) + html_msg += subheading.format(content=f"{line.strip()}") + + elif "Menu" in line: + html_msg += "" + html_msg += icon.format( + icon_url="https://te.legra.ph/file/3023b0c2bc202ec9d6d0d.png" + ) + html_msg += subheading.format(content="Chapters") + + else: + html_msg += subheading.format(content=f"{line.strip()}") + html_msg += subtitlebox if "Text #" in line else infobox + + elif ":" in line: + if "Attachments" not in line and "ErrorDetectionType" not in line: + html_msg += f"
    {line.strip()}
    " + + else: + html_msg += "
    " + + html_msg += "
    " + return css + html_msg + + +async def mediainfo_paste(text: str, title: str) -> str: + html_content = html_builder(title, text) + URL = "https://mediainfo-1-y5870653.deta.app/api" + response = await http.post(URL, json={"content": html_content}) + return ( + f"https://mediainfo-1-y5870653.deta.app/{json.loads(response.content)['key']}" + ) diff --git a/misskaty/helper/misc.py b/misskaty/helper/misc.py new file mode 100644 index 00000000..3c0919f5 --- /dev/null +++ b/misskaty/helper/misc.py @@ -0,0 +1,83 @@ +from math import ceil + +from pyrogram.types import InlineKeyboardButton + +from misskaty import MOD_LOAD, MOD_NOLOAD + + +# skipcq: PYL-W1641 +class EqInlineKeyboardButton(InlineKeyboardButton): + def __eq__(self, other): + return self.text == other.text + + def __lt__(self, other): + return self.text < other.text + + def __gt__(self, other): + return self.text > other.text + + +def paginate_modules(page_n, module_dict, prefix, chat=None): + modules = ( + sorted( + [ + EqInlineKeyboardButton( + x.__MODULE__, + callback_data=f"{prefix}_module({chat},{x.__MODULE__.lower()})", + ) + for x in module_dict.values() + ] + ) + if chat + else sorted( + [ + EqInlineKeyboardButton( + x.__MODULE__, + callback_data=f"{prefix}_module({x.__MODULE__.lower()})", + ) + for x in module_dict.values() + ] + ) + ) + + pairs = list(zip(modules[::3], modules[1::3], modules[2::3])) + i = 0 + for m in pairs: + for _ in m: + i += 1 + if len(modules) - i == 1: + pairs.append((modules[-1],)) + elif len(modules) - i == 2: + pairs.append( + ( + modules[-2], + modules[-1], + ) + ) + + COLUMN_SIZE = 4 + + max_num_pages = ceil(len(pairs) / COLUMN_SIZE) + modulo_page = page_n % max_num_pages + + # can only have a certain amount of buttons side by side + if len(pairs) > COLUMN_SIZE: + pairs = pairs[modulo_page * COLUMN_SIZE : COLUMN_SIZE * (modulo_page + 1)] + [ + ( + EqInlineKeyboardButton( + "❮", callback_data=f"{prefix}_prev({modulo_page})" + ), + EqInlineKeyboardButton( + "Back", callback_data=f"{prefix}_home({modulo_page})" + ), + EqInlineKeyboardButton( + "❯", callback_data=f"{prefix}_next({modulo_page})" + ), + ) + ] + + return pairs + + +def is_module_loaded(name): + return (not MOD_LOAD or name in MOD_LOAD) and name not in MOD_NOLOAD diff --git a/misskaty/helper/pyro_progress.py b/misskaty/helper/pyro_progress.py new file mode 100644 index 00000000..23e2aa4f --- /dev/null +++ b/misskaty/helper/pyro_progress.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# (c) Shrimadhav U K + +import asyncio +import math +import time + +from pyrogram.errors import FloodWait, MessageIdInvalid, MessageNotModified + + +async def progress_for_pyrogram(current, total, ud_type, message, start, dc_id): + """generic progress display for Telegram Upload / Download status""" + now = time.time() + diff = now - start + if round(diff % 10.00) == 0 or current == total: + percentage = current * 100 / total + elapsed_time = round(diff) + if elapsed_time == 0: + return + speed = current / diff + time_to_completion = round((total - current) / speed) + estimated_total_time = elapsed_time + time_to_completion + + elapsed_time = time_formatter(elapsed_time) + estimated_total_time = time_formatter(estimated_total_time) + + progress = "[{0}{1}] \nP: {2}%\n".format( + "".join(["●" for _ in range(math.floor(percentage / 5))]), + "".join(["○" for _ in range(20 - math.floor(percentage / 5))]), + round(percentage, 2), + ) + + tmp = ( + progress + + "{0} of {1}\nSpeed: {2}/s\nDC ID: {3}\nETA: {4}
    \n".format( + humanbytes(current), + humanbytes(total), + humanbytes(speed), + dc_id, + estimated_total_time if estimated_total_time != "" else "0 s", + ) + ) + try: + await message.edit(f"{ud_type}\n {tmp}") + except FloodWait as e: + await asyncio.sleep(e.value) + await message.edit(f"{ud_type}\n {tmp}") + except (MessageNotModified, MessageIdInvalid): + pass + + +def humanbytes(size: int) -> str: + """converts bytes into human readable format""" + # https://stackoverflow.com/a/49361727/4723940 + # 2**10 = 1024 + if not size: + return "" + power = 2**10 + number = 0 + dict_power_n = {0: " ", 1: "Ki", 2: "Mi", 3: "Gi", 4: "Ti"} + while size > power: + size /= power + number += 1 + return f"{str(round(size, 2))} {dict_power_n[number]}B" + + +def time_formatter(seconds: int) -> str: + result = "" + v_m = 0 + remainder = seconds + r_ange_s = {"days": (24 * 60 * 60), "hours": (60 * 60), "minutes": 60, "seconds": 1} + for age, divisor in r_ange_s.items(): + v_m, remainder = divmod(remainder, divisor) + v_m = int(v_m) + if v_m != 0: + result += f" {v_m} {age} " + return result diff --git a/misskaty/helper/sqlite_helper.py b/misskaty/helper/sqlite_helper.py new file mode 100644 index 00000000..3285a625 --- /dev/null +++ b/misskaty/helper/sqlite_helper.py @@ -0,0 +1,565 @@ +import os +import pickle +import sqlite3 +from contextlib import suppress +from datetime import datetime, timedelta, timezone +from functools import wraps +from pathlib import Path +from threading import local +from typing import Any, Callable, Dict, List, Literal, Optional, Tuple + +__all__ = ["Cache"] + + +class Cache: + """Simple SQLite Cache.""" + + PICKLE_PROTOCOL = pickle.HIGHEST_PROTOCOL + DEFAULT_TIMEOUT = 300 + DEFAULT_PRAGMA = { + "mmap_size": 2**26, # https://www.sqlite.org/pragma.html#pragma_mmap_size + "cache_size": 8192, # https://www.sqlite.org/pragma.html#pragma_cache_size + "wal_autocheckpoint": 1000, # https://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint + "auto_vacuum": "none", # https://www.sqlite.org/pragma.html#pragma_auto_vacuum + "synchronous": "off", # https://www.sqlite.org/pragma.html#pragma_synchronous + "journal_mode": "wal", # https://www.sqlite.org/pragma.html#pragma_journal_mode + "temp_store": "file", # https://www.sqlite.org/pragma.html#pragma_temp_store + } + + _transaction_sql = "BEGIN EXCLUSIVE TRANSACTION; {} COMMIT TRANSACTION;" + + _create_sql = "CREATE TABLE IF NOT EXISTS cache (key TEXT PRIMARY KEY, value BLOB, exp FLOAT);" + _create_index_sql = "CREATE UNIQUE INDEX IF NOT EXISTS cache_key ON cache(key);" + _set_pragma = "PRAGMA {};" + _set_pragma_equal = "PRAGMA {}={};" + + _add_sql = ( + "INSERT INTO cache (key, value, exp) VALUES (:key, :value, :exp) " + "ON CONFLICT(key) DO UPDATE SET value = :value, exp = :exp " + "WHERE (exp <> -1.0 AND DATETIME(exp, 'unixepoch') <= DATETIME('now'));" + ) + _get_sql = "SELECT value, exp FROM cache WHERE key = :key;" + _set_sql = ( + "INSERT INTO cache (key, value, exp) VALUES (:key, :value, :exp) " + "ON CONFLICT(key) DO UPDATE SET value = :value, exp = :exp;" + ) + _check_sql = ( + "SELECT value, exp FROM cache WHERE key = :key " + "AND (exp = -1.0 OR DATETIME(exp, 'unixepoch') > DATETIME('now'));" + ) + _update_sql = ( + "UPDATE cache SET value = :value WHERE key = :key " + "AND (exp = -1.0 OR DATETIME(exp, 'unixepoch') > DATETIME('now'));" + ) + + # TODO: add 'RETURNING COUNT(*)!=0' to these when sqlite3 version >=3.35.0 + _delete_sql = "DELETE FROM cache WHERE key = :key;" + _touch_sql = ( + "UPDATE cache SET exp = :exp WHERE key = :key " + "AND (exp = -1.0 OR DATETIME(exp, 'unixepoch') > DATETIME('now'));" + ) + _clear_sql = "DELETE FROM cache;" + + _add_many_sql = ( + "INSERT INTO cache (key, value, exp) VALUES {}" + "ON CONFLICT(key) DO UPDATE SET value = excluded.value, exp = excluded.exp " + "WHERE (exp <> -1.0 AND DATETIME(exp, 'unixepoch') <= DATETIME('now'));" + ) + _get_many_sql = "SELECT key, value, exp FROM cache WHERE key IN ({});" + _set_many_sql = ( + "INSERT INTO cache (key, value, exp) VALUES {}" + "ON CONFLICT(key) DO UPDATE SET value = excluded.value, exp = excluded.exp;" + ) + _delete_many_sql = "DELETE FROM cache WHERE key IN ({});" + + def __init__( + self, + *, + filename: str = ".cache", + path: str = None, + in_memory: bool = True, + timeout: int = 5, + isolation_level: Optional[ + Literal["DEFERRED", "IMMEDIATE", "EXCLUSIVE"] + ] = "DEFERRED", + **kwargs, + ): + """Create a cache using sqlite3. + + :param filename: Cache file name. + :param path: Path string to the wanted db location. If None, use current directory. + :param in_memory: Create database in-memory only. A file is still created, but nothing is stored in it. + :param timeout: Cache connection timeout. + :param isolation_level: Controls the transaction handling performed by sqlite3. + If set to None, transactions are never implicitly opened. + https://www.sqlite.org/lang_transaction.html + :param kwargs: Pragma settings. https://www.sqlite.org/pragma.html + """ + + filepath = filename if path is None else str(Path(path) / filename) + suffix = ":?mode=memory&cache=shared" if in_memory else "" + self.connection_string = f"{filepath}{suffix}" + self.pragma = {**kwargs, **self.DEFAULT_PRAGMA} + self.timeout = timeout + self.path = path + self.isolation_level = isolation_level + self.local = local() + self.local.instances = getattr(self.local, "instances", 0) + 1 + + self._con.execute(self._create_sql) + self._con.execute(self._create_index_sql) + self._con.commit() + + @property + def _con(self) -> sqlite3.Connection: + if not os.path.exists(self.path): + os.mkdir(self.path) + try: + return self.local.con + except AttributeError: + self.local.con = sqlite3.connect( + self.connection_string, + timeout=self.timeout, + isolation_level=self.isolation_level, + ) + self._apply_pragma() + return self.local.con + + def __getitem__(self, item: str) -> Any: + value = self.get(item) + if value is None: + raise KeyError("Key not in cache.") + return value + + def __setitem__(self, item: str, value: Any) -> None: + self.set(item, value) + + def __delitem__(self, key): + self.delete(key) + + def __contains__(self, key): + return self._con.execute(self._check_sql, {"key": key}).fetchone() is not None + + def __enter__(self): + self._con # noqa pylint: disable=W0104 + return self + + def __exit__(self, *args): + self.close() + + def __del__(self): + self.local.instances = getattr(self.local, "instances", 0) - 1 + if self.local.instances <= 0: + self.close() + + def close(self) -> None: + """Closes the cache.""" + self._con.execute( + self._set_pragma.format("optimize") + ) # https://www.sqlite.org/pragma.html#pragma_optimize + self._con.close() + with suppress(AttributeError): + delattr(self.local, "con") + + def _apply_pragma(self): + for key, value in self.pragma.items(): + self._con.execute(self._set_pragma_equal.format(key, value)) + + @staticmethod + def _exp_timestamp(timeout: int = DEFAULT_TIMEOUT) -> float: + if timeout < 0: + return -1.0 + return (datetime.now(tz=timezone.utc) + timedelta(seconds=timeout)).timestamp() + + @staticmethod + def _exp_datetime(exp: float) -> Optional[datetime]: + if exp == -1.0: + return None + return datetime.utcfromtimestamp(exp) + + def _stream(self, value: Any) -> bytes: + return pickle.dumps(value, protocol=self.PICKLE_PROTOCOL) + + def _unstream(self, value: bytes) -> Any: + return pickle.loads(value) # noqa: S301 + + def add(self, key: str, value: Any, timeout: int = DEFAULT_TIMEOUT) -> None: + """Set the value to the cache only if the key is not already in the cache, + or the found value has expired. + + :param key: Cache key. + :param value: Picklable object to store. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + data = { + "key": key, + "value": self._stream(value), + "exp": self._exp_timestamp(timeout), + } + self._con.execute(self._add_sql, data) + self._con.commit() + + def get(self, key: str, default: Any = None) -> Any: + """Get the value under some key. Return `default` if key not in the cache or expired. + + :param key: Cache key. + :param default: Value to return if key not in the cache. + """ + result: Optional[Tuple[bytes, float]] = self._con.execute( + self._get_sql, {"key": key} + ).fetchone() + + if result is None: + return default + + exp = self._exp_datetime(result[1]) + if exp is not None and datetime.utcnow() >= exp: + self._con.execute(self._delete_sql, {"key": key}) + self._con.commit() + return default + + return self._unstream(result[0]) + + def set(self, key: str, value: Any, timeout: int = DEFAULT_TIMEOUT) -> None: + """Set a value in cache under some key. + + :param key: Cache key. + :param value: Picklable object to store. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + data = { + "key": key, + "value": self._stream(value), + "exp": self._exp_timestamp(timeout), + } + self._con.execute(self._set_sql, data) + self._con.commit() + + def update(self, key: str, value: Any) -> None: + """Update value in the cache. Does nothing if key not in the cache or expired. + + :param key: Cache key. + :param value: Picklable object to store. + """ + data = {"key": key, "value": self._stream(value)} + self._con.execute(self._update_sql, data) + self._con.commit() + + def touch(self, key: str, timeout: int = DEFAULT_TIMEOUT) -> None: + """Extend the lifetime of an object in cache. Does nothing if key is not in the cache or is expired. + + :param key: Cache key. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + data = {"exp": self._exp_timestamp(timeout), "key": key} + self._con.execute(self._touch_sql, data) + self._con.commit() + + def delete(self, key: str) -> None: + """Remove the value under the given key from the cache. Does nothing if key is not in the cache. + + :param key: Cache key. + """ + self._con.execute(self._delete_sql, {"key": key}) + self._con.commit() + + def add_many(self, dict_: Dict[str, Any], timeout: int = DEFAULT_TIMEOUT) -> None: + """For all keys in the given dict, add the value to the cache only if the key is not + already in the cache, or the found value has expired. + + :param dict_: Cache keys with values to add. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + command = self._add_many_sql.format( + ", ".join([f"(:key{n}, :value{n}, :exp{n})" for n in range(len(dict_))]) + ) + + data = {} + exp = self._exp_timestamp(timeout) + for i, (key, value) in enumerate(dict_.items()): + data[f"key{i}"] = key + data[f"value{i}"] = self._stream(value) + data[f"exp{i}"] = exp + + self._con.execute(command, data) + self._con.commit() + + def get_many(self, keys: List[str]) -> Dict[str, Any]: + """Get all values that exist and aren't expired from the given cache keys, and return a dict. + + :param keys: List of cache keys. + """ + seq = ", ".join([f"'{value}'" for value in keys]) + fetched: List[Tuple[str, Any, float]] = self._con.execute( + self._get_many_sql.format(seq) + ).fetchall() + + if not fetched: + return {} + + results: Dict[str, Any] = {} + to_delete: List[str] = [] + for key, value, exp in fetched: + exp = self._exp_datetime(exp) + if exp is not None and datetime.utcnow() >= exp: + to_delete.append(key) + continue + + results[key] = self._unstream(value) + + if to_delete: + self._con.execute( + self._delete_many_sql.format( + ", ".join([f"'{value}'" for value in to_delete]) + ) + ) + self._con.commit() + + return results + + def set_many(self, dict_: Dict[str, Any], timeout: int = DEFAULT_TIMEOUT) -> None: + """Set values to the cache for all keys in the given dict. + + :param dict_: Cache keys with values to set. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + command = self._set_many_sql.format( + ", ".join([f"(:key{n}, :value{n}, :exp{n})" for n in range(len(dict_))]) + ) + + data = {} + exp = self._exp_timestamp(timeout) + for i, (key, value) in enumerate(dict_.items()): + data[f"key{i}"] = key + data[f"value{i}"] = self._stream(value) + data[f"exp{i}"] = exp + + self._con.execute(command, data) + self._con.commit() + + def update_many(self, dict_: Dict[str, Any]) -> None: + """Update values to the cache for all keys in the given dict. Does nothing if key not in cache or expired. + + :param dict_:Cache keys with values to update to. + """ + seq = [ + {"key": key, "value": self._stream(value)} for key, value in dict_.items() + ] + self._con.executemany(self._update_sql, seq) + self._con.commit() + + def touch_many(self, keys: List[str], timeout: int = DEFAULT_TIMEOUT) -> None: + """Extend the lifetime for all objects under the given keys in cache. + Does nothing if a key is not in the cache or is expired. + + :param keys: List of cache keys. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + exp = self._exp_timestamp(timeout) + seq = [{"key": key, "exp": exp} for key in keys] + self._con.executemany(self._touch_sql, seq) + self._con.commit() + + def delete_many(self, keys: List[str]) -> None: + """Remove all the values under the given keys from the cache. + + :param keys: List of cache keys. + """ + self._con.execute( + self._delete_many_sql.format(", ".join([f"'{value}'" for value in keys])) + ) + self._con.commit() + + def get_or_set(self, key: str, default: Any, timeout: int = DEFAULT_TIMEOUT) -> Any: + """Get a value under some key, or set the default if key is not in cache. + + :param key: Cache key. + :param default: Picklable object to store if key is not in cache. + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + result: Optional[Tuple[bytes, float]] = self._con.execute( + self._get_sql, {"key": key} + ).fetchone() + + if result is not None: + exp = self._exp_datetime(result[1]) + if exp is not None and datetime.utcnow() >= exp: + self._con.execute(self._delete_sql, {"key": key}) + else: + return self._unstream(result[0]) + + data = { + "key": key, + "value": self._stream(default), + "exp": self._exp_timestamp(timeout), + } + self._con.execute(self._set_sql, data) + self._con.commit() + return default + + def get_all(self) -> Dict[str, Any]: + """Get all key-value pairs from the cache.""" + all_data = self._con.execute("SELECT key, value FROM cache;").fetchall() + results = {} + for key, value in all_data: + results[key] = self._unstream(value) + return results + + def clear(self) -> None: + """Clear the cache from all values.""" + self._con.execute(self._clear_sql) + self._con.commit() + + def incr(self, key: str, delta: int = 1) -> int: + """Increment the value in cache by the given delta. + Note that this is not an atomic transaction! + + :param key: Cache key. + :param delta: How much to increment. + :raises ValueError: Value cannot be incremented. + """ + result: Optional[Tuple[bytes, float]] = self._con.execute( + self._check_sql, {"key": key} + ).fetchone() + + if result is None: + raise ValueError("Nonexistent or expired cache key.") + + value = self._unstream(result[0]) + if not isinstance(value, int): + raise ValueError("Value is not a number.") + + new_value = value + delta + self._con.execute( + self._update_sql, {"key": key, "value": self._stream(new_value)} + ) + self._con.commit() + return new_value + + def decr(self, key: str, delta: int = 1) -> int: + """Decrement the value in cache by the given delta. + Note that this is not an atomic transaction! + + :param key: Cache key. + :param delta: How much to decrement. + :raises ValueError: Value cannot be decremented. + """ + result: Optional[Tuple[bytes, float]] = self._con.execute( + self._check_sql, {"key": key} + ).fetchone() + + if result is None: + raise ValueError("Nonexistent or expired cache key.") + + value = self._unstream(result[0]) + if not isinstance(value, int): + raise ValueError("Value is not a number.") + + new_value = value - delta + self._con.execute( + self._update_sql, {"key": key, "value": self._stream(new_value)} + ) + self._con.commit() + return new_value + + def memoize( + self, timeout: int = DEFAULT_TIMEOUT + ) -> Callable[[Callable[..., Any]], Callable[..., Any]]: + """Save the result of the decorated function in cache. Calls with different + arguments are saved under different keys. + + :param timeout: How long the value is valid in the cache. + Negative numbers will keep the key in cache until manually removed. + """ + + def decorator(func: Callable[..., Any]) -> Callable[..., Any]: + @wraps(func) + def wrapper(*args, **kwargs) -> Callable[..., Any]: + result = self.get(f"{func}-{args}-{kwargs}", obj) + if result == obj: + result = func(*args, **kwargs) + self.set(f"{func}-{args}-{kwargs}", result, timeout) + return result + + return wrapper + + obj = object() + return decorator + + memorize = memoize # for backwards compatibility + + def ttl(self, key: str) -> int: + """How long the key is still valid in the cache in seconds. + Returns `-1` if the value for the key does not expire. + Returns `-2` if the value for the key has expired, or has not been set. + + :param key: Cache key. + """ + result: Optional[Tuple[bytes, float]] = self._con.execute( + self._get_sql, {"key": key} + ).fetchone() + + if result is None: + return -2 + + exp = self._exp_datetime(result[1]) + if exp is None: + return -1 + + ttl = int((exp - datetime.utcnow()).total_seconds()) + if ttl <= 0: + self._con.execute(self._delete_sql, {"key": key}) + self._con.commit() + return -2 + + return ttl + + def ttl_many(self, keys: List[str]) -> Dict[str, int]: + """How long the given keys are still valid in the cache in seconds. + Returns `-1` if a value for the key does not expire. + Returns `-2` if a value for the key has expired, or has not been set. + + :param keys: List of cache keys. + """ + seq = ", ".join([f"'{value}'" for value in keys]) + fetched: List[Tuple[str, Any, float]] = self._con.execute( + self._get_many_sql.format(seq) + ).fetchall() + exp_by_key: Dict[str, float] = {key: exp for key, _, exp in fetched} + + results: Dict[str, int] = {} + to_delete: List[str] = [] + for key in keys: + exp_ = exp_by_key.get(key) + if exp_ is None: + results[key] = -2 + continue + + exp = self._exp_datetime(exp_) + if exp is None: + results[key] = -1 + continue + + if datetime.utcnow() >= exp: + to_delete.append(key) + results[key] = -2 + continue + + results[key] = int((exp - datetime.utcnow()).total_seconds()) + + if to_delete: + self._con.execute( + self._delete_many_sql.format( + ", ".join([f"'{value}'" for value in to_delete]) + ) + ) + self._con.commit() + + return results diff --git a/misskaty/helper/ssgen_template.html b/misskaty/helper/ssgen_template.html new file mode 100644 index 00000000..1517debf --- /dev/null +++ b/misskaty/helper/ssgen_template.html @@ -0,0 +1,6 @@ +Filename: {{filename}} +File size: {{size}} +Duration: {{duration}} +Frame Rate: {{frame_rate}} fps +Resolution: {{sample_width}}x{{sample_height}} +Screenshot by @MissKatyRoBot diff --git a/misskaty/helper/stickerset.py b/misskaty/helper/stickerset.py new file mode 100644 index 00000000..7b42f3d3 --- /dev/null +++ b/misskaty/helper/stickerset.py @@ -0,0 +1,79 @@ +""" +MIT License +Copyright (c) 2021 TheHamkerCat +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 List + +from pyrogram import Client, errors, raw + + +async def get_sticker_set_by_name( + client: Client, name: str +) -> raw.base.messages.StickerSet: + try: + return await client.invoke( + raw.functions.messages.GetStickerSet( + stickerset=raw.types.InputStickerSetShortName(short_name=name), + hash=0, + ) + ) + except errors.exceptions.not_acceptable_406.StickersetInvalid: + return None + + +# Known errors: (I don't see a reason to catch them as we, for sure, won't face them right now): +# errors.exceptions.bad_request_400.PackShortNameInvalid -> pack name needs to end with _by_botname +# errors.exceptions.bad_request_400.ShortnameOccupyFailed -> pack's name is already in use + + +async def create_sticker_set( + client: Client, + owner: int, + title: str, + short_name: str, + stickers: List[raw.base.InputStickerSetItem], +) -> raw.base.messages.StickerSet: + return await client.invoke( + raw.functions.stickers.CreateStickerSet( + user_id=await client.resolve_peer(owner), + title=title, + short_name=short_name, + stickers=stickers, + ) + ) + + +async def add_sticker_to_set( + client: Client, + stickerset: raw.base.messages.StickerSet, + sticker: raw.base.InputStickerSetItem, +) -> raw.base.messages.StickerSet: + return await client.invoke( + raw.functions.stickers.AddStickerToSet( + stickerset=raw.types.InputStickerSetShortName( + short_name=stickerset.set.short_name + ), + sticker=sticker, + ) + ) + + +async def create_sticker( + sticker: raw.base.InputDocument, emoji: str +) -> raw.base.InputStickerSetItem: + return raw.types.InputStickerSetItem(document=sticker, emoji=emoji) diff --git a/misskaty/helper/subscene_helper.py b/misskaty/helper/subscene_helper.py new file mode 100644 index 00000000..c6266084 --- /dev/null +++ b/misskaty/helper/subscene_helper.py @@ -0,0 +1,63 @@ +import cloudscraper +from bs4 import BeautifulSoup + + +async def down_page(url): + f = cloudscraper.create_scraper() + resp = f.get(url).text + soup = BeautifulSoup(resp, "lxml") + maindiv = soup.body.find("div", class_="subtitle").find("div", class_="top left") + title = maindiv.find("div", class_="header").h1.span.text.strip() + try: + imdb = maindiv.find("div", class_="header").h1.a["href"] + except TypeError: + imdb = "" + try: + poster = maindiv.find("div", class_="poster").a["href"] + except: + poster = "" + try: + author_name = ( + maindiv.find("div", class_="header") + .ul.find("li", class_="author") + .a.text.strip() + ) + author_link = f"https://subscene.com{maindiv.find('div', class_='header').ul.find('li', class_='author').a['href']}" + except: + author_link = "" + author_name = "Anonymous" + + download_url = f"https://subscene.com{maindiv.find('div', class_='header').ul.find('li', class_='clearfix').find('div', class_='download').a['href']}" + + try: + comments = ( + maindiv.find("div", class_="header") + .ul.find("li", class_="comment-wrapper") + .find("div", class_="comment") + .text + ) + except: + comments = "" + try: + release = ( + maindiv.find("div", class_="header") + .ul.find("li", class_="release") + .find_all("div") + ) + releases = "" + for i in range(2): + r = release[i].text.strip() + releases = f"{releases}\n{r}" + except Exception: + releases = "" + + return { + "title": title, + "imdb": imdb, + "poster": poster, + "author_name": author_name, + "author_url": author_link, + "download_url": download_url, + "comments": comments, + "releases": releases, + } diff --git a/misskaty/helper/time_gap.py b/misskaty/helper/time_gap.py new file mode 100644 index 00000000..ace9e29d --- /dev/null +++ b/misskaty/helper/time_gap.py @@ -0,0 +1,18 @@ +import time + +GAP = {} + + +async def check_time_gap(user_id: int): + """A Function for checking user time gap! + :parameter user_id Telegram User ID""" + + if str(user_id) in GAP: + current_time = time.time() + previous_time = GAP[str(user_id)] + if round(current_time - previous_time) < 10: + return True, round(previous_time - current_time + 10) + del GAP[str(user_id)] + else: + GAP[str(user_id)] = time.time() + return False, None diff --git a/misskaty/helper/tools.py b/misskaty/helper/tools.py new file mode 100644 index 00000000..03545f5b --- /dev/null +++ b/misskaty/helper/tools.py @@ -0,0 +1,153 @@ +import logging +import os +import random +import string +import time +from http.cookies import SimpleCookie +from re import match as re_match +from urllib.parse import urlparse + +import psutil + +from misskaty import BOT_NAME, UBOT_NAME, botStartTime +from misskaty.helper.http import http +from misskaty.helper.human_read import get_readable_time +from misskaty.plugins import ALL_MODULES + +LOGGER = logging.getLogger(__name__) +URL_REGEX = r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])" +GENRES_EMOJI = { + "Action": "👊", + "Adventure": random.choice(["🪂", "🧗‍♀", "🌋"]), + "Family": "👨‍", + "Musical": "🎸", + "Comedy": "🤣", + "Drama": " 🎭", + "Ecchi": random.choice(["💋", "🥵"]), + "Fantasy": random.choice(["🧞", "🧞‍♂", "🧞‍♀", "🌗"]), + "Hentai": "🔞", + "History": "📜", + "Horror": "☠", + "Mahou Shoujo": "☯", + "Mecha": "🤖", + "Music": "🎸", + "Mystery": "🔮", + "Psychological": "♟", + "Romance": "💞", + "Sci-Fi": "🛸", + "Slice of Life": random.choice(["☘", "🍁"]), + "Sports": "⚽️", + "Supernatural": "🫧", + "Thriller": random.choice(["🥶", "🔪", "🤯"]), +} + + +def is_url(url): + url = re_match(URL_REGEX, url) + return bool(url) + + +async def bot_sys_stats(): + bot_uptime = int(time.time() - botStartTime) + cpu = psutil.cpu_percent(interval=0.5) + mem = psutil.virtual_memory().percent + disk = psutil.disk_usage("/").percent + process = psutil.Process(os.getpid()) + return f""" +{UBOT_NAME}@{BOT_NAME} +------------------ +UPTIME: {get_readable_time(bot_uptime)} +BOT: {round(process.memory_info()[0] / 1024**2)} MB +CPU: {cpu}% +RAM: {mem}% +DISK: {disk}% + +TOTAL PLUGINS: {len(ALL_MODULES)} +""" + + +def remove_N(seq): + i = 1 + while i < len(seq): + if seq[i] == seq[i - 1]: + del seq[i] + i -= 1 + else: + i += 1 + + +def get_random_string(length: int = 5): + text_str = "".join( + random.SystemRandom().choice(string.ascii_letters + string.digits) + for _ in range(length) + ) + return text_str.upper() + + +async def rentry(teks): + # buat dapetin cookie + cookie = SimpleCookie() + kuki = (await http.get("https://rentry.co")).cookies + cookie.load(kuki) + kukidict = {key: value.value for key, value in cookie.items()} + # headernya + header = {"Referer": "https://rentry.co"} + payload = {"csrfmiddlewaretoken": kukidict["csrftoken"], "text": teks} + return ( + ( + await http.post( + "https://rentry.co/api/new", + data=payload, + headers=header, + cookies=kukidict, + ) + ) + .json() + .get("url") + ) + + +def get_provider(url): + def pretty(names): + name = names[1] + if names[0] == "play": + name = "Google Play Movies" + elif names[0] == "hbogoasia": + name = "HBO Go Asia" + elif names[0] == "maxstream": + name = "Max Stream" + elif names[0] == "klikfilm": + name = "Klik Film" + return name.title() + + netloc = urlparse(url).netloc + return pretty(netloc.split(".")) + + +async def search_jw(movie_name: str, locale: str): + m_t_ = "" + try: + response = ( + await http.get( + f"https://yasirapi.eu.org/justwatch?q={movie_name}&locale={locale}" + ) + ).json() + except: + return m_t_ + if not response.get("results"): + LOGGER.error("JustWatch API Error or got Rate Limited.") + return m_t_ + for item in response.get("results")["items"]: + if movie_name == item.get("title", ""): + offers = item.get("offers", []) + t_m_ = [] + for offer in offers: + url = offer.get("urls").get("standard_web") + if url not in t_m_: + p_o = get_provider(url) + m_t_ += f"{p_o} | " + t_m_.append(url) + if m_t_ != "": + m_t_ = m_t_[:-2].strip() + break + return m_t_ diff --git a/misskaty/helper/ytdl_helper.py b/misskaty/helper/ytdl_helper.py new file mode 100644 index 00000000..51f8d973 --- /dev/null +++ b/misskaty/helper/ytdl_helper.py @@ -0,0 +1,44 @@ +import os +import random +import string +import time + +import requests + +from misskaty.helper.human_read import get_readable_file_size + + +def random_char(y): + return "".join(random.choice(string.ascii_letters) for _ in range(y)) + + +def DetectFileSize(url): + r = requests.get(url, allow_redirects=True, stream=True) + return int(r.headers.get("content-length", 0)) + + +def DownLoadFile(url, file_name, chunk_size, client, ud_type, message_id, chat_id): + if os.path.exists(file_name): + os.remove(file_name) + if not url: + return file_name + r = requests.get(url, allow_redirects=True, stream=True) + # https://stackoverflow.com/a/47342052/4723940 + total_size = int(r.headers.get("content-length", 0)) + downloaded_size = 0 + with open(file_name, "wb") as fd: + for chunk in r.iter_content(chunk_size=chunk_size): + if chunk: + fd.write(chunk) + downloaded_size += chunk_size + if client is not None and ((total_size // downloaded_size) % 5) == 0: + time.sleep(0.3) + try: + client.edit_message_text( + chat_id, + message_id, + text=f"{ud_type}: {get_readable_file_size(downloaded_size)} of {get_readable_file_size(total_size)}", + ) + except: + pass + return file_name diff --git a/misskaty/plugins/__init__.py b/misskaty/plugins/__init__.py new file mode 100644 index 00000000..086516c4 --- /dev/null +++ b/misskaty/plugins/__init__.py @@ -0,0 +1,55 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright ©YasirPedia All rights reserved + """ +import glob +import importlib +import sys +from logging import getLogger +from os.path import basename, dirname, isfile + +from misskaty import MOD_LOAD, MOD_NOLOAD + +LOGGER = getLogger(__name__) + + +def __list_all_modules(): + # This generates a list of modules in this + # folder for the * in __main__ to work. + mod_paths = glob.glob(f"{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") + and not f.endswith("__main__.py") + ] + + if MOD_LOAD or MOD_NOLOAD: + to_load = MOD_LOAD + if to_load: + if not all( + any(mod == module_name for module_name in all_modules) + for mod in to_load + ): + sys.exit() + + else: + to_load = all_modules + + return ( + [item for item in to_load if item not in MOD_NOLOAD] + if MOD_NOLOAD + else to_load + ) + + return all_modules + + +LOGGER.info("[INFO]: IMPORTING PLUGINS") +importlib.import_module("misskaty.plugins.__main__") +ALL_MODULES = sorted(__list_all_modules()) +__all__ = ALL_MODULES + ["ALL_MODULES"] diff --git a/misskaty/plugins/__main__.py b/misskaty/plugins/__main__.py new file mode 100644 index 00000000..e69de29b diff --git a/misskaty/plugins/admin.py b/misskaty/plugins/admin.py new file mode 100644 index 00000000..9d89fc7f --- /dev/null +++ b/misskaty/plugins/admin.py @@ -0,0 +1,834 @@ +""" +MIT License + +Copyright (c) 2023 TheHamkerCat + +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 +import re +from logging import getLogger +from time import time + +from pyrogram import Client, enums, filters +from pyrogram.errors import ChatAdminRequired, FloodWait, PeerIdInvalid +from pyrogram.types import ChatPermissions, ChatPrivileges, Message + +from database.warn_db import add_warn, get_warn, remove_warns +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import ( + admins_in_chat, + list_admins, + member_permissions, +) +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.keyboard import ikb +from misskaty.helper.functions import ( + extract_user, + extract_user_and_reason, + int_to_alpha, + time_converter, +) +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, SUDO + +LOGGER = getLogger(__name__) + +__MODULE__ = "Admin" +__HELP__ = """ +/ban - Ban A User From A Group +/dban - Delete the replied message banning its sender +/tban - Ban A User For Specific Time +/unban - Unban A User +/listban - Ban a user from groups listed in a message +/listunban - Unban a user from groups listed in a message +/warn - Warn A User +/dwarn - Delete the replied message warning its sender +/rmwarns - Remove All Warning of A User +/warns - Show Warning Of A User +/kick - Kick A User +/dkick - Delete the replied message kicking its sender +/purge - Purge Messages +/purge [n] - Purge "n" number of messages from replied message +/del - Delete Replied Message +/promote - Promote A Member +/fullpromote - Promote A Member With All Rights +/demote - Demote A Member +/pin - Pin A Message +/mute - Mute A User +/tmute - Mute A User For Specific Time +/unmute - Unmute A User +/ban_ghosts - Ban Deleted Accounts +/report | @admins | @admin - Report A Message To Admins. +/set_chat_title - Change The Name Of A Group/Channel. +/set_chat_photo - Change The PFP Of A Group/Channel. +/set_user_title - Change The Administrator Title Of An Admin. +""" + + +# Admin cache reload +@app.on_chat_member_updated() +async def admin_cache_func(_, cmu): + if cmu.old_chat_member and cmu.old_chat_member.promoted_by: + try: + admins_in_chat[cmu.chat.id] = { + "last_updated_at": time(), + "data": [ + member.user.id + async for member in app.get_chat_members( + cmu.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ], + } + LOGGER.info(f"Updated admin cache for {cmu.chat.id} [{cmu.chat.title}]") + except: + pass + + +# Purge CMD +@app.on_cmd("purge") +@app.adminsOnly("can_delete_messages") +@ratelimiter +@use_chat_lang() +async def purge(_, ctx: Message, strings): + try: + repliedmsg = ctx.reply_to_message + await ctx.delete_msg() + + if not repliedmsg: + return await ctx.reply_msg(strings("purge_no_reply")) + + cmd = ctx.command + if len(cmd) > 1 and cmd[1].isdigit(): + purge_to = repliedmsg.id + int(cmd[1]) + purge_to = min(purge_to, ctx.id) + else: + purge_to = ctx.id + + chat_id = ctx.chat.id + message_ids = [] + del_total = 0 + + for message_id in range( + repliedmsg.id, + purge_to, + ): + message_ids.append(message_id) + + # Max message deletion limit is 100 + if len(message_ids) == 100: + await app.delete_messages( + chat_id=chat_id, + message_ids=message_ids, + revoke=True, # For both sides + ) + del_total += len(message_ids) + # To delete more than 100 messages, start again + message_ids = [] + + # Delete if any messages left + if len(message_ids) > 0: + await app.delete_messages( + chat_id=chat_id, + message_ids=message_ids, + revoke=True, + ) + del_total += len(message_ids) + await ctx.reply_msg(strings("purge_success").format(del_total=del_total)) + except Exception as err: + await ctx.reply_msg(f"ERROR: {err}") + + +# Kick members +@app.on_cmd(["kick", "dkick"], self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def kickFunc(client: Client, ctx: Message, strings) -> "Message": + user_id, reason = await extract_user_and_reason(ctx) + if not user_id: + return await ctx.reply_msg(strings("user_not_found")) + if user_id == client.me.id: + return await ctx.reply_msg(strings("kick_self_err")) + if user_id in SUDO: + return await ctx.reply_msg(strings("kick_sudo_err")) + if user_id in (await list_admins(ctx.chat.id)): + return await ctx.reply_msg(strings("kick_admin_err")) + user = await app.get_users(user_id) + msg = strings("kick_msg").format( + mention=user.mention, + id=user.id, + kicker=ctx.from_user.mention if ctx.from_user else "Anon Admin", + reasonmsg=reason or "-", + ) + if ctx.command[0][0] == "d": + await ctx.reply_to_message.delete_msg() + try: + await ctx.chat.ban_member(user_id) + await ctx.reply_msg(msg) + await asyncio.sleep(1) + await ctx.chat.unban_member(user_id) + except ChatAdminRequired: + await ctx.reply_msg(strings("no_ban_permission")) + + +# Ban/DBan/TBan User +@app.on_cmd(["ban", "dban", "tban"], self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def banFunc(client, message, strings): + user_id, reason = await extract_user_and_reason(message, sender_chat=True) + + if not user_id: + return await message.reply_text(strings("user_not_found")) + if user_id == client.me.id: + return await message.reply_text(strings("ban_self_err")) + if user_id in SUDO: + return await message.reply_text(strings("ban_sudo_err")) + if user_id in (await list_admins(message.chat.id)): + return await message.reply_text(strings("ban_admin_err")) + + try: + mention = (await app.get_users(user_id)).mention + except IndexError: + mention = ( + message.reply_to_message.sender_chat.title + if message.reply_to_message + else "Anon" + ) + + msg = strings("ban_msg").format( + mention=mention, + id=user_id, + banner=message.from_user.mention if message.from_user else "Anon", + ) + if message.command[0][0] == "d": + await message.reply_to_message.delete() + if message.command[0] == "tban": + split = reason.split(None, 1) + time_value = split[0] + temp_reason = split[1] if len(split) > 1 else "" + temp_ban = await time_converter(message, time_value) + msg += strings("banner_time").format(val=time_value) + if temp_reason: + msg += strings("banned_reason").format(reas=temp_reason) + try: + if len(time_value[:-1]) < 3: + await message.chat.ban_member(user_id, until_date=temp_ban) + await message.reply_text(msg) + else: + await message.reply_text(strings("no_more_99")) + except AttributeError: + pass + return + if reason: + msg += strings("banned_reason").format(reas=reason) + keyboard = ikb({"🚨 Unban 🚨": f"unban_{user_id}"}) + try: + await message.chat.ban_member(user_id) + await message.reply_text(msg, reply_markup=keyboard) + except Exception as err: + await message.reply(f"ERROR: {err}") + + +# Unban members +@app.on_cmd("unban", self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def unban_func(_, message, strings): + # we don't need reasons for unban, also, we + # don't need to get "text_mention" entity, because + # normal users won't get text_mention if the user + # they want to unban is not in the group. + reply = message.reply_to_message + + if reply and reply.sender_chat and reply.sender_chat != message.chat.id: + return await message.reply_text(strings("unban_channel_err")) + + if len(message.command) == 2: + user = message.text.split(None, 1)[1] + if not user.startswith("@"): + user = int(user) + elif len(message.command) == 1 and reply: + user = message.reply_to_message.from_user.id + else: + return await message.reply_msg(strings("give_unban_user")) + try: + await message.chat.unban_member(user) + umention = (await app.get_users(user)).mention + await message.reply_msg(strings("unban_success").format(umention=umention)) + except PeerIdInvalid: + await message.reply_msg(strings("unknown_id", context="general")) + + +# Ban users listed in a message +@app.on_message( + filters.user(SUDO) & filters.command("listban", COMMAND_HANDLER) & filters.group +) +@ratelimiter +@use_chat_lang() +async def list_ban_(c, message, strings): + userid, msglink_reason = await extract_user_and_reason(message) + if not userid or not msglink_reason: + return await message.reply_text(strings("give_idban_with_msg_link")) + if len(msglink_reason.split(" ")) == 1: # message link included with the reason + return await message.reply_text(strings("give_reason_list_ban")) + # seperate messge link from reason + lreason = msglink_reason.split() + messagelink, reason = lreason[0], " ".join(lreason[1:]) + + if not re.search( + r"(https?://)?t(elegram)?\.me/\w+/\d+", messagelink + ): # validate link + return await message.reply_text(strings("invalid_tg_link")) + + if userid == c.me.id: + return await message.reply_text(strings("ban_self_err")) + if userid in SUDO: + return await message.reply_text(strings("ban_sudo_err")) + splitted = messagelink.split("/") + uname, mid = splitted[-2], int(splitted[-1]) + m = await message.reply_text(strings("multiple_ban_progress")) + try: + msgtext = (await app.get_messages(uname, mid)).text + gusernames = re.findall(r"@\w+", msgtext) + except: + return await m.edit_text(strings("failed_get_uname")) + count = 0 + for username in gusernames: + try: + await app.ban_chat_member(username.strip("@"), userid) + await asyncio.sleep(1) + except FloodWait as e: + await asyncio.sleep(e.value) + except: + continue + count += 1 + mention = (await app.get_users(userid)).mention + + msg = strings("listban_msg").format( + mention=mention, + uid=userid, + frus=message.from_user.mention, + ct=count, + reas=reason, + ) + await m.edit_text(msg) + + +# Unban users listed in a message +@app.on_message( + filters.user(SUDO) & filters.command("listunban", COMMAND_HANDLER) & filters.group +) +@ratelimiter +@use_chat_lang() +async def list_unban(_, message, strings): + userid, msglink = await extract_user_and_reason(message) + if not userid or not msglink: + return await message.reply_text(strings("give_idunban_with_msg_link")) + + if not re.search(r"(https?://)?t(elegram)?\.me/\w+/\d+", msglink): # validate link + return await message.reply_text(strings("invalid_tg_link")) + + splitted = msglink.split("/") + uname, mid = splitted[-2], int(splitted[-1]) + m = await message.reply_text(strings("multiple_unban_progress")) + try: + msgtext = (await app.get_messages(uname, mid)).text + gusernames = re.findall(r"@\w+", msgtext) + except: + return await m.edit_text(strings("failed_get_uname")) + count = 0 + for username in gusernames: + try: + await app.unban_chat_member(username.strip("@"), userid) + await asyncio.sleep(1) + except FloodWait as e: + await asyncio.sleep(e.x) + except: + continue + count += 1 + mention = (await app.get_users(userid)).mention + msg = strings("listunban_msg").format( + mention=mention, uid=userid, frus=message.from_user.mention, ct=count + ) + await m.edit_text(msg) + + +# Delete messages +@app.on_cmd("del", group_only=True) +@app.adminsOnly("can_delete_messages") +@ratelimiter +@use_chat_lang() +async def deleteFunc(_, message, strings): + if not message.reply_to_message: + return await message.reply_text(strings("delete_no_reply")) + try: + await message.reply_to_message.delete() + await message.delete() + except: + await message.reply(strings("no_delete_perm")) + + +# Promote Members +@app.on_cmd(["promote", "fullpromote"], self_admin=True, group_only=True) +@app.adminsOnly("can_promote_members") +@ratelimiter +@use_chat_lang() +async def promoteFunc(client, message, strings): + try: + user_id = await extract_user(message) + umention = (await app.get_users(user_id)).mention + except: + return await message.reply(strings("invalid_id_uname")) + if not user_id: + return await message.reply_text(strings("user_not_found")) + bot = await app.get_chat_member(message.chat.id, client.me.id) + if user_id == client.me.id: + return await message.reply_text(strings("promote_self_err")) + if not bot.privileges.can_promote_members: + return await message.reply_text(strings("no_promote_perm")) + if message.command[0][0] == "f": + await message.chat.promote_member( + user_id=user_id, + privileges=ChatPrivileges( + can_change_info=bot.privileges.can_change_info, + can_invite_users=bot.privileges.can_invite_users, + can_delete_messages=bot.privileges.can_delete_messages, + can_restrict_members=bot.privileges.can_restrict_members, + can_pin_messages=bot.privileges.can_pin_messages, + can_promote_members=bot.privileges.can_promote_members, + can_manage_chat=bot.privileges.can_manage_chat, + can_manage_video_chats=bot.privileges.can_manage_video_chats, + ), + ) + return await message.reply_text( + strings("full_promote").format(umention=umention) + ) + + await message.chat.promote_member( + user_id=user_id, + privileges=ChatPrivileges( + can_change_info=False, + can_invite_users=bot.privileges.can_invite_users, + can_delete_messages=bot.privileges.can_delete_messages, + can_restrict_members=bot.privileges.can_restrict_members, + can_pin_messages=bot.privileges.can_pin_messages, + can_promote_members=False, + can_manage_chat=bot.privileges.can_manage_chat, + can_manage_video_chats=bot.privileges.can_manage_video_chats, + ), + ) + await message.reply_text(strings("normal_promote").format(umention=umention)) + + +# Demote Member +@app.on_cmd("demote", self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def demote(client, message, strings): + user_id = await extract_user(message) + if not user_id: + return await message.reply_text(strings("user_not_found")) + if user_id == client.me.id: + return await message.reply_text(strings("demote_self_err")) + if user_id in SUDO: + return await message.reply_text(strings("demote_sudo_err")) + await message.chat.promote_member( + user_id=user_id, + privileges=ChatPrivileges( + can_change_info=False, + can_invite_users=False, + can_delete_messages=False, + can_restrict_members=False, + can_pin_messages=False, + can_promote_members=False, + can_manage_chat=False, + can_manage_video_chats=False, + ), + ) + umention = (await app.get_users(user_id)).mention + await message.reply_text(f"Demoted! {umention}") + + +# Pin Messages +@app.on_cmd(["pin", "unpin"]) +@app.adminsOnly("can_pin_messages") +@ratelimiter +@use_chat_lang() +async def pin(_, message, strings): + if not message.reply_to_message: + return await message.reply_text(strings("pin_no_reply")) + r = message.reply_to_message + try: + if message.command[0][0] == "u": + await r.unpin() + return await message.reply_text( + strings("unpin_success").format(link=r.link), + disable_web_page_preview=True, + ) + await r.pin(disable_notification=True) + await message.reply( + strings("pin_success").format(link=r.link), + disable_web_page_preview=True, + ) + except ChatAdminRequired: + await message.reply( + strings("pin_no_perm"), + disable_web_page_preview=True, + ) + + +# Mute members +@app.on_cmd(["mute", "tmute"], self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def mute(client, message, strings): + try: + user_id, reason = await extract_user_and_reason(message) + except Exception as err: + return await message.reply(f"ERROR: {err}") + if not user_id: + return await message.reply_text(strings("user_not_found")) + if user_id == client.me.id: + return await message.reply_text(strings("mute_self_err")) + if user_id in SUDO: + return await message.reply_text(strings("mute_sudo_err")) + if user_id in (await list_admins(message.chat.id)): + return await message.reply_text(strings("mute_admin_err")) + mention = (await app.get_users(user_id)).mention + keyboard = ikb({"🚨 Unmute 🚨": f"unmute_{user_id}"}) + msg = strings("mute_msg").format( + mention=mention, + muter=message.from_user.mention if message.from_user else "Anon", + ) + if message.command[0] == "tmute": + split = reason.split(None, 1) + time_value = split[0] + temp_reason = split[1] if len(split) > 1 else "" + temp_mute = await time_converter(message, time_value) + msg += strings("muted_time").format(val=time_value) + if temp_reason: + msg += strings("banned_reason").format(reas=temp_reason) + try: + if len(time_value[:-1]) < 3: + await message.chat.restrict_member( + user_id, + permissions=ChatPermissions(), + until_date=temp_mute, + ) + await message.reply_text(msg, reply_markup=keyboard) + else: + await message.reply_text(strings("no_more_99")) + except AttributeError: + pass + return + if reason: + msg += strings("banned_reason").format(reas=reason) + await message.chat.restrict_member(user_id, permissions=ChatPermissions()) + await message.reply_text(msg, reply_markup=keyboard) + + +# Unmute members +@app.on_cmd("unmute", self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def unmute(_, message, strings): + user_id = await extract_user(message) + if not user_id: + return await message.reply_text(strings("user_not_found")) + try: + await message.chat.unban_member(user_id) + umention = (await app.get_users(user_id)).mention + await message.reply_msg(strings("unmute_msg").format(umention=umention)) + except Exception as e: + await message.reply_msg(str(e)) + + +@app.on_cmd(["warn", "dwarn"], self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def warn_user(client, message, strings): + user_id, reason = await extract_user_and_reason(message) + chat_id = message.chat.id + if not user_id: + return await message.reply_text(strings("user_not_found")) + if user_id == client.me.id: + return await message.reply_text(strings("warn_self_err")) + if user_id in SUDO: + return await message.reply_text(strings("warn_sudo_err")) + if user_id in (await list_admins(chat_id)): + return await message.reply_text(strings("warn_admin_err")) + user, warns = await asyncio.gather( + app.get_users(user_id), + get_warn(chat_id, await int_to_alpha(user_id)), + ) + mention = user.mention + keyboard = ikb({strings("rm_warn_btn"): f"unwarn_{user_id}"}) + warns = warns["warns"] if warns else 0 + if message.command[0][0] == "d": + await message.reply_to_message.delete() + if warns >= 2: + await message.chat.ban_member(user_id) + await message.reply_text(strings("exceed_warn_msg").format(mention=mention)) + await remove_warns(chat_id, await int_to_alpha(user_id)) + else: + warn = {"warns": warns + 1} + msg = strings("warn_msg").format( + mention=mention, + warner=message.from_user.mention if message.from_user else "Anon", + reas=reason or "No Reason Provided.", + twarn=warns + 1, + ) + await message.reply_text(msg, reply_markup=keyboard) + await add_warn(chat_id, await int_to_alpha(user_id), warn) + + +@app.on_callback_query(filters.regex("unwarn_")) +@ratelimiter +@use_chat_lang() +async def remove_warning(client, cq, strings): + from_user = cq.from_user + chat_id = cq.message.chat.id + permissions = await member_permissions(chat_id, from_user.id, client) + permission = "can_restrict_members" + if permission not in permissions: + return await cq.answer( + strings("no_permission_error").format(permissions=permission), + show_alert=True, + ) + user_id = int(cq.data.split("_")[1]) + warns = await get_warn(chat_id, await int_to_alpha(user_id)) + if warns: + warns = warns["warns"] + if not warns or warns == 0: + return await cq.answer( + strings("user_no_warn").format( + mention=cq.message.reply_to_message.from_user.id + ) + ) + warn = {"warns": warns - 1} + await add_warn(chat_id, await int_to_alpha(user_id), warn) + text = cq.message.text.markdown + text = f"~~{text}~~\n\n" + text += strings("unwarn_msg").format(mention=from_user.mention) + await cq.message.edit(text) + + +@app.on_callback_query(filters.regex("unmute_")) +@ratelimiter +@use_chat_lang() +async def unmute_user(client, cq, strings): + from_user = cq.from_user + chat_id = cq.message.chat.id + permissions = await member_permissions(chat_id, from_user.id, client) + permission = "can_restrict_members" + if permission not in permissions: + return await cq.answer( + strings("no_permission_error").format(permissions=permission), + show_alert=True, + ) + user_id = int(cq.data.split("_")[1]) + text = cq.message.text.markdown + text = f"~~{text}~~\n\n" + text += strings("rmmute_msg").format(mention=from_user.mention) + await cq.message.chat.unban_member(user_id) + await cq.message.edit(text) + + +@app.on_callback_query(filters.regex("unban_")) +@ratelimiter +@use_chat_lang() +async def unban_user(client, cq, strings): + from_user = cq.from_user + chat_id = cq.message.chat.id + permissions = await member_permissions(chat_id, from_user.id, client) + permission = "can_restrict_members" + if permission not in permissions: + return await cq.answer( + strings("no_permission_error").format(permissions=permission), + show_alert=True, + ) + user_id = int(cq.data.split("_")[1]) + text = cq.message.text.markdown + text = f"~~{text}~~\n\n" + text += strings("unban_msg").format(mention=from_user.mention) + try: + await cq.message.chat.unban_member(user_id) + await cq.message.edit(text) + except Exception as e: + await cq.answer(str(e)) + + +# Remove Warn +@app.on_cmd("rmwarn", self_admin=True, group_only=True) +@app.adminsOnly("can_restrict_members") +@ratelimiter +@use_chat_lang() +async def remove_warnings(_, message, strings): + if not message.reply_to_message: + return await message.reply_text(strings("reply_to_rm_warn")) + user_id = message.reply_to_message.from_user.id + mention = message.reply_to_message.from_user.mention + chat_id = message.chat.id + warns = await get_warn(chat_id, await int_to_alpha(user_id)) + if warns: + warns = warns["warns"] + if warns == 0 or not warns: + await message.reply_text(strings("user_no_warn").format(mention=mention)) + else: + await remove_warns(chat_id, await int_to_alpha(user_id)) + await message.reply_text(strings("rmwarn_msg").format(mention=mention)) + + +# Warns +@app.on_cmd("warns", group_only=True) +@ratelimiter +@use_chat_lang() +async def check_warns(_, message, strings): + if not message.from_user: + return + user_id = await extract_user(message) + if not user_id: + return await message.reply_text(strings("user_not_found")) + warns = await get_warn(message.chat.id, await int_to_alpha(user_id)) + mention = (await app.get_users(user_id)).mention + if warns: + warns = warns["warns"] + else: + return await message.reply_text(strings("user_no_warn").format(mention=mention)) + return await message.reply_text( + strings("ch_warn_msg").format(mention=mention, warns=warns) + ) + + +# Report User in Group +@app.on_message( + ( + filters.command("report", COMMAND_HANDLER) + | filters.command(["admins", "admin"], prefixes="@") + ) + & filters.group +) +@capture_err +@ratelimiter +@use_chat_lang() +async def report_user(_, ctx: Message, strings) -> "Message": + if not ctx.reply_to_message: + return await ctx.reply_msg(strings("report_no_reply")) + reply = ctx.reply_to_message + reply_id = reply.from_user.id if reply.from_user else reply.sender_chat.id + user_id = ctx.from_user.id if ctx.from_user else ctx.sender_chat.id + if reply_id == user_id: + return await ctx.reply_msg(strings("report_self_err")) + + list_of_admins = await list_admins(ctx.chat.id) + linked_chat = (await app.get_chat(ctx.chat.id)).linked_chat + if linked_chat is None: + if reply_id in list_of_admins or reply_id == ctx.chat.id: + return await ctx.reply_msg(strings("reported_is_admin")) + elif ( + reply_id in list_of_admins + or reply_id == ctx.chat.id + or reply_id == linked_chat.id + ): + return await ctx.reply_msg(strings("reported_is_admin")) + user_mention = ( + reply.from_user.mention if reply.from_user else reply.sender_chat.title + ) + text = strings("report_msg").format(user_mention=user_mention) + admin_data = [ + m + async for m in app.get_chat_members( + ctx.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ) + ] + for admin in admin_data: + if admin.user.is_bot or admin.user.is_deleted: + # return bots or deleted admins + continue + text += f"\u2063" + await ctx.reply_msg(text, reply_to_message_id=ctx.reply_to_message.id) + + +@app.on_cmd("set_chat_title", self_admin=True, group_only=True) +@app.adminsOnly("can_change_info") +async def set_chat_title(_, ctx: Message): + if len(ctx.command) < 2: + return await ctx.reply_text(f"**Usage:**\n/{ctx.command[0]} NEW NAME") + old_title = ctx.chat.title + new_title = ctx.text.split(None, 1)[1] + await ctx.chat.set_title(new_title) + await ctx.reply_text( + f"Successfully Changed Group Title From {old_title} To {new_title}" + ) + + +@app.on_cmd("set_user_title", self_admin=True, group_only=True) +@app.adminsOnly("can_change_info") +async def set_user_title(_, ctx: Message): + if not ctx.reply_to_message: + return await ctx.reply_text("Reply to user's message to set his admin title") + if not ctx.reply_to_message.from_user: + return await ctx.reply_text("I can't change admin title of an unknown entity") + chat_id = ctx.chat.id + from_user = ctx.reply_to_message.from_user + if len(ctx.command) < 2: + return await ctx.reply_text( + "**Usage:**\n/set_user_title NEW ADMINISTRATOR TITLE" + ) + title = ctx.text.split(None, 1)[1] + await app.set_administrator_title(chat_id, from_user.id, title) + await ctx.reply_text( + f"Successfully Changed {from_user.mention}'s Admin Title To {title}" + ) + + +@app.on_cmd("set_chat_photo", self_admin=True, group_only=True) +@app.adminsOnly("can_change_info") +async def set_chat_photo(_, ctx: Message): + reply = ctx.reply_to_message + + if not reply: + return await ctx.reply_text("Reply to a photo to set it as chat_photo") + + file = reply.document or reply.photo + if not file: + return await ctx.reply_text( + "Reply to a photo or document to set it as chat_photo" + ) + + if file.file_size > 5000000: + return await ctx.reply("File size too large.") + + photo = await reply.download() + try: + await ctx.chat.set_photo(photo=photo) + await ctx.reply_text("Successfully Changed Group Photo") + except Exception as err: + await ctx.reply(f"Failed changed group photo. ERROR: {err}") + os.remove(photo) diff --git a/misskaty/plugins/afk.py b/misskaty/plugins/afk.py new file mode 100644 index 00000000..675dd1eb --- /dev/null +++ b/misskaty/plugins/afk.py @@ -0,0 +1,533 @@ +# +# Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >. +# +# This file is part of < https://github.com/TeamYukki/YukkiAFKBot > project, +# and is released under the "GNU v3.0 License Agreement". +# Please see < https://github.com/TeamYukki/YukkiAFKBot/blob/master/LICENSE > +# +# All rights reserved. +# + +import re + +# Modified plugin by me from https://github.com/TeamYukki/YukkiAFKBot to make compatible with pyrogram v2 +import time + +from pyrogram import Client, enums, filters +from pyrogram.types import Message + +from database.afk_db import add_afk, cleanmode_off, cleanmode_on, is_afk, remove_afk +from misskaty import app +from misskaty.core.decorator.permissions import adminsOnly +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import get_readable_time2 +from misskaty.helper.localization import use_chat_lang +from utils import put_cleanmode + +__MODULE__ = "AFK" +__HELP__ = """/afk [Reason > Optional] - Tell others that you are AFK (Away From Keyboard), so that your boyfriend or girlfriend won't look for you 💔. +/afk [reply to media] - AFK with media. +/afkdel - Enable auto delete AFK message in group (Only for group admin). Default is **Enable**. +Just type something in group to remove AFK Status.""" + + +# Handle set AFK Command +@app.on_cmd("afk") +@ratelimiter +@use_chat_lang() +async def active_afk(_, ctx: Message, strings): + if ctx.sender_chat: + return await ctx.reply_msg(strings("no_channel"), del_in=6) + user_id = ctx.from_user.id + verifier, reasondb = await is_afk(user_id) + if verifier: + await remove_afk(user_id) + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time2((int(time.time() - timeafk))) + if afktype == "animation": + send = ( + await ctx.reply_animation( + data, + caption=strings("on_afk_msg_no_r").format( + usr=ctx.from_user.mention, id=ctx.from_user.id, tm=seenago + ), + ) + if str(reasonafk) == "None" + else await ctx.reply_animation( + data, + caption=strings("on_afk_msg_with_r").format( + usr=ctx.from_user.mention, + id=ctx.from_user.id, + tm=seenago, + reas=reasonafk, + ), + ) + ) + elif afktype == "photo": + send = ( + await ctx.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=strings("on_afk_msg_no_r").format( + usr=ctx.from_user.mention, id=ctx.from_user.id, tm=seenago + ), + ) + if str(reasonafk) == "None" + else await ctx.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=strings("on_afk_msg_with_r").format( + usr=ctx.from_user.first_name, tm=seenago, reas=reasonafk + ), + ) + ) + elif afktype == "text": + send = await ctx.reply_text( + strings("on_afk_msg_no_r").format( + usr=ctx.from_user.mention, id=ctx.from_user.id, tm=seenago + ), + disable_web_page_preview=True, + ) + elif afktype == "text_reason": + send = await ctx.reply_text( + strings("on_afk_msg_with_r").format( + usr=ctx.from_user.mention, + id=ctx.from_user.id, + tm=seenago, + reas=reasonafk, + ), + disable_web_page_preview=True, + ) + except Exception: + send = await ctx.reply_text( + strings("is_online").format( + usr=ctx.from_user.first_name, id=ctx.from_user.id + ), + disable_web_page_preview=True, + ) + await put_cleanmode(ctx.chat.id, send.id) + return + if len(ctx.command) == 1 and not ctx.reply_to_message: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(ctx.command) > 1 and not ctx.reply_to_message: + _reason = (ctx.text.split(None, 1)[1].strip())[:100] + details = { + "type": "text_reason", + "time": time.time(), + "data": None, + "reason": _reason, + } + elif len(ctx.command) == 1 and ctx.reply_to_message.animation: + _data = ctx.reply_to_message.animation.file_id + details = { + "type": "animation", + "time": time.time(), + "data": _data, + "reason": None, + } + elif len(ctx.command) > 1 and ctx.reply_to_message.animation: + _data = ctx.reply_to_message.animation.file_id + _reason = (ctx.text.split(None, 1)[1].strip())[:100] + details = { + "type": "animation", + "time": time.time(), + "data": _data, + "reason": _reason, + } + elif len(ctx.command) == 1 and ctx.reply_to_message.photo: + await app.download_media(ctx.reply_to_message, file_name=f"{user_id}.jpg") + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(ctx.command) > 1 and ctx.reply_to_message.photo: + await app.download_media(ctx.reply_to_message, file_name=f"{user_id}.jpg") + _reason = ctx.text.split(None, 1)[1].strip() + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": _reason, + } + elif len(ctx.command) == 1 and ctx.reply_to_message.sticker: + if ctx.reply_to_message.sticker.is_animated: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + else: + await app.download_media(ctx.reply_to_message, file_name=f"{user_id}.jpg") + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": None, + } + elif len(ctx.command) > 1 and ctx.reply_to_message.sticker: + _reason = (ctx.text.split(None, 1)[1].strip())[:100] + if ctx.reply_to_message.sticker.is_animated: + details = { + "type": "text_reason", + "time": time.time(), + "data": None, + "reason": _reason, + } + else: + await app.download_media(ctx.reply_to_message, file_name=f"{user_id}.jpg") + details = { + "type": "photo", + "time": time.time(), + "data": None, + "reason": _reason, + } + else: + details = { + "type": "text", + "time": time.time(), + "data": None, + "reason": None, + } + + await add_afk(user_id, details) + send = await ctx.reply_msg( + strings("now_afk").format(usr=ctx.from_user.mention, id=ctx.from_user.id) + ) + await put_cleanmode(ctx.chat.id, send.id) + + +@app.on_cmd("afkdel", group_only=True) +@ratelimiter +@adminsOnly("can_change_info") +@use_chat_lang() +async def afk_state(_, ctx: Message, strings): + if not ctx.from_user: + return + if len(ctx.command) == 1: + return await ctx.reply_msg( + strings("afkdel_help").format(cmd=ctx.command[0]), del_in=6 + ) + chat_id = ctx.chat.id + state = ctx.text.split(None, 1)[1].strip() + state = state.lower() + if state == "enable": + await cleanmode_on(chat_id) + await ctx.reply_msg(strings("afkdel_enable")) + elif state == "disable": + await cleanmode_off(chat_id) + await ctx.reply_msg(strings("afkdel_disable")) + else: + await ctx.reply_msg(strings("afkdel_help").format(cmd=ctx.command[0]), del_in=6) + + +# Detect user that AFK based on Yukki Repo +@app.on_message( + filters.group & ~filters.bot & ~filters.via_bot, + group=1, +) +@use_chat_lang() +async def afk_watcher_func(self: Client, ctx: Message, strings): + if ctx.sender_chat: + return + userid = ctx.from_user.id + user_name = ctx.from_user.mention + if ctx.entities: + possible = ["/afk", f"/afk@{self.me.username}", "!afk"] + message_text = ctx.text or ctx.caption + for entity in ctx.entities: + try: + if ( + entity.type == enums.MessageEntityType.BOT_COMMAND + and (message_text[0 : 0 + entity.length]).lower() in possible + ): + return + except UnicodeDecodeError: # Some weird character make error + return + + msg = "" + replied_user_id = 0 + + # Self AFK + verifier, reasondb = await is_afk(userid) + if verifier: + await remove_afk(userid) + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time2((int(time.time() - timeafk))) + if afktype == "text": + msg += strings("on_afk_msg_no_r").format( + usr=user_name, id=userid, tm=seenago + ) + if afktype == "text_reason": + msg += strings("on_afk_msg_with_r").format( + usr=user_name, id=userid, tm=seenago, reas=reasonafk + ) + if afktype == "animation": + if str(reasonafk) == "None": + send = await ctx.reply_animation( + data, + caption=strings("on_afk_msg_no_r").format( + usr=user_name, id=userid, tm=seenago + ), + ) + else: + send = await ctx.reply_animation( + data, + caption=strings("on_afk_msg_with_r").format( + usr=user_name, id=userid, tm=seenago, reas=reasonafk + ), + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await ctx.reply_photo( + photo=f"downloads/{userid}.jpg", + caption=strings("on_afk_msg_no_r").format( + usr=user_name, id=userid, tm=seenago + ), + ) + else: + send = await ctx.reply_photo( + photo=f"downloads/{userid}.jpg", + caption=strings("on_afk_msg_with_r").format( + usr=user_name, id=userid, tm=seenago, reas=reasonafk + ), + ) + except: + msg += strings("is_online").format(usr=user_name, id=userid) + + # Replied to a User which is AFK + if ctx.reply_to_message: + try: + replied_first_name = ctx.reply_to_message.from_user.mention + replied_user_id = ctx.reply_to_message.from_user.id + verifier, reasondb = await is_afk(replied_user_id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time2((int(time.time() - timeafk))) + if afktype == "text": + msg += strings("is_afk_msg_no_r").format( + usr=replied_first_name, id=replied_user_id, tm=seenago + ) + if afktype == "text_reason": + msg += strings("is_afk_msg_with_r").format( + usr=replied_first_name, + id=replied_user_id, + tm=seenago, + reas=reasonafk, + ) + if afktype == "animation": + if str(reasonafk) == "None": + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_no_r").format( + usr=replied_first_name, + id=replied_user_id, + tm=seenago, + ), + ) + else: + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_with_r").format( + usr=replied_first_name, + id=replied_user_id, + tm=seenago, + reas=reasonafk, + ), + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await ctx.reply_photo( + photo=f"downloads/{replied_user_id}.jpg", + caption=strings("is_afk_msg_no_r").format( + usr=replied_first_name, + id=replied_user_id, + tm=seenago, + ), + ) + else: + send = await ctx.reply_photo( + photo=f"downloads/{replied_user_id}.jpg", + caption=strings("is_afk_msg_with_r").format( + usr=replied_first_name, + id=replied_user_id, + tm=seenago, + reas=reasonafk, + ), + ) + except Exception: + msg += strings("is_afk").format( + usr=replied_first_name, id=replied_user_id + ) + except: + pass + + # If username or mentioned user is AFK + if ctx.entities: + entity = ctx.entities + j = 0 + for _ in range(len(entity)): + if (entity[j].type) == enums.MessageEntityType.MENTION: + found = re.findall("@([_0-9a-zA-Z]+)", ctx.text) + try: + get_user = found[j] + user = await app.get_users(get_user) + if user.id == replied_user_id: + j += 1 + continue + except: + j += 1 + continue + verifier, reasondb = await is_afk(user.id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time2((int(time.time() - timeafk))) + if afktype == "text": + msg += strings("is_afk_msg_no_r").format( + usr=user.first_name[:25], id=user.id, tm=seenago + ) + if afktype == "text_reason": + msg += strings("is_afk_msg_with_r").format( + usr=user.first_name[:25], + id=user.id, + tm=seenago, + reas=reasonafk, + ) + if afktype == "animation": + if str(reasonafk) == "None": + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_no_r").format( + usr=user.first_name[:25], id=user.id, tm=seenago + ), + ) + else: + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_with_r").format( + usr=user.first_name[:25], + id=user.id, + tm=seenago, + reas=reasonafk, + ), + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await ctx.reply_photo( + photo=f"downloads/{user.id}.jpg", + caption=strings("is_afk_msg_no_r").format( + usr=user.first_name[:25], id=user.id, tm=seenago + ), + ) + else: + send = await ctx.reply_photo( + photo=f"downloads/{user.id}.jpg", + caption=strings("is_afk_msg_with_r").format( + usr=user.first_name[:25], + id=user.id, + tm=seenago, + reas=reasonafk, + ), + ) + except: + msg += strings("is_afk").format( + usr=user.first_name[:25], id=user.id + ) + elif (entity[j].type) == enums.MessageEntityType.TEXT_MENTION: + try: + user_id = entity[j].user.id + if user_id == replied_user_id: + j += 1 + continue + first_name = entity[j].user.first_name + except: + j += 1 + continue + verifier, reasondb = await is_afk(user_id) + if verifier: + try: + afktype = reasondb["type"] + timeafk = reasondb["time"] + data = reasondb["data"] + reasonafk = reasondb["reason"] + seenago = get_readable_time2((int(time.time() - timeafk))) + if afktype == "text": + msg += strings("is_afk_msg_no_r").format( + usr=first_name[:25], id=user_id, tm=seenago + ) + if afktype == "text_reason": + msg += strings("is_afk_msg_with_r").format( + usr=first_name[:25], + id=user_id, + tm=seenago, + reas=reasonafk, + ) + if afktype == "animation": + if str(reasonafk) == "None": + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_no_r").format( + usr=first_name[:25], id=user_id, tm=seenago + ), + ) + else: + send = await ctx.reply_animation( + data, + caption=strings("is_afk_msg_with_r").format( + usr=first_name[:25], + id=user_id, + tm=seenago, + reas=reasonafk, + ), + ) + if afktype == "photo": + if str(reasonafk) == "None": + send = await ctx.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=strings("is_afk_msg_no_r").format( + usr=first_name[:25], id=user_id, tm=seenago + ), + ) + else: + send = await ctx.reply_photo( + photo=f"downloads/{user_id}.jpg", + caption=strings("is_afk_msg_with_r").format( + usr=first_name[:25], + id=user_id, + tm=seenago, + reas=reasonafk, + ), + ) + except: + msg += strings("is_afk").format(usr=first_name[:25], id=user_id) + j += 1 + if msg != "": + try: + send = await ctx.reply_text(msg, disable_web_page_preview=True) + except: + pass + try: + await put_cleanmode(ctx.chat.id, send.id) + except: + pass diff --git a/misskaty/plugins/anime.py b/misskaty/plugins/anime.py new file mode 100644 index 00000000..cad67015 --- /dev/null +++ b/misskaty/plugins/anime.py @@ -0,0 +1,242 @@ +import json +from calendar import month_name + +import aiohttp +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from misskaty import app +from misskaty.helper.human_read import get_readable_time +from misskaty.vars import COMMAND_HANDLER + +anime_query = """ +query ($id: Int, $idMal: Int, $search: String) { + Media(id: $id, idMal: $idMal, type: ANIME, search: $search) { + id + idMal + title { + romaji + english + native + } + type + format + status(version: 2) + description(asHtml: true) + startDate { + year + month + day + } + endDate { + year + month + day + } + season + seasonYear + episodes + duration + chapters + volumes + countryOfOrigin + source + hashtag + trailer { + id + site + thumbnail + } + updatedAt + coverImage { + large + } + bannerImage + genres + synonyms + averageScore + meanScore + popularity + trending + favourites + tags { + name + description + rank + } + relations { + edges { + node { + id + title { + romaji + english + native + } + format + status + source + averageScore + siteUrl + } + relationType + } + } + characters { + edges { + role + node { + name { + full + native + } + siteUrl + } + } + } + studios { + nodes { + name + siteUrl + } + } + isAdult + nextAiringEpisode { + airingAt + timeUntilAiring + episode + } + airingSchedule { + edges { + node { + airingAt + timeUntilAiring + episode + } + } + } + externalLinks { + url + site + } + rankings { + rank + year + context + } + reviews { + nodes { + summary + rating + score + siteUrl + user { + name + } + } + } + siteUrl + } +} +""" + + +async def get_anime(title): + async with aiohttp.ClientSession() as sesi: + r = await sesi.post( + "https://graphql.anilist.co", + json={"query": anime_query, "variables": title}, + ) + return await r.read() + + +def shorten(description, info="anilist.co"): + ms_g = "" + if len(description) > 700: + description = f"{description[:500]}...." + ms_g += f'\nDescription: {description}More info' + else: + ms_g += f"\nDescription: {description}" + return ( + ms_g.replace("
    ", "") + .replace("
    ", "") + .replace("", "") + .replace("", "") + ) + + +@app.on_message(filters.command("anime", COMMAND_HANDLER)) +async def anime_search(_, mesg): + search = mesg.text.split(" ", 1) + reply = await mesg.reply("⏳ Please wait ...", quote=True) + if len(search) == 1: + return await reply.edit("⚠️ Give Anime name please.") + else: + search = search[1] + variables = {"search": search} + if not (res := json.loads(await get_anime(variables))["data"].get("Media", None)): + return await reply.edit("💢 No Resource Anime found! [404]") + durasi = ( + get_readable_time(int(res.get("duration") * 60)) + if res.get("duration") is not None + else "0" + ) + msg = f"{res['title']['romaji']} ({res['title']['native']})\nType: {res['format']}\nStatus: {res['status']}\nEpisodes: {res.get('episodes', 'N/A')}\nDuration : {durasi} Per Eps.\nScore: {res['averageScore']}%\nCategory: " + for x in res["genres"]: + msg += f"{x}, " + msg = msg[:-2] + "\n" + try: + sd = res["startDate"] + startdate = str(f"{month_name[sd['month']]} {sd['day']}, {sd['year']}") + except: + startdate = "-" + msg += f"Start date: {startdate}\n" + try: + ed = res["endDate"] + enddate = str(f"{month_name[ed['month']]} {ed['day']}, {ed['year']}") + except: + enddate = "-" + msg += f"End date: {enddate}\n" + msg += "Studios: " + for x in res["studios"]["nodes"]: + msg += f"{x['name']}, " + msg = msg[:-2] + "\n" + info = res.get("siteUrl") + trailer = res.get("trailer", None) + if trailer: + trailer_id = trailer.get("id", None) + site = trailer.get("site", None) + if site == "youtube": + trailer = f"https://youtu.be/{trailer_id}" + description = ( + res.get("description") + .replace("", "") + .replace("", "") + .replace("
    ", "") + if res.get("description") is not None + else "N/A" + ) + msg += shorten(description, info) + image = info.replace("anilist.co/anime/", "img.anili.st/media/") + btn = ( + [ + [ + InlineKeyboardButton("More info", url=info), + InlineKeyboardButton("Trailer 🎬", url=trailer), + ] + ] + if trailer + else [[InlineKeyboardButton("More info", url=info)]] + ) + + if image: + try: + await mesg.reply_photo( + image, caption=msg, reply_markup=InlineKeyboardMarkup(btn) + ) + except: + msg += f" [〽️]({image})" + await reply.edit(msg) + else: + await reply.edit(msg) + await reply.delete() diff --git a/misskaty/plugins/auto_approve.py b/misskaty/plugins/auto_approve.py new file mode 100644 index 00000000..82503ba9 --- /dev/null +++ b/misskaty/plugins/auto_approve.py @@ -0,0 +1,74 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +from pyrogram import filters +from pyrogram.errors import UserAlreadyParticipant, UserIsBlocked +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter + + +# Filters Approve User by bot in channel @YMovieZNew +@capture_err +@app.on_chat_join_request(filters.chat(-1001686184174)) +async def approve_join_chat(c, m): + try: + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Sudah", callback_data=f"approve_{m.chat.id}" + ), + InlineKeyboardButton( + text="Belum", callback_data=f"declined_{m.chat.id}" + ), + ] + ] + ) + await c.send_message( + m.from_user.id, + "PERMINTAAN JOIN CHANNEL YMOVIEZ REBORN\n\nSebelum masuk ke channel ada tes kejujuran, apakah anda sudah membaca catatan di @YMovieZ_New? Jika sudah silahkan klik Sudah, jika kamu berbohong resiko kamu tanggung sendiri 😶‍🌫️.\n\nBot by @YasirPediaChannel", + disable_web_page_preview=True, + reply_markup=markup, + ) + except UserIsBlocked: + await m.decline() + + +@app.on_callback_query(filters.regex(r"^approve")) +@ratelimiter +async def approve_chat(c, q): + _, chat = q.data.split("_") + try: + await q.message.edit( + "Yeayy, selamat kamu bisa bergabung di Channel YMovieZ Reborn..." + ) + await c.approve_chat_join_request(chat, q.from_user.id) + except UserAlreadyParticipant: + await q.message.edit( + "Kamu sudah di acc join grup, jadi ga perlu menekan button." + ) + except Exception as err: + await q.message.edit(err) + + +@app.on_callback_query(filters.regex(r"^declined")) +@ratelimiter +async def decline_chat(c, q): + _, chat = q.data.split("_") + try: + await q.message.edit( + "Yahh, kamu ditolak join channel. Biasakan rajin membaca yahhh.." + ) + await c.decline_chat_join_request(chat, q.from_user.id) + except UserAlreadyParticipant: + await q.message.edit( + "Kamu sudah di acc join grup, jadi ga perlu menekan button." + ) + except Exception as err: + await q.message.edit(err) diff --git a/misskaty/plugins/auto_forwarder.py b/misskaty/plugins/auto_forwarder.py new file mode 100644 index 00000000..28db9910 --- /dev/null +++ b/misskaty/plugins/auto_forwarder.py @@ -0,0 +1,97 @@ +# Code copy from https://github.com/AbirHasan2005/Forward-Client +from asyncio import sleep +from logging import getLogger + +from pyrogram import filters +from pyrogram.errors import FloodWait +from pyrogram.types import Message + +from misskaty import user +from misskaty.vars import ( + BLOCK_FILES_WITHOUT_EXTENSIONS, + BLOCKED_EXTENSIONS, + FORWARD_FILTERS, + FORWARD_FROM_CHAT_ID, + FORWARD_TO_CHAT_ID, + MINIMUM_FILE_SIZE, +) + +LOGGER = getLogger(__name__) + + +async def FilterMessage(message: Message): + if (message.forward_from or message.forward_from_chat) and ( + "forwarded" not in FORWARD_FILTERS + ): + return 400 + if (len(FORWARD_FILTERS) == 9) or ( + (message.video and ("video" in FORWARD_FILTERS)) + or (message.document and ("document" in FORWARD_FILTERS)) + or (message.photo and ("photo" in FORWARD_FILTERS)) + or (message.audio and ("audio" in FORWARD_FILTERS)) + or (message.text and ("text" in FORWARD_FILTERS)) + or (message.animation and ("gif" in FORWARD_FILTERS)) + or (message.poll and ("poll" in FORWARD_FILTERS)) + or (message.sticker and ("sticker" in FORWARD_FILTERS)) + ): + return 200 + else: + return 400 + + +async def CheckBlockedExt(event: Message): + media = event.document or event.video or event.audio or event.animation + if (BLOCK_FILES_WITHOUT_EXTENSIONS is True) and ("." not in media.file_name): + return True + if (media is not None) and (media.file_name is not None): + _file = media.file_name.rsplit(".", 1) + if len(_file) == 2: + return ( + _file[-1].lower() in BLOCKED_EXTENSIONS + or _file[-1].upper() in BLOCKED_EXTENSIONS + ) + + else: + return False + + +async def CheckFileSize(msg: Message): + media = msg.video or msg.document or msg.audio or msg.photo or msg.animation + return MINIMUM_FILE_SIZE is None or media.file_size >= int(MINIMUM_FILE_SIZE) + + +async def ForwardMessage(client: user, msg: Message): + try: + ## --- Check 1 --- ## + can_forward = await FilterMessage(message=msg) + if can_forward == 400: + return 400 + ## --- Check 2 --- ## + has_blocked_ext = await CheckBlockedExt(event=msg) + if has_blocked_ext is True: + return 400 + ## --- Check 3 --- ## + file_size_passed = await CheckFileSize(msg=msg) + if file_size_passed is False: + return 400 + ## --- Check 4 --- ## + for item in FORWARD_TO_CHAT_ID: + try: + await msg.copy(item) + except FloodWait as e: + await sleep(e.value) + LOGGER.warning(f"#FloodWait: Stopped Forwarder for {e.x}s!") + await ForwardMessage(client, msg) + except Exception as err: + LOGGER.warning( + f"#ERROR: {err}\n\nUnable to Forward Message to {str(item)}, reason: {err}" + ) + except: + pass + + +@user.on_message((filters.text | filters.media) & filters.chat(FORWARD_FROM_CHAT_ID)) +async def forwardubot(client: user, message: Message): + try_forward = await ForwardMessage(client, message) + if try_forward == 400: + return diff --git a/misskaty/plugins/ban_user_or_chat.py b/misskaty/plugins/ban_user_or_chat.py new file mode 100644 index 00000000..0c76b2ae --- /dev/null +++ b/misskaty/plugins/ban_user_or_chat.py @@ -0,0 +1,184 @@ +from pyrogram import Client, filters +from pyrogram.errors import ChannelPrivate, PeerIdInvalid +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from database.users_chats_db import db +from misskaty import app +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO, SUPPORT_CHAT + + +@app.on_message(filters.incoming, group=-5) +async def ban_reply(_, ctx: Message): + if not ctx.from_user: + return + ban = await db.get_ban_status(ctx.from_user.id) + if (ban.get("is_banned") and ctx.chat.type.value == "private") or ( + ban.get("is_banned") + and ctx.chat.type.value == "supergroup" + and bool(ctx.command) + ): + await ctx.reply_msg( + f'I am sorry, You are banned to use Me. \nBan Reason: {ban["ban_reason"]}' + ) + await ctx.stop_propagation() + + +@app.on_message(filters.group & filters.incoming, group=-2) +@use_chat_lang() +async def grp_bd(self: Client, ctx: Message, strings): + if not ctx.from_user: + return + if not await db.is_chat_exist(ctx.chat.id): + try: + total = await self.get_chat_members_count(ctx.chat.id) + except ChannelPrivate: + await ctx.stop_propagation() + r_j = ctx.from_user.mention if ctx.from_user else "Anonymous" + await self.send_message( + LOG_CHANNEL, + strings("log_bot_added", context="grup_tools").format( + ttl=ctx.chat.title, cid=ctx.chat.id, tot=total, r_j=r_j + ), + ) + await db.add_chat(ctx.chat.id, ctx.chat.title) + chck = await db.get_chat(ctx.chat.id) + if chck["is_disabled"]: + buttons = [ + [InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")] + ] + reply_markup = InlineKeyboardMarkup(buttons) + vazha = await db.get_chat(ctx.chat.id) + try: + k = await ctx.reply_msg( + f"CHAT NOT ALLOWED 🐞\n\nMy owner has restricted me from working here!\nReason : {vazha['reason']}.", + reply_markup=reply_markup, + ) + await k.pin() + except: + pass + try: + await self.leave_chat(ctx.chat.id) + except: + pass + await ctx.stop_propagation() + + +@app.on_message(filters.command("banuser", COMMAND_HANDLER) & filters.user(SUDO)) +async def ban_a_user(bot, message): + if len(message.command) == 1: + return await message.reply("Give me a user id / username") + r = message.text.split(None) + if len(r) > 2: + reason = message.text.split(None, 2)[2] + chat = message.text.split(None, 2)[1] + else: + chat = message.command[1] + reason = "No reason Provided" + try: + chat = int(chat) + except: + pass + try: + k = await bot.get_users(chat) + except PeerIdInvalid: + return await message.reply( + "This is an invalid user, make sure i have met him before." + ) + except IndexError: + return await message.reply("This might be a channel, make sure its a user.") + except Exception as e: + return await message.reply(f"Error - {e}") + else: + jar = await db.get_ban_status(k.id) + if jar["is_banned"]: + return await message.reply( + f"{k.mention} is already banned\nReason: {jar['ban_reason']}" + ) + await db.ban_user(k.id, reason) + await message.reply(f"Successfully banned user {k.mention}!! Reason: {reason}") + + +@app.on_message(filters.command("unbanuser", COMMAND_HANDLER) & filters.user(SUDO)) +async def unban_a_user(bot, message): + if len(message.command) == 1: + return await message.reply("Give me a user id / username") + r = message.text.split(None) + chat = message.text.split(None, 2)[1] if len(r) > 2 else message.command[1] + try: + chat = int(chat) + except: + pass + try: + k = await bot.get_users(chat) + except PeerIdInvalid: + return await message.reply( + "This is an invalid user, make sure ia have met him before." + ) + except IndexError: + return await message.reply("This might be a channel, make sure its a user.") + except Exception as e: + return await message.reply(f"Error - {e}") + else: + jar = await db.get_ban_status(k.id) + if not jar["is_banned"]: + return await message.reply(f"{k.mention} is not yet banned.") + await db.remove_ban(k.id) + await message.reply(f"Successfully unbanned user {k.mention}!!!") + + +@app.on_message(filters.command("disablechat", COMMAND_HANDLER) & filters.user(SUDO)) +async def disable_chat(bot, message): + if len(message.command) == 1: + return await message.reply("Give me a chat id") + r = message.text.split(None) + if len(r) > 2: + reason = message.text.split(None, 2)[2] + chat = message.text.split(None, 2)[1] + else: + chat = message.command[1] + reason = "No reason Provided" + try: + chat_ = int(chat) + except: + return await message.reply("Give Me A Valid Chat ID") + cha_t = await db.get_chat(chat_) + if not cha_t: + return await message.reply("Chat Not Found In DB") + if cha_t["is_disabled"]: + return await message.reply( + f"This chat is already disabled:\nReason- {cha_t['reason']} " + ) + await db.disable_chat(chat_, reason) + await message.reply("Chat Succesfully Disabled") + try: + buttons = [ + [InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")] + ] + reply_markup = InlineKeyboardMarkup(buttons) + await bot.send_message( + chat_id=chat_, + text=f"Hello Friends, \nMy owner has told me to leave from group so i go! If you wanna add me again contact my Owner. \nReason : {reason}", + reply_markup=reply_markup, + ) + await bot.leave_chat(chat_) + except Exception as e: + await message.reply(f"Error - {e}") + + +@app.on_message(filters.command("enablechat", COMMAND_HANDLER) & filters.user(SUDO)) +async def re_enable_chat(_, ctx: Message): + if len(ctx.command) == 1: + return await ctx.reply("Give me a chat id") + chat = ctx.command[1] + try: + chat_ = int(chat) + except: + return await ctx.reply("Give Me A Valid Chat ID") + sts = await db.get_chat(int(chat)) + if not sts: + return await ctx.reply("Chat Not Found In DB !") + if not sts.get("is_disabled"): + return await ctx.reply("This chat is not yet disabled.") + await db.re_enable_chat(chat_) + await ctx.reply("Chat Succesfully re-enabled") diff --git a/misskaty/plugins/blacklist_chat.py b/misskaty/plugins/blacklist_chat.py new file mode 100644 index 00000000..3ccd63f6 --- /dev/null +++ b/misskaty/plugins/blacklist_chat.py @@ -0,0 +1,119 @@ +""" +MIT License + +Copyright (c) 2023 TheHamkerCat + +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 re +from time import time + +from pyrogram import filters +from pyrogram.types import ChatPermissions + +from database.blacklist_db import ( + delete_blacklist_filter, + get_blacklisted_words, + save_blacklist_filter, +) +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import adminsOnly, list_admins +from misskaty.vars import SUDO + +__MODULE__ = "Blacklist" +__HELP__ = """ +/blacklisted - Get All The Blacklisted Words In The Chat. +/blacklist [WORD|SENTENCE] - Blacklist A Word Or A Sentence. +/whitelist [WORD|SENTENCE] - Whitelist A Word Or A Sentence. +""" + + +@app.on_message(filters.command("blacklist") & ~filters.private) +@adminsOnly("can_restrict_members") +async def save_filters(_, message): + if len(message.command) < 2: + return await message.reply_text("Usage:\n/blacklist [WORD|SENTENCE]") + word = message.text.split(None, 1)[1].strip() + if not word: + return await message.reply_text("**Usage**\n__/blacklist [WORD|SENTENCE]__") + chat_id = message.chat.id + await save_blacklist_filter(chat_id, word) + await message.reply_text(f"__**Blacklisted {word}.**__") + + +@app.on_message(filters.command("blacklisted") & ~filters.private) +@capture_err +async def get_filterss(_, message): + data = await get_blacklisted_words(message.chat.id) + if not data: + await message.reply_text("**No blacklisted words in this chat.**") + else: + msg = f"List of blacklisted words in {message.chat.title} :\n" + for word in data: + msg += f"**-** `{word}`\n" + await message.reply_text(msg) + + +@app.on_message(filters.command("whitelist") & ~filters.private) +@adminsOnly("can_restrict_members") +async def del_filter(_, message): + if len(message.command) < 2: + return await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]") + word = message.text.split(None, 1)[1].strip() + if not word: + return await message.reply_text("Usage:\n/whitelist [WORD|SENTENCE]") + chat_id = message.chat.id + deleted = await delete_blacklist_filter(chat_id, word) + if deleted: + return await message.reply_text(f"**Whitelisted {word}.**") + await message.reply_text("**No such blacklist filter.**") + + +@app.on_message(filters.text & ~filters.private, group=8) +@capture_err +async def blacklist_filters_re(_, message): + text = message.text.lower().strip() + if not text: + return + chat_id = message.chat.id + user = message.from_user + if not user: + return + if user.id in SUDO: + return + list_of_filters = await get_blacklisted_words(chat_id) + for word in list_of_filters: + pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])" + if re.search(pattern, text, flags=re.IGNORECASE): + if user.id in await list_admins(chat_id): + return + try: + await message.chat.restrict_member( + user.id, + ChatPermissions(), + until_date=int(time() + 3600), + ) + except Exception: + return + return await app.send_message( + chat_id, + f"Muted {user.mention} [`{user.id}`] for 1 hour " + + f"due to a blacklist match on {word}.", + ) diff --git a/misskaty/plugins/broadcast.py b/misskaty/plugins/broadcast.py new file mode 100644 index 00000000..cb4f16c3 --- /dev/null +++ b/misskaty/plugins/broadcast.py @@ -0,0 +1,47 @@ +import asyncio +import datetime +import time + +from pyrogram import filters +from pyrogram.types import Message + +from database.users_chats_db import db +from misskaty import app +from misskaty.vars import SUDO +from utils import broadcast_messages + + +@app.on_message(filters.command("broadcast") & filters.user(SUDO) & filters.reply) +async def broadcast(_, ctx: Message): + users = await db.get_all_users() + b_msg = ctx.reply_to_message + sts = await ctx.reply_msg("Broadcasting your messages...") + start_time = time.time() + total_users = await db.total_users_count() + done = 0 + blocked = 0 + deleted = 0 + failed = 0 + + success = 0 + async for user in users: + pti, sh = await broadcast_messages(int(user["id"]), b_msg) + if pti: + success += 1 + elif pti is False: + if sh == "Blocked": + blocked += 1 + elif sh == "Deleted": + deleted += 1 + elif sh == "Error": + failed += 1 + done += 1 + await asyncio.sleep(2) + if not done % 20: + await sts.edit_msg( + f"Broadcast in progress:\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}" + ) + time_taken = datetime.timedelta(seconds=int(time.time() - start_time)) + await sts.edit_msg( + f"Broadcast Completed:\nCompleted in {time_taken} seconds.\n\nTotal Users {total_users}\nCompleted: {done} / {total_users}\nSuccess: {success}\nBlocked: {blocked}\nDeleted: {deleted}" + ) diff --git a/misskaty/plugins/bypass.py b/misskaty/plugins/bypass.py new file mode 100644 index 00000000..7365a82e --- /dev/null +++ b/misskaty/plugins/bypass.py @@ -0,0 +1,127 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @lastModified 2022-12-01 09:32:31 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import re +import urllib.parse +from urllib.parse import unquote + +import requests +from pyrogram import filters +from pyrogram.errors import EntitiesTooLong, MessageTooLong +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import get_readable_file_size, http, rentry +from misskaty.vars import COMMAND_HANDLER + +LIST_LINK = """ +- Pling and all aliases. +- Wetransfer +- Other link soon... +""" + +__MODULE__ = "Bypass" +__HELP__ = f""" +/directurl [Link] - Bypass URL. + +Supported Link: +{LIST_LINK} + +Credit: PyBypass +""" + +# Stopped development for this plugin since always changed time by time. + + +async def pling_bypass(url): + try: + id_url = re.search(r"https?://(store.kde.org|www.pling.com)\/p\/(\d+)", url)[2] + link = f"https://www.pling.com/p/{id_url}/loadFiles" + res = await http.get(link) + json_dic_files = res.json().pop("files") + msg = f"\n**Source Link** :\n`{url}`\n**Direct Link :**\n" + msg += "\n".join( + f'**→ [{i["name"]}]({unquote(i["url"])}) ({get_readable_file_size(int(i["size"]))})**' + for i in json_dic_files + ) + return msg + except Exception as e: + return e + + +def wetransfer_bypass(url: str) -> str: + if url.startswith("https://we.tl/"): + r = requests.head(url, allow_redirects=True) + url = r.url + recipient_id = None + params = urllib.parse.urlparse(url).path.split("/")[2:] + + if len(params) == 2: + transfer_id, security_hash = params + elif len(params) == 3: + transfer_id, recipient_id, security_hash = params + else: + return None + + j = { + "intent": "entire_transfer", + "security_hash": security_hash, + } + + if recipient_id: + j["recipient_id"] = recipient_id + try: + s = requests.Session() + r = s.get("https://wetransfer.com/") + m = re.search('name="csrf-token" content="([^"]+)"', r.text) + s.headers.update({"x-csrf-token": m[1], "x-requested-with": "XMLHttpRequest"}) + r = s.post( + f"https://wetransfer.com/api/v4/transfers/{transfer_id}/download", json=j + ) + j = r.json() + dl_url = j["direct_link"] + + return f"\n**Source Link** :\n`{url}`\n**Direct Link :**\n{dl_url}" + except Exception as er: + return er + + +@app.on_message(filters.command(["directurl"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def bypass(_, ctx: Message): + if len(ctx.command) == 1: + return await ctx.reply_msg( + f"Gunakan perintah /{ctx.command[0]} untuk bypass url", del_in=6 + ) + url = ctx.command[1] + msg = await ctx.reply_msg("Bypassing URL..", quote=True) + mention = f"**Bypasser:** {ctx.from_user.mention} ({ctx.from_user.id})" + if re.match(r"https?://(store.kde.org|www.pling.com)\/p\/(\d+)", url): + data = await pling_bypass(url) + try: + await msg.edit_msg(f"{data}\n\n{mention}") + except (MessageTooLong, EntitiesTooLong): + result = await rentry(data) + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("Open Link", url=result), + InlineKeyboardButton("Raw Link", url=f"{result}/raw"), + ] + ] + ) + await msg.edit_msg( + f"{result}\n\nBecause your bypassed url is too long, so your link will be pasted to rentry.\n{mention}", + reply_markup=markup, + disable_web_page_preview=True, + ) + else: + data = wetransfer_bypass(url) + await msg.edit_msg(f"{data}\n\n{mention}") diff --git a/misskaty/plugins/chatbot_ai.py b/misskaty/plugins/chatbot_ai.py new file mode 100644 index 00000000..7f6da31f --- /dev/null +++ b/misskaty/plugins/chatbot_ai.py @@ -0,0 +1,91 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import asyncio +import html +import random + +import openai +from aiohttp import ClientSession +from pyrogram import filters +from pyrogram.errors import MessageTooLong +from pyrogram.types import Message + +from misskaty import app +from misskaty.core import pyro_cooldown +from misskaty.helper import check_time_gap, post_to_telegraph +from misskaty.helper.http import http +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, OPENAI_API, SUDO + +openai.api_key = OPENAI_API + + +# This only for testing things, since maybe in future it will got blocked +@app.on_message(filters.command("bard", COMMAND_HANDLER) & pyro_cooldown.wait(10)) +@use_chat_lang() +async def bard_chatbot(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg( + strings("no_question").format(cmd=ctx.command[0]), quote=True, del_in=5 + ) + msg = await ctx.reply_msg(strings("find_answers_str"), quote=True) + try: + req = await http.get( + f"https://yasirapi.eu.org/bard?input={ctx.text.split(' ', 1)[1]}" + ) + random_choice = random.choice(req.json().get("choices")) + await msg.edit_msg( + random_choice["content"][0] + if req.json().get("content") != "" + else "Failed getting data from Bard" + ) + except Exception as e: + await msg.edit_msg(str(e)) + + +@app.on_message(filters.command("ask", COMMAND_HANDLER) & pyro_cooldown.wait(10)) +@use_chat_lang() +async def openai_chatbot(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg( + strings("no_question").format(cmd=ctx.command[0]), quote=True, del_in=5 + ) + uid = ctx.from_user.id if ctx.from_user else ctx.sender_chat.id + is_in_gap, _ = await check_time_gap(uid) + if is_in_gap and (uid not in SUDO): + return await ctx.reply_msg(strings("dont_spam"), del_in=5) + openai.aiosession.set(ClientSession()) + pertanyaan = ctx.input + msg = await ctx.reply_msg(strings("find_answers_str"), quote=True) + num = 0 + answer = "" + try: + response = await openai.ChatCompletion.acreate( + model="gpt-3.5-turbo-0613", + messages=[{"role": "user", "content": pertanyaan}], + temperature=0.7, + stream=True, + ) + async for chunk in response: + if not chunk.choices[0].delta or chunk.choices[0].delta.get("role"): + continue + num += 1 + answer += chunk.choices[0].delta.content + if num == 30: + await msg.edit_msg(answer) + await asyncio.sleep(1.5) + num = 0 + await msg.edit_msg(answer) + except MessageTooLong: + answerlink = await post_to_telegraph( + False, "MissKaty ChatBot ", html.escape(f"{answer}") + ) + await msg.edit_msg( + strings("answers_too_long").format(answerlink=answerlink), + disable_web_page_preview=True, + ) + except Exception as err: + await msg.edit_msg(f"ERROR: {str(err)}") + await openai.aiosession.get().close() diff --git a/misskaty/plugins/code_tester.py b/misskaty/plugins/code_tester.py new file mode 100644 index 00000000..19d16ba0 --- /dev/null +++ b/misskaty/plugins/code_tester.py @@ -0,0 +1,747 @@ +import aiohttp +from pyrogram import enums, filters +from pyrogram.errors import MessageTooLong + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.tools import rentry +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "CodeTester" +__HELP__ = """ +This feature allows you to run multiple programming languages through this bot via the Glot.io api. The following is a list of supported languages, for temporary commands only support with a "!" like the example below. + +List of Supported Programming Languages: +~> assembly +~> ats +~> bash +~> c +~> clojure +~> cobol +~> coffeescript +~> cpp +~> crystal +~> csharp +~> d +~> elixir +~> elm +~> erlang +~> fsharp +~> go +~> groovy +~> haskell +~> idris +~> java +~> javascript +~> julia +~> kotlin +~> lua +~> mercury +~> nim +~> nix +~> ocaml +~> perl +~> php +~> python +~> raku +~> ruby +~> rust +~> scala +~> swift +~> typescript + +**Example:** +~> `!python print("Hai aku MissKatyRoBot")` +""" + + +async def listcode(): + async with aiohttp.ClientSession() as session: + r = await session.get("https://glot.io/api/run") + return await r.json() + + +async def glot(lang, langcode, code): + async with aiohttp.ClientSession() as session: + data = {"files": [{"name": f"misskaty.{langcode}", "content": code}]} + headers = { + "content-type": "application/json", + "Authorization": "Token b8a2b75a-a078-4089-869c-e53d448b1ebb", + } + r = await session.post( + f"https://glot.io/api/run/{lang}/latest", headers=headers, json=data + ) + return await r.json() + + +@app.on_message(filters.command(["codelist"], COMMAND_HANDLER)) +@ratelimiter +async def list_lang(_, message): + daftarlang = await listcode() + list_ = "".join(f"~> {i['name']}\n" for i in daftarlang) + return await message.reply( + f"List of Supported Programming Languages:\n{list_}" + ) + + +@app.on_message(filters.command(["assembly"], "!")) +@app.on_edited_message(filters.command(["assembly"], "!")) +@ratelimiter +async def assembly(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "asm", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["ats"], "!")) +@app.on_edited_message(filters.command(["ats"], "!")) +@ratelimiter +async def ats(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "dats", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["bash"], "!")) +@app.on_edited_message(filters.command(["bash"], "!")) +@ratelimiter +async def bash(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "sh", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["c"], "!")) +@app.on_edited_message(filters.command(["c"], "!")) +@ratelimiter +async def c(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "c", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["clojure"], "!")) +@app.on_edited_message(filters.command(["clojure"], "!")) +@ratelimiter +async def clojure(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "clj", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["cobol"], "!")) +@app.on_edited_message(filters.command(["cobol"], "!")) +@ratelimiter +async def cobol(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "cob", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["coffeescript"], "!")) +@app.on_edited_message(filters.command(["coffeescript"], "!")) +@ratelimiter +async def coffeescript(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "coffee", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["cpp"], "!")) +@app.on_edited_message(filters.command(["cpp"], "!")) +@ratelimiter +async def cpp(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "cpp", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["crystal"], "!")) +@app.on_edited_message(filters.command(["crystal"], "!")) +@ratelimiter +async def crystal(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "cr", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["csharp"], "!")) +@app.on_edited_message(filters.command(["csharp"], "!")) +@ratelimiter +async def csharp(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "cs", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["d"], "!")) +@app.on_edited_message(filters.command(["d"], "!")) +@ratelimiter +async def d(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "d", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["elixir"], "!")) +@app.on_edited_message(filters.command(["elixir"], "!")) +@ratelimiter +async def elixir(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "ex", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["elm"], "!")) +@app.on_edited_message(filters.command(["elm"], "!")) +async def elm(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "elm", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["erlang"], "!")) +@app.on_edited_message(filters.command(["erlang"], "!")) +@ratelimiter +async def erlang(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "erl", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["fsharp"], "!")) +@app.on_edited_message(filters.command(["fsharp"], "!")) +@ratelimiter +async def fsharp(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "fs", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["go"], "!")) +@app.on_edited_message(filters.command(["go"], "!")) +@ratelimiter +async def go(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "go", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["groovy"], "!")) +@app.on_edited_message(filters.command(["groovy"], "!")) +@ratelimiter +async def groovy(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "groovy", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["haskell"], "!")) +@app.on_edited_message(filters.command(["haskell"], "!")) +@ratelimiter +async def haskell(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "hs", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["idris"], "!")) +@app.on_edited_message(filters.command(["idris"], "!")) +@ratelimiter +async def idris(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "idr", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["java"], "!")) +@app.on_edited_message(filters.command(["java"], "!")) +@ratelimiter +async def java(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "java", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["javascript"], "!")) +@app.on_edited_message(filters.command(["javascript"], "!")) +@ratelimiter +async def javascript(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "js", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["julia"], "!")) +@app.on_edited_message(filters.command(["julia"], "!")) +@ratelimiter +async def julia(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "jl", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["kotlin"], "!")) +@app.on_edited_message(filters.command(["kotlin"], "!")) +@ratelimiter +async def kotlin(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "kt", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["lua"], "!")) +@app.on_edited_message(filters.command(["lua"], "!")) +@ratelimiter +async def lua(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "lua", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["mercury"], "!")) +@app.on_edited_message(filters.command(["mercury"], "!")) +@ratelimiter +async def mercury(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "m", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["nim"], "!")) +@app.on_edited_message(filters.command(["nim"], "!")) +@ratelimiter +async def nim(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "nim", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["nix"], "!")) +@app.on_edited_message(filters.command(["nix"], "!")) +@ratelimiter +async def nix(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "nix", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["ocaml"], "!")) +@app.on_edited_message(filters.command(["ocaml"], "!")) +@ratelimiter +async def ocaml(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "ml", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["perl"], "!")) +@app.on_edited_message(filters.command(["perl"], "!")) +@ratelimiter +async def perl(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "pl", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["php"], "!")) +@app.on_edited_message(filters.command(["php"], "!")) +async def php(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "php", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["python"], "!")) +@app.on_edited_message(filters.command(["python"], "!")) +@ratelimiter +async def python(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "py", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["raku"], "!")) +@app.on_edited_message(filters.command(["raku"], "!")) +@ratelimiter +async def raku(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "raku", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["ruby"], "!")) +@app.on_edited_message(filters.command(["ruby"], "!")) +@ratelimiter +async def ruby(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "rb", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["rust"], "!")) +@app.on_edited_message(filters.command(["rust"], "!")) +@ratelimiter +async def rust(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "rs", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["scala"], "!")) +@app.on_edited_message(filters.command(["scala"], "!")) +@ratelimiter +async def scala(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "scala", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["swift"], "!")) +@app.on_edited_message(filters.command(["swift"], "!")) +async def swift(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "swift", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) + + +@app.on_message(filters.command(["typescript"], "!")) +@app.on_edited_message(filters.command(["typescript"], "!")) +@ratelimiter +async def typescript(_, message): + if len(message.command) < 2: + return await message.reply("Please enter the code you want to run.") + res = await glot(message.command[0], "ts", message.text.split(None, 1)[1]) + hasil = res["stdout"] or res["stderr"] + hasil = f"Result :\n{hasil}" + try: + return await message.reply(hasil, parse_mode=enums.ParseMode.DISABLED) + except MessageTooLong: + post = await rentry(hasil) + return await message.reply(f"View Result in Rentry:\n{post}") + except Exception as e: + return await message.reply(e, parse_mode=enums.ParseMode.DISABLED) diff --git a/misskaty/plugins/copy_forward.py b/misskaty/plugins/copy_forward.py new file mode 100644 index 00000000..d80d23cc --- /dev/null +++ b/misskaty/plugins/copy_forward.py @@ -0,0 +1,112 @@ +from pyrogram import enums, filters +from pyrogram.errors import UserIsBlocked, UserNotParticipant +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from misskaty import BOT_USERNAME, app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.vars import COMMAND_HANDLER + + +@app.on_message(filters.command(["copy"], COMMAND_HANDLER)) +@ratelimiter +async def copymsg(_, message): + if len(message.command) == 1: + if not message.reply_to_message: + return await message.reply("Silahkan balas pesan yang mau dicopy.") + try: + await message.reply_to_message.copy( + message.from_user.id, + caption_entities=message.reply_to_message.entities, + reply_markup=message.reply_to_message.reply_markup, + ) + return await message.reply_text("Pesan berhasil dikirim..") + except UserIsBlocked: + return await message.reply( + "Silahkan PM Saya untuk mengcopy pesan ke chat pribadi..", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="💬 Chat Aku Yahh", + url=f"https://t.me/{BOT_USERNAME}", + ) + ] + ] + ), + ) + except Exception as e: + return await message.reply(f"ERROR: {str(e)}") + elif message.reply_to_message: + try: + idtujuan = message.command[1] + userstat = await app.get_chat_member(-1001686184174, message.from_user.id) + if ( + userstat.status + not in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ] + and message.from_user.id != 2024984460 + ): + return await message.reply_text("🦉🦉🦉") + await message.reply_to_message.copy( + idtujuan, + caption_entities=message.reply_to_message.entities, + reply_markup=message.reply_to_message.reply_markup, + ) + return await message.reply_text("Pesan berhasil dikirim..") + except UserNotParticipant: + return await message.reply("Command ini hanya untuk admin YMoviezNew") + except Exception as e: + return await message.reply(f"ERROR: {e}") + else: + await message.reply("Silahkan balas pesan yang mau dicopy.") + + +@app.on_message(filters.command(["forward"], COMMAND_HANDLER)) +@capture_err +async def forwardmsg(_, message): + if len(message.command) == 1: + if not message.reply_to_message: + return await message.reply("Silahkan balas pesan yang mau dicopy.") + try: + await message.reply_to_message.forward(message.from_user.id) + return await message.reply_text("Pesan berhasil dikirim..") + except UserIsBlocked: + return await message.reply( + "Silahkan PM Saya untuk memforward pesan ke chat pribadi..", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="💬 Chat Aku Yahh", + url=f"https://t.me/{BOT_USERNAME}", + ) + ] + ] + ), + ) + except Exception as e: + return await message.reply(f"ERROR: {str(e)}") + elif message.reply_to_message: + try: + idtujuan = message.command[1] + userstat = await app.get_chat_member(-1001686184174, message.from_user.id) + if ( + userstat.status + not in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ] + and message.from_user.id != 2024984460 + ): + return await message.reply_text("🦉🦉🦉") + await message.reply_to_message.forward(idtujuan) + return await message.reply_text("Pesan berhasil dikirim..") + except UserNotParticipant: + return await message.reply("Comman ini hanya untuk admin YMoviezNew") + except Exception as e: + return await message.reply(f"ERROR: {e}") + else: + await message.reply("Silahkan balas pesan yang mau diforward.") diff --git a/misskaty/plugins/currency.py b/misskaty/plugins/currency.py new file mode 100644 index 00000000..155589fd --- /dev/null +++ b/misskaty/plugins/currency.py @@ -0,0 +1,65 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import logging + +from pyrogram.types import Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.vars import CURRENCY_API + +__MODULE__ = "Currency" +__HELP__ = """ +/currency - Send structure message Telegram in JSON using Pyrogram Style. +""" + +LOGGER = logging.getLogger(__name__) + + +@app.on_cmd("currency") +@ratelimiter +async def currency(_, ctx: Message): + if CURRENCY_API is None: + return await ctx.reply_msg( + "Oops!!get the API from HERE & add it to config vars (CURRENCY_API)", + disable_web_page_preview=True, + ) + if len(ctx.text.split()) != 4: + return await ctx.reply_msg( + f"Use format /{ctx.command[0]} [amount] [currency_from] [currency_to] to convert currency.", + del_in=6, + ) + + _, amount, currency_from, currency_to = ctx.text.split() + if amount.isdigit() or ( + amount.replace(".", "", 1).isdigit() and amount.count(".") < 2 + ): + url = ( + f"https://v6.exchangerate-api.com/v6/{CURRENCY_API}/" + f"pair/{currency_from}/{currency_to}/{amount}" + ) + try: + res = await http.get(url) + data = res.json() + try: + conversion_rate = data["conversion_rate"] + conversion_result = data["conversion_result"] + target_code = data["target_code"] + base_code = data["base_code"] + last_update = data["time_last_update_utc"] + except KeyError: + return await ctx.reply_msg("Invalid response from api !
    ") + await ctx.reply_msg( + f"**CURRENCY EXCHANGE RATE RESULT:**\n\n`{format(float(amount), ',')}` **{base_code}** = `{format(float(conversion_result), ',')}` **{target_code}**\nRate Today = `{format(float(conversion_rate), ',')}`\nLast Update: {last_update}" + ) + except Exception as err: + await ctx.reply_msg( + f"Failed convert currency, maybe you give wrong currency format or api down.\n\nERROR: {err}" + ) + else: + await ctx.reply_msg( + "This seems to be some alien currency, which I can't convert right now.. (⊙_⊙;)" + ) diff --git a/misskaty/plugins/dev.py b/misskaty/plugins/dev.py new file mode 100644 index 00000000..515d4374 --- /dev/null +++ b/misskaty/plugins/dev.py @@ -0,0 +1,543 @@ +import asyncio +import contextlib +import html +import io +import json +import os +import pickle +import re +import sys +import traceback +from datetime import datetime +from inspect import getfullargspec +from shutil import disk_usage +from time import time +from typing import Any, Optional, Tuple + +import aiohttp +import cloudscraper +from PIL import Image, ImageDraw, ImageFont +from psutil import Process, boot_time, cpu_count, cpu_percent +from psutil import disk_usage as disk_usage_percent +from psutil import net_io_counters, virtual_memory +from pyrogram import Client +from pyrogram import __version__ as pyrover +from pyrogram import enums, filters +from pyrogram.errors import FloodWait, PeerIdInvalid +from pyrogram.raw.types import UpdateBotStopped +from pyrogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + InputMediaPhoto, + Message, +) + +from database.gban_db import add_gban_user, is_gbanned_user, remove_gban_user +from database.users_chats_db import db +from misskaty import BOT_NAME, app, botStartTime, misskaty_version, user +from misskaty.core.decorator import new_task +from misskaty.helper.eval_helper import format_exception, meval +from misskaty.helper.functions import extract_user, extract_user_and_reason +from misskaty.helper.http import http +from misskaty.helper.human_read import get_readable_file_size, get_readable_time +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO + +__MODULE__ = "DevCommand" +__HELP__ = """ +**For Owner Bot Only.** +/run [args] - Run eval CMD +/logs [int] - Check logs bot +/shell [args] - Run Exec/Terminal CMD +/download [link/reply_to_telegram_file] - Download file from Telegram +/disablechat [chat id] - Remove blacklist group +/enablechat [chat id] - Add Blacklist group +/banuser [chat id] - Ban user and block user so cannot use bot +/unbanuser [chat id] - Unban user and make their can use bot again +/gban - To Ban A User Globally. +/ungban - To remove ban user globbaly. +/restart - update and restart bot. + +**For Public Use** +/stats - Check statistic bot +/json - Send structure message Telegram in JSON using Pyrogram Style. +""" + +var = {} +teskode = {} + + +async def edit_or_reply(msg, **kwargs): + func = msg.edit 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_message(filters.command(["logs"], COMMAND_HANDLER) & filters.user(SUDO)) +@use_chat_lang() +async def log_file(_, ctx: Message, strings): + """Send log file""" + msg = await ctx.reply_msg("Reading bot logs ...") + if len(ctx.command) == 1: + await ctx.reply_document( + "MissKatyLogs.txt", + caption="Log Bot MissKatyPyro", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + strings("cl_btn"), + f"close#{ctx.from_user.id}", + ) + ] + ] + ), + ) + await msg.delete_msg() + elif len(ctx.command) == 2: + val = ctx.text.split() + tail = await shell_exec(f"tail -n {val[1]} -v MissKatyLogs.txt") + await msg.edit_msg(f"
    {html.escape(tail[0])}
    ") + else: + await msg.edit_msg("Unsupported parameter") + + +@app.on_message(filters.command(["donate"], COMMAND_HANDLER)) +async def donate(_, ctx: Message): + await ctx.reply_photo( + "https://telegra.ph/file/9427d61d6968b8ee4fb2f.jpg", + caption=f"Hai {ctx.from_user.mention}, jika kamu merasa bot ini berguna kamu bisa melakukan donasi dengan scan QR menggunakan merchant yang support QRIS ya. Karena server bot ini menggunakan VPS dan tidaklah gratis. Terimakasih..\n\nHi {ctx.from_user.mention}, if you feel this bot is useful, you can make a donation via Paypal for international payment : https://paypal.me/yasirarism. Because this bot server is hosted in VPS and not free. Thank you..", + ) + + +@app.on_message( + filters.command(["balas"], COMMAND_HANDLER) & filters.user(SUDO) & filters.reply +) +async def balas(_, ctx: Message) -> "str": + pesan = ctx.input + await ctx.delete_msg() + await ctx.reply_msg(pesan, reply_to_message_id=ctx.reply_to_message.id) + + +@app.on_message(filters.command(["stats"], COMMAND_HANDLER)) +@new_task +async def server_stats(_, ctx: Message) -> "Message": + """ + Give system stats of the server. + """ + image = Image.open("assets/statsbg.jpg").convert("RGB") + IronFont = ImageFont.truetype("assets/IronFont.otf", 42) + draw = ImageDraw.Draw(image) + + def draw_progressbar(coordinate, progress): + progress = 110 + (progress * 10.8) + draw.ellipse((105, coordinate - 25, 127, coordinate), fill="#FFFFFF") + draw.rectangle((120, coordinate - 25, progress, coordinate), fill="#FFFFFF") + draw.ellipse( + (progress - 7, coordinate - 25, progress + 15, coordinate), fill="#FFFFFF" + ) + + total, used, free = disk_usage(".") + process = Process(os.getpid()) + + botuptime = get_readable_time(time() - botStartTime) + osuptime = get_readable_time(time() - boot_time()) + currentTime = get_readable_time(time() - botStartTime) + botusage = f"{round(process.memory_info()[0]/1024 ** 2)} MB" + + upload = get_readable_file_size(net_io_counters().bytes_sent) + download = get_readable_file_size(net_io_counters().bytes_recv) + + cpu_percentage = cpu_percent() + cpu_counts = cpu_count() + + ram_percentage = virtual_memory().percent + ram_total = get_readable_file_size(virtual_memory().total) + ram_used = get_readable_file_size(virtual_memory().used) + + disk_percenatge = disk_usage_percent("/").percent + disk_total = get_readable_file_size(total) + disk_used = get_readable_file_size(used) + disk_free = get_readable_file_size(free) + + neofetch = (await shell_exec("neofetch --stdout"))[0] + + caption = f"{BOT_NAME} {misskaty_version} is Up and Running successfully.\n\n{neofetch}\n\n**OS Uptime:** {osuptime}\nBot Uptime: {currentTime}\n**Bot Usage:** {botusage}\n\n**Total Space:** {disk_total}\n**Free Space:** {disk_free}\n\n**Download:** {download}\n**Upload:** {upload}\n\nPyrogram Version: {pyrover}\nPython Version: {sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]} {sys.version_info[3].title()}" + + start = datetime.now() + msg = await ctx.reply_photo( + photo="https://te.legra.ph/file/30a82c22854971d0232c7.jpg", + caption=caption, + quote=True, + ) + end = datetime.now() + + draw_progressbar(243, int(cpu_percentage)) + draw.text( + (225, 153), + f"( {cpu_counts} core, {cpu_percentage}% )", + (255, 255, 255), + font=IronFont, + ) + + draw_progressbar(395, int(disk_percenatge)) + draw.text( + (335, 302), + f"( {disk_used} / {disk_total}, {disk_percenatge}% )", + (255, 255, 255), + font=IronFont, + ) + + draw_progressbar(533, int(ram_percentage)) + draw.text( + (225, 445), + f"( {ram_used} / {ram_total} , {ram_percentage}% )", + (255, 255, 255), + font=IronFont, + ) + + draw.text((335, 600), f"{botuptime}", (255, 255, 255), font=IronFont) + draw.text( + (857, 607), + f"{(end-start).microseconds/1000} ms", + (255, 255, 255), + font=IronFont, + ) + + image.save("stats.png") + await msg.edit_media(media=InputMediaPhoto("stats.png", caption=caption)) + os.remove("stats.png") + + +# Gban +@app.on_message(filters.command("gban", COMMAND_HANDLER) & filters.user(SUDO)) +async def ban_globally(self: Client, ctx: Message): + user_id, reason = await extract_user_and_reason(ctx) + if not user_id: + return await ctx.reply_text("I can't find that user.") + if not reason: + return await ctx.reply("No reason provided.") + + try: + getuser = await app.get_users(user_id) + user_mention = getuser.mention + user_id = user.id + except PeerIdInvalid: + user_mention = int(user_id) + user_id = int(user_id) + + from_user = ctx.from_user + + if user_id in [from_user.id, self.me.id] or user_id in SUDO: + return await ctx.reply_text("I can't ban that user.") + served_chats = await db.get_all_chats() + m = await ctx.reply_text( + f"**Banning {user_mention} Globally! This may take several times.**" + ) + await add_gban_user(user_id) + number_of_chats = 0 + async for served_chat in served_chats: + try: + await app.ban_chat_member(served_chat["id"], user_id) + number_of_chats += 1 + await asyncio.sleep(1) + except FloodWait as e: + await asyncio.sleep(int(e.value)) + except Exception: + pass + with contextlib.suppress(Exception): + await app.send_message( + user_id, + f"Hello, You have been globally banned by {from_user.mention}, You can appeal for this ban by talking to him.", + ) + await m.edit(f"Banned {user_mention} Globally!") + ban_text = f""" +__**New Global Ban**__ +**Origin:** {ctx.chat.title} [`{ctx.chat.id}`] +**Admin:** {from_user.mention} +**Banned User:** {user_mention} +**Banned User ID:** `{user_id}` +**Reason:** __{reason}__ +**Chats:** `{number_of_chats}`""" + try: + m2 = await app.send_message( + LOG_CHANNEL, + text=ban_text, + disable_web_page_preview=True, + ) + await m.edit( + f"Banned {user_mention} Globally!\nAction Log: {m2.link}", + disable_web_page_preview=True, + ) + except Exception: + await ctx.reply_text( + "User Gbanned, But This Gban Action Wasn't Logged, Add Me In LOG_CHANNEL" + ) + + +# Ungban +@app.on_message(filters.command("ungban", COMMAND_HANDLER) & filters.user(SUDO)) +async def unban_globally(_, ctx: Message): + user_id = await extract_user(ctx) + if not user_id: + return await ctx.reply_text("I can't find that user.") + try: + getuser = await app.get_users(user_id) + user_mention = getuser.mention + user_id = user.id + except PeerIdInvalid: + user_mention = int(user_id) + user_id = int(user_id) + + is_gbanned = await is_gbanned_user(user_id) + if not is_gbanned: + await ctx.reply_text("I don't remember Gbanning him.") + else: + await remove_gban_user(user_id) + await ctx.reply_text(f"Lifted {user_mention}'s Global Ban.'") + + +@app.on_message( + filters.command(["shell", "sh", "term"], COMMAND_HANDLER) & filters.user(SUDO) +) +@app.on_edited_message( + filters.command(["shell", "sh", "term"], COMMAND_HANDLER) & filters.user(SUDO) +) +@user.on_message(filters.command(["shell", "sh", "term"], ".") & filters.me) +@use_chat_lang() +async def shell_cmd(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await edit_or_reply(ctx, text=strings("no_cmd")) + msg = ( + await ctx.edit_msg(strings("run_exec")) + if ctx.from_user.is_self + else await ctx.reply_msg(strings("run_exec")) + ) + shell = (await shell_exec(ctx.input))[0] + if len(shell) > 3000: + with io.BytesIO(str.encode(shell)) as doc: + doc.name = "shell_output.txt" + await ctx.reply_document( + document=doc, + caption=f"{ctx.input[: 4096 // 4 - 1]}", + file_name=doc.name, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("cl_btn"), + callback_data=f"close#{ctx.from_user.id}", + ) + ] + ] + ), + ) + await msg.delete_msg() + elif len(shell) != 0: + await edit_or_reply( + ctx, + text=html.escape(shell), + parse_mode=enums.ParseMode.HTML, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("cl_btn"), + callback_data=f"close#{ctx.from_user.id}", + ) + ] + ] + ), + ) + if not ctx.from_user.is_self: + await msg.delete_msg() + else: + await ctx.reply_msg(strings("no_reply"), del_in=5) + + +@app.on_message( + ( + filters.command(["ev", "run", "myeval"], COMMAND_HANDLER) + | filters.regex(r"app.run\(\)$") + ) + & filters.user(SUDO) +) +@app.on_edited_message( + (filters.command(["ev", "run", "myeval"]) | filters.regex(r"app.run\(\)$")) + & filters.user(SUDO) +) +@user.on_message(filters.command(["ev", "run", "myeval"], ".") & filters.me) +@use_chat_lang() +@new_task +async def cmd_eval(self: Client, ctx: Message, strings) -> Optional[str]: + if (ctx.command and len(ctx.command) == 1) or ctx.text == "app.run()": + return await edit_or_reply(ctx, text=strings("no_eval")) + status_message = ( + await ctx.edit_msg(strings("run_eval")) + if ctx.from_user.is_self + else await ctx.reply_msg(strings("run_eval"), quote=True) + ) + code = ( + ctx.text.split(" ", 1)[1] if ctx.command else ctx.text.split("\napp.run()")[0] + ) + out_buf = io.StringIO() + out = "" + humantime = get_readable_time + + async def _eval() -> Tuple[str, Optional[str]]: + # Message sending helper for convenience + async def send(*args: Any, **kwargs: Any) -> Message: + return await ctx.reply_msg(*args, **kwargs) + + # Print wrapper to capture output + # We don't override sys.stdout to avoid interfering with other output + def _print(*args: Any, **kwargs: Any) -> None: + if "file" not in kwargs: + kwargs["file"] = out_buf + return print(*args, **kwargs) + + def _help(*args: Any, **kwargs: Any) -> None: + with contextlib.redirect_stdout(out_buf): + help(*args, **kwargs) + + eval_vars = { + "self": self, + "humantime": humantime, + "ctx": ctx, + "var": var, + "teskode": teskode, + "re": re, + "os": os, + "asyncio": asyncio, + "cloudscraper": cloudscraper, + "json": json, + "aiohttp": aiohttp, + "print": _print, + "send": send, + "stdout": out_buf, + "traceback": traceback, + "http": http, + "replied": ctx.reply_to_message, + "help": _help, + } + eval_vars.update(var) + eval_vars.update(teskode) + try: + return "", await meval(code, globals(), **eval_vars) + except Exception as e: # skipcq: PYL-W0703 + # Find first traceback frame involving the snippet + first_snip_idx = -1 + tb = traceback.extract_tb(e.__traceback__) + for i, frame in enumerate(tb): + if frame.filename == "" or frame.filename.endswith("ast.py"): + first_snip_idx = i + break + # Re-raise exception if it wasn't caused by the snippet + # Return formatted stripped traceback + stripped_tb = tb[first_snip_idx:] + formatted_tb = format_exception(e, tb=stripped_tb) + return "⚠️ Error while executing snippet\n\n", formatted_tb + + before = time() + prefix, result = await _eval() + after = time() + # Always write result if no output has been collected thus far + if not out_buf.getvalue() or result is not None: + print(result, file=out_buf) + el_us = after - before + try: + el_str = get_readable_time(el_us) + except: + el_str = "1s" + if not el_str or el_str is None: + el_str = "0.1s" + + out = out_buf.getvalue() + # Strip only ONE final newline to compensate for our message formatting + if out.endswith("\n"): + out = out[:-1] + final_output = f"{prefix}INPUT:\n
    {html.escape(code)}
    \nOUTPUT:\n
    {html.escape(out)}
    \nExecuted Time: {el_str}" + if len(final_output) > 4096: + with io.BytesIO(str.encode(out)) as out_file: + out_file.name = "MissKatyEval.txt" + await ctx.reply_document( + document=out_file, + caption=f"{code[: 4096 // 4 - 1]}", + disable_notification=True, + thumb="assets/thumb.jpg", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("cl_btn"), + callback_data=f"close#{ctx.from_user.id}", + ) + ] + ] + ), + ) + await status_message.delete_msg() + else: + await edit_or_reply( + ctx, + text=final_output, + parse_mode=enums.ParseMode.HTML, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("cl_btn"), + callback_data=f"close#{ctx.from_user.id}", + ) + ] + ] + ), + ) + if not ctx.from_user.is_self: + await status_message.delete_msg() + + +# Update and restart bot +@app.on_message(filters.command(["restart"], COMMAND_HANDLER) & filters.user(SUDO)) +@use_chat_lang() +async def update_restart(_, ctx: Message, strings): + msg = await ctx.reply_msg(strings("up_and_rest")) + await shell_exec("python3 update.py") + with open("restart.pickle", "wb") as status: + pickle.dump([ctx.chat.id, msg.id], status) + os.execvp(sys.executable, [sys.executable, "-m", "misskaty"]) + + +@app.on_raw_update(group=-99) +async def updtebot(client, update, users, _): + if isinstance(update, UpdateBotStopped): + niuser = users[update.user_id] + if update.stopped and await db.is_user_exist(niuser.id): + await db.delete_user(niuser.id) + await client.send_msg( + LOG_CHANNEL, + f"{niuser.first_name} ({niuser.id}) " + f"{'BLOCKED' if update.stopped else 'UNBLOCKED'} the bot at " + f"{datetime.fromtimestamp(update.date)}", + ) + + +async def aexec(code, c, m): + exec( + "async def __aexec(c, m): " + + "\n p = print" + + "\n replied = m.reply_to_message" + + "".join(f"\n {l_}" for l_ in code.split("\n")) + ) + return await locals()["__aexec"](c, m) + + +async def shell_exec(code, treat=True): + process = await asyncio.create_subprocess_shell( + code, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT + ) + + stdout = (await process.communicate())[0] + if treat: + stdout = stdout.decode().strip() + return stdout, process diff --git a/misskaty/plugins/download_upload.py b/misskaty/plugins/download_upload.py new file mode 100644 index 00000000..b2980288 --- /dev/null +++ b/misskaty/plugins/download_upload.py @@ -0,0 +1,227 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import asyncio +import math +import os +import time +from datetime import datetime +from logging import getLogger +from urllib.parse import unquote + +from pyrogram import filters +from pyrogram.file_id import FileId +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from pySmartDL import SmartDL + +from misskaty import app +from misskaty.core.decorator import capture_err, new_task +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.helper.pyro_progress import humanbytes, progress_for_pyrogram +from misskaty.vars import COMMAND_HANDLER, SUDO + +LOGGER = getLogger(__name__) + +__MODULE__ = "Download/Upload" +__HELP__ = """ +/download [url] - Download file from URL (Sudo Only) +/download [reply_to_TG_File] - Download TG File +/tgraph_up [reply_to_TG_File] - Download TG File +/tiktokdl [link] - Download TikTok Video, try use ytdown command if error. +/fbdl [link] - Download Facebook Video. +/anon [link] - Upload files to Anonfiles. +/ytdown [YT-DLP Supported URL] - Downloading YT-DLP Supported Video and Audio. +""" + + +@app.on_message(filters.command(["anon"], COMMAND_HANDLER)) +@ratelimiter +async def upload(bot, message): + if not message.reply_to_message: + return await message.reply("Please reply to media file.") + vid = [ + message.reply_to_message.video, + message.reply_to_message.document, + message.reply_to_message.audio, + message.reply_to_message.photo, + ] + media = next((v for v in vid if v is not None), None) + if not media: + return await message.reply("Unsupported media type..") + m = await message.reply("Download your file to my Server...") + now = time.time() + dc_id = FileId.decode(media.file_id).dc_id + fileku = await message.reply_to_message.download( + progress=progress_for_pyrogram, + progress_args=("Trying to download, please wait..", m, now, dc_id), + ) + try: + files = {"file": open(fileku, "rb")} + await m.edit("Uploading to Anonfile, Please Wait||") + callapi = await http.post("https://api.anonfiles.com/upload", files=files) + text = callapi.json() + output = f'File Uploaded to Anonfile\n\n📂 File Name: {text["data"]["file"]["metadata"]["name"]}\n\n📦 File Size: {text["data"]["file"]["metadata"]["size"]["readable"]}\n\n📥 Download Link: {text["data"]["file"]["url"]["full"]}' + + btn = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "📥 Download 📥", url=f"{text['data']['file']['url']['full']}" + ) + ] + ] + ) + await m.edit(output, reply_markup=btn) + except Exception as e: + await bot.send_message(message.chat.id, text=f"Something Went Wrong!\n\n{e}") + os.remove(fileku) + + +@app.on_message(filters.command(["download"], COMMAND_HANDLER) & filters.user(SUDO)) +@capture_err +@new_task +async def download(client, message): + pesan = await message.reply_text("Processing...", quote=True) + if message.reply_to_message is not None: + start_t = datetime.now() + c_time = time.time() + vid = [ + message.reply_to_message.video, + message.reply_to_message.document, + message.reply_to_message.audio, + message.reply_to_message.photo, + ] + media = next((v for v in vid if v is not None), None) + if not media: + return await pesan.edit_msg("Unsupported media type..") + dc_id = FileId.decode(media.file_id).dc_id + the_real_download_location = await client.download_media( + message=message.reply_to_message, + progress=progress_for_pyrogram, + progress_args=("Trying to download, sabar yakk..", pesan, c_time, dc_id), + ) + end_t = datetime.now() + ms = (end_t - start_t).seconds + await pesan.edit( + f"Downloaded to {the_real_download_location} in {ms} seconds." + ) + elif len(message.command) > 1: + start_t = datetime.now() + the_url_parts = " ".join(message.command[1:]) + url = the_url_parts.strip() + custom_file_name = os.path.basename(url) + if "|" in the_url_parts: + url, custom_file_name = the_url_parts.split("|") + url = url.strip() + custom_file_name = custom_file_name.strip() + download_file_path = os.path.join("downloads/", custom_file_name) + downloader = SmartDL(url, download_file_path, progress_bar=False, timeout=10) + try: + downloader.start(blocking=False) + except Exception as err: + return await message.edit_msg(str(err)) + c_time = time.time() + while not downloader.isFinished(): + total_length = downloader.filesize or None + downloaded = downloader.get_dl_size(human=True) + display_message = "" + now = time.time() + diff = now - c_time + percentage = downloader.get_progress() * 100 + speed = downloader.get_speed(human=True) + progress_str = "[{0}{1}]\nProgress: {2}%".format( + "".join(["●" for _ in range(math.floor(percentage / 5))]), + "".join(["○" for _ in range(20 - math.floor(percentage / 5))]), + round(percentage, 2), + ) + + estimated_total_time = downloader.get_eta(human=True) + try: + current_message = "Trying to download...\n" + current_message += f"URL: {url}\n" + current_message += ( + f"File Name: {unquote(custom_file_name)}\n" + ) + current_message += f"Speed: {speed}\n" + current_message += f"{progress_str}\n" + current_message += f"{downloaded} of {humanbytes(total_length)}\n" + current_message += f"ETA: {estimated_total_time}" + if round(diff % 10.00) == 0 and current_message != display_message: + await pesan.edit( + disable_web_page_preview=True, text=current_message + ) + display_message = current_message + await asyncio.sleep(10) + except Exception as e: + LOGGER.info(str(e)) + if os.path.exists(download_file_path): + end_t = datetime.now() + ms = (end_t - start_t).seconds + await pesan.edit( + f"Downloaded to {download_file_path} in {ms} seconds" + ) + else: + await pesan.edit( + "Reply to a Telegram Media, to download it to my local server." + ) + + +@app.on_message(filters.command(["tiktokdl"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def tiktokdl(_, message): + if len(message.command) == 1: + return await message.reply( + f"Use command /{message.command[0]} [link] to download tiktok video." + ) + link = message.command[1] + msg = await message.reply("Trying download...") + try: + r = ( + await http.get(f"https://apimu.my.id/downloader/tiktok3?link={link}") + ).json() + await message.reply_video( + r["hasil"]["download_mp4_hd"], + caption=f"Title: {r['hasil']['video_title']}\nUploader: {r['hasil']['name']}\n👍: {r['hasil']['like']} 🔁: {r['hasil']['share']} 💬: {r['hasil']['comment']}\n\nUploaded for {message.from_user.mention} [{message.from_user.id}]", + ) + await msg.delete() + except Exception as e: + await message.reply(f"Failed to download tiktok video..\n\nReason: {e}") + await msg.delete() + + +@app.on_message(filters.command(["fbdl"], COMMAND_HANDLER)) +@capture_err +async def fbdl(_, message): + if len(message.command) == 1: + return await message.reply( + f"Use command /{message.command[0]} [link] to download Facebook video." + ) + link = message.command[1] + msg = await message.reply("Trying download...") + try: + resjson = (await http.get(f"https://yasirapi.eu.org/fbdl?link={link}")).json() + try: + url = resjson["result"]["links"]["hd"].replace("&", "&") + except: + url = resjson["result"]["links"]["sd"].replace("&", "&") + obj = SmartDL(url, progress_bar=False, timeout=10) + obj.start() + path = obj.get_dest() + await message.reply_video( + path, + caption=f"{os.path.basename(path)}\n\nUploaded for {message.from_user.mention} [{message.from_user.id}]", + thumb="assets/thumb.jpg", + ) + await msg.delete() + try: + os.remove(path) + except: + pass + except Exception as e: + await message.reply( + f"Failed to download Facebook video..\n\nReason: {e}" + ) + await msg.delete() diff --git a/misskaty/plugins/filter_request.py b/misskaty/plugins/filter_request.py new file mode 100644 index 00000000..03e92d0f --- /dev/null +++ b/misskaty/plugins/filter_request.py @@ -0,0 +1,444 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import random +import re +import shutil + +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from pyrogram import enums, filters +from pyrogram.errors import PeerIdInvalid, UserNotParticipant +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import admins_in_chat +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.time_gap import check_time_gap +from utils import temp + +from .pypi_search import PYPI_DICT +from .web_scraper import SCRAP_DICT, data_kuso +from .ytdl_plugins import YT_DB + +chat = [-1001128045651, -1001255283935, -1001455886928] +REQUEST_DB = {} + + +@app.on_message(filters.regex(r"alamu'?ala[iy]ku+m", re.I) & filters.chat(chat)) +async def salamregex(_, message): + await message.reply_text(text=f"Wa'alaikumsalam {message.from_user.mention} 😇") + + +@app.on_message( + filters.regex(r"#request|#req", re.I) + & (filters.text | filters.photo) + & filters.chat(-1001255283935) + & ~filters.channel +) +@capture_err +async def request_user(client, message): + if message.sender_chat: + return await message.reply( + f"{message.from_user.mention} mohon gunakan akun asli saat request." + ) + is_in_gap, sleep_time = await check_time_gap(message.from_user.id) + if is_in_gap: + return await message.reply( + f"Sabar dikit napa.. Tunggu {sleep_time} detik lagi 🙄" + ) + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="💬 Lihat Pesan", url=f"https://t.me/c/1255283935/{message.id}" + ) + ], + [ + InlineKeyboardButton( + text="🚫 Tolak", + callback_data=f"rejectreq_{message.id}_{message.chat.id}", + ), + InlineKeyboardButton( + text="✅ Done", + callback_data=f"donereq_{message.id}_{message.chat.id}", + ), + ], + [ + InlineKeyboardButton( + text="⚠️ Tidak Tersedia", + callback_data=f"unavailablereq_{message.id}_{message.chat.id}", + ) + ], + [ + InlineKeyboardButton( + text="🔍 Sudah Ada", + callback_data=f"dahada_{message.id}_{message.chat.id}", + ) + ], + ] + ) + try: + user_id = message.from_user.id + if user_id in REQUEST_DB: + REQUEST_DB[user_id] += 1 + else: + REQUEST_DB[user_id] = 1 + if REQUEST_DB[user_id] > 3: + return await message.reply( + f"Mohon maaf {message.from_user.mention}, maksimal request hanya 3x perhari. Kalo mau tambah 5k per request 😝😝." + ) + if message.text: + forward = await client.send_message( + -1001575525902, + f"Request by {message.from_user.first_name} (#id{message.from_user.id})\n\n{message.text}", + reply_markup=markup, + ) + markup2 = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳ Cek Status Request", + url=f"https://t.me/c/1575525902/{forward.id}", + ) + ] + ] + ) + if message.photo: + forward = await client.send_photo( + -1001575525902, + message.photo.file_id, + caption=f"Request by {message.from_user.first_name} (#id{message.from_user.id})\n\n{message.caption}", + reply_markup=markup, + ) + markup2 = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⏳ Cek Status Request", + url=f"https://t.me/c/1575525902/{forward.id}", + ) + ] + ] + ) + await message.reply_text( + text=f"Hai {message.from_user.mention}, request kamu sudah dikirim yaa. Harap bersabar mungkin admin juga punya kesibukan lain.\n\nSisa Request: {3 - REQUEST_DB[user_id]}x", + quote=True, + reply_markup=markup2, + ) + except: + pass + + +# To reduce cache and disk +async def clear_reqdict(): + SCRAP_DICT.clear() + data_kuso.clear() + REQUEST_DB.clear() + PYPI_DICT.clear() + YT_DB.clear() + admins_in_chat.clear() + temp.MELCOW.clear() + shutil.rmtree("downloads", ignore_errors=True) + shutil.rmtree("GensSS", ignore_errors=True) + + +@app.on_message( + filters.regex(r"makasi|thank|terimakasih|terima kasih|mksh", re.I) + & filters.chat(chat) +) +async def thankregex(_, message): + pesan = [ + f"Sama-sama {message.from_user.first_name}", + f"You're Welcome {message.from_user.first_name}", + "Oke..", + "Yoi..", + "Terimakasih Kembali..", + "Sami-Sami...", + "Sama-sama, senang bisa membantu..", + f"Yups, Sama-sama {message.from_user.first_name}", + "Okayyy...", + ] + await message.reply_text(text=random.choice(pesan)) + + +@app.on_callback_query(filters.regex(r"^donereq")) +@ratelimiter +async def callbackreq(c, q): + try: + user = await c.get_chat_member(-1001201566570, q.from_user.id) + if user.status in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ]: + _, msg_id, chat_id = q.data.split("_") + await c.send_message( + chat_id=chat_id, + text="#Done\nDone ✅, Selamat menonton. Jika request tidak bisa dilihat digrup silahkan join channel melalui link private yang ada di @YMovieZ_New ...", + reply_to_message_id=int(msg_id), + ) + + if q.message.caption: + await q.message.edit_text( + f"COMPLETED\n\n{q.message.caption}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="✅ Request Completed", callback_data="reqcompl" + ) + ] + ] + ), + ) + else: + await q.message.edit_text( + f"COMPLETED\n\n{q.message.text}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="✅ Request Completed", callback_data="reqcompl" + ) + ] + ] + ), + ) + await q.answer("Request berhasil diselesaikan ✅") + else: + await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True) + except UserNotParticipant: + return await q.answer( + "Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10 + ) + except PeerIdInvalid: + return await q.answer( + "Silahkan kirim pesan digrup supaya bot bisa merespon.", + show_alert=True, + cache_time=10, + ) + + +@app.on_callback_query(filters.regex(r"^dahada")) +@ratelimiter +async def callbackreqada(c, q): + try: + user = await c.get_chat_member(-1001201566570, q.from_user.id) + if user.status in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ]: + _, msg_id, chat_id = q.data.split("_") + await c.send_message( + chat_id=chat_id, + text="#SudahAda\nFilm/series yang direquest sudah ada sebelumnya. Biasakan mencari terlebih dahulu..", + reply_to_message_id=int(msg_id), + ) + + if q.message.caption: + await q.message.edit_text( + f"#AlreadyAvailable\n\n{q.message.caption}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🔍 Request Sudah Ada", + callback_data="reqavailable", + ) + ] + ] + ), + ) + else: + await q.message.edit_text( + f"Already Available\n\n{q.message.text}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🔍 Request Sudah Ada", + callback_data="reqavailable", + ) + ] + ] + ), + ) + await q.answer("Done ✔️") + else: + await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True) + except UserNotParticipant: + return await q.answer( + "Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10 + ) + except PeerIdInvalid: + return await q.answer( + "Silahkan kirim pesan digrup supaya bot bisa merespon.", + show_alert=True, + cache_time=10, + ) + + +@app.on_callback_query(filters.regex(r"^rejectreq")) +@ratelimiter +async def callbackreject(c, q): + try: + user = await c.get_chat_member(-1001201566570, q.from_user.id) + if user.status in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ]: + _, msg_id, chat_id = q.data.split("_") + await c.send_message( + chat_id=chat_id, + text="Mohon maaf, request kamu ditolak karena tidak sesuai rules. Harap baca rules grup no.6 yaa 🙃.", + reply_to_message_id=int(msg_id), + ) + + if q.message.caption: + await q.message.edit_text( + f"REJECTED\n\n{q.message.caption}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🚫 Request Rejected", callback_data="reqreject" + ) + ] + ] + ), + ) + else: + await q.message.edit_text( + f"REJECTED\n\n{q.message.text}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🚫 Request Rejected", callback_data="reqreject" + ) + ] + ] + ), + ) + await q.answer("Request berhasil ditolak 🚫") + else: + await q.answer("Apa motivasi kamu menekan tombol ini?", show_alert=True) + except UserNotParticipant: + await q.answer( + "Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10 + ) + except PeerIdInvalid: + return await q.answer( + "Silahkan kirim pesan digrup supaya bot bisa merespon.", + show_alert=True, + cache_time=10, + ) + + +@app.on_callback_query(filters.regex(r"^unavailablereq")) +@ratelimiter +async def callbackunav(c, q): + try: + user = await c.get_chat_member(-1001201566570, q.from_user.id) + if user.status in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ]: + _, msg_id, chat_id = q.data.split("_") + await c.send_message( + chat_id=chat_id, + text="Mohon maaf, request kamu tidak tersedia. Silahkan baca beberapa alasannya di channel @YMovieZ_New", + reply_to_message_id=int(msg_id), + ) + + if q.message.caption: + await q.message.edit_text( + f"UNAVAILABLE\n\n{q.message.caption}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⚠️ Request Unavailable", + callback_data="requnav", + ) + ] + ] + ), + ) + else: + await q.message.edit_text( + f"UNAVAILABLE\n\n{q.message.text}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⚠️ Request Unavailable", + callback_data="requnav", + ) + ] + ] + ), + ) + await q.answer( + "Request tidak tersedia, mungkin belum rilis atau memang tidak tersedia versi digital." + ) + else: + await q.answer( + "Apa motivasi kamu menekan tombol ini?", + show_alert=True, + cache_time=1000, + ) + except UserNotParticipant: + await q.answer( + "Apa motivasi kamu menekan tombol ini?", show_alert=True, cache_time=10 + ) + except PeerIdInvalid: + return await q.answer( + "Silahkan kirim pesan digrup supaya bot bisa merespon.", + show_alert=True, + cache_time=10, + ) + + +@app.on_callback_query(filters.regex(r"^reqcompl$")) +@ratelimiter +async def callbackaft_done(_, q): + await q.answer( + "Request ini sudah terselesaikan 🥳, silahkan cek di channel atau grup yaa..", + show_alert=True, + cache_time=1000, + ) + + +@app.on_callback_query(filters.regex(r"^reqreject$")) +@ratelimiter +async def callbackaft_rej(_, q): + await q.answer( + "Request ini ditolak 💔, silahkan cek rules grup yaa.", + show_alert=True, + cache_time=1000, + ) + + +@app.on_callback_query(filters.regex(r"^requnav$")) +@ratelimiter +async def callbackaft_unav(_, q): + await q.answer( + "Request ini tidak tersedia ☹️, mungkin filmnya belum rilis atau memang tidak tersedia versi digital.", + show_alert=True, + cache_time=1000, + ) + + +@app.on_callback_query(filters.regex(r"^reqavailable$")) +@ratelimiter +async def callbackaft_dahada(_, q): + await q.answer( + "Request ini sudah ada, silahkan cari 🔍 di channelnya yaa 😉..", show_alert=True + ) + + +scheduler = AsyncIOScheduler(timezone="Asia/Jakarta") +scheduler.add_job(clear_reqdict, trigger="cron", hour=2, minute=0) +scheduler.start() diff --git a/misskaty/plugins/filters.py b/misskaty/plugins/filters.py new file mode 100644 index 00000000..f5965cb7 --- /dev/null +++ b/misskaty/plugins/filters.py @@ -0,0 +1,154 @@ +""" +MIT License + +Copyright (c) 2021 TheHamkerCat + +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 re + +from pyrogram import filters + +from database.filters_db import ( + delete_filter, + get_filter, + get_filters_names, + save_filter, +) +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import adminsOnly +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.keyboard import ikb +from misskaty.helper.functions import extract_text_and_keyb + +__MODULE__ = "Filters" +__HELP__ = """/filters To Get All The Filters In The Chat. +/addfilter [FILTER_NAME] : To Save A Filter (Can be a sticker or text). +/stopfilter [FILTER_NAME] : To Stop A Filter. + +You can use markdown or html to save text too. +""" + + +@app.on_message(filters.command(["addfilter", "filter"]) & ~filters.private) +@adminsOnly("can_change_info") +@ratelimiter +async def save_filters(_, m): + if len(m.command) == 1 or not m.reply_to_message: + return await m.reply_msg( + "**Usage:**\nReply to a text or sticker with /addfilter [FILTER_NAME] to save it.", + del_in=6, + ) + if not m.reply_to_message.text and not m.reply_to_message.sticker: + return await m.reply_msg( + "__**You can only save text or stickers in filters for now.**__" + ) + name = m.text.split(None, 1)[1].strip() + if not name: + return await m.reply_msg("**Usage:**\n__/addfilter [FILTER_NAME]__", del_in=6) + chat_id = m.chat.id + _type = "text" if m.reply_to_message.text else "sticker" + _filter = { + "type": _type, + "data": m.reply_to_message.text.markdown + if _type == "text" + else m.reply_to_message.sticker.file_id, + } + await save_filter(chat_id, name, _filter) + await m.reply_msg(f"__**Saved filter {name}.**__") + + +@app.on_message(filters.command("filters") & ~filters.private) +@capture_err +@ratelimiter +async def get_filterss(_, m): + _filters = await get_filters_names(m.chat.id) + if not _filters: + return await m.reply_msg("**No filters in this chat.**") + _filters.sort() + msg = f"List of filters in {m.chat.title} - {m.chat.id}\n" + for _filter in _filters: + msg += f"**-** `{_filter}`\n" + await m.reply_msg(msg) + + +@app.on_message(filters.command(["stop", "stopfilter"]) & ~filters.private) +@adminsOnly("can_change_info") +@ratelimiter +async def del_filter(_, m): + if len(m.command) < 2: + return await m.reply_msg("**Usage:**\n__/stopfilter [FILTER_NAME]__", del_in=6) + name = m.text.split(None, 1)[1].strip() + if not name: + return await m.reply_msg("**Usage:**\n__/stopfilter [FILTER_NAME]__", del_in=6) + chat_id = m.chat.id + deleted = await delete_filter(chat_id, name) + if deleted: + await m.reply_msg(f"**Deleted filter {name}.**") + else: + await m.reply_msg("**No such filter.**") + + +@app.on_message( + filters.text & ~filters.private & ~filters.via_bot & ~filters.forwarded, + group=2, +) +async def filters_re(_, message): + text = message.text.lower().strip() + if not text: + return + chat_id = message.chat.id + list_of_filters = await get_filters_names(chat_id) + for word in list_of_filters: + pattern = r"( |^|[^\w])" + re.escape(word) + r"( |$|[^\w])" + if re.search(pattern, text, flags=re.IGNORECASE): + _filter = await get_filter(chat_id, word) + data_type = _filter["type"] + data = _filter["data"] + if data_type == "text": + keyb = None + if re.findall(r"\[.+\,.+\]", data): + if keyboard := extract_text_and_keyb(ikb, data): + data, keyb = keyboard + + if message.reply_to_message: + await message.reply_to_message.reply( + data, + reply_markup=keyb, + disable_web_page_preview=True, + ) + + if text.startswith("~"): + await message.delete() + return + + return await message.reply( + data, + reply_markup=keyb, + quote=True, + disable_web_page_preview=True, + ) + if message.reply_to_message: + await message.reply_to_message.reply_sticker(data) + + if text.startswith("~"): + await message.delete() + return + await message.reply_sticker(data, quote=True) diff --git a/misskaty/plugins/fun.py b/misskaty/plugins/fun.py new file mode 100644 index 00000000..c33dd249 --- /dev/null +++ b/misskaty/plugins/fun.py @@ -0,0 +1,186 @@ +import textwrap +from asyncio import gather +from os import remove as hapus + +from PIL import Image, ImageDraw, ImageFont +from pyrogram import filters + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER + + +async def draw_meme_text(image_path, text): + img = Image.open(image_path) + hapus(image_path) + i_width, i_height = img.size + m_font = ImageFont.truetype( + "assets/MutantAcademyStyle.ttf", int((70 / 640) * i_width) + ) + if ";" in text: + upper_text, lower_text = text.split(";") + else: + upper_text = text + lower_text = "" + draw = ImageDraw.Draw(img) + current_h, pad = 10, 5 + if upper_text: + for u_text in textwrap.wrap(upper_text, width=15): + text_bbox = m_font.getbbox(u_text) + (left, top, right, bottom) = text_bbox + u_width = abs(right - left) + u_height = abs(top - bottom) + + draw.text( + xy=(((i_width - u_width) / 2) - 1, int((current_h / 640) * i_width)), + text=u_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=(((i_width - u_width) / 2) + 1, int((current_h / 640) * i_width)), + text=u_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=((i_width - u_width) / 2, int(((current_h / 640) * i_width)) - 1), + text=u_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=(((i_width - u_width) / 2), int(((current_h / 640) * i_width)) + 1), + text=u_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + + draw.text( + xy=((i_width - u_width) / 2, int((current_h / 640) * i_width)), + text=u_text, + font=m_font, + fill=(255, 255, 255), + ) + current_h += u_height + pad + if lower_text: + for l_text in textwrap.wrap(lower_text, width=15): + text_bbox = m_font.getbbox(l_text) + (left, top, right, bottom) = text_bbox + u_width = abs(right - left) + u_height = abs(top - bottom) + + draw.text( + xy=( + ((i_width - u_width) / 2) - 1, + i_height - u_height - int((20 / 500) * i_width), + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=( + ((i_width - u_width) / 2) + 1, + i_height - u_height - int((20 / 500) * i_width), + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=( + (i_width - u_width) / 2, + (i_height - u_height - int((20 / 500) * i_width)) - 1, + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + draw.text( + xy=( + (i_width - u_width) / 2, + (i_height - u_height - int((20 / 500) * i_width)) + 1, + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + stroke_width=3, + stroke_fill="black", + ) + + draw.text( + xy=( + (i_width - u_width) / 2, + i_height - u_height - int((20 / 500) * i_width), + ), + text=l_text, + font=m_font, + fill=(255, 255, 255), + stroke_width=3, + stroke_fill="black", + ) + current_h += u_height + pad + + webp_file = "misskatyfy.webp" + png_file = "misskatyfy.png" + new_size = (512, 512) + img.resize(new_size) + img.save(webp_file, "WebP") + img.save(png_file, "PNG") + img.close() + return webp_file, png_file + + +@app.on_message(filters.command(["mmf"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def memify(_, message): + if message.reply_to_message and ( + message.reply_to_message.sticker or message.reply_to_message.photo + ): + try: + file = await message.reply_to_message.download() + webp, png = await draw_meme_text( + file, message.text.split(None, 1)[1].strip() + ) + await gather(*[message.reply_document(png), message.reply_sticker(webp)]) + try: + hapus(webp) + hapus(png) + except: + pass + except Exception as err: + try: + hapus(webp) + hapus(png) + except: + pass + await message.reply_msg(f"ERROR: {err}") + else: + await message.reply_msg( + "Gunakan command /mmf dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah." + ) + + +@app.on_message(filters.command(["dice"], COMMAND_HANDLER)) +@use_chat_lang() +async def dice(c, m, strings): + dices = await c.send_dice(m.chat.id, reply_to_message_id=m.id) + await dices.reply_msg(strings("result").format(number=dices.dice.value), quote=True) diff --git a/misskaty/plugins/genss.py b/misskaty/plugins/genss.py new file mode 100644 index 00000000..3a153d44 --- /dev/null +++ b/misskaty/plugins/genss.py @@ -0,0 +1,206 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import math +import os +import time +from asyncio import gather, sleep +from datetime import datetime +from logging import getLogger +from urllib.parse import unquote + +from pyrogram import Client, enums +from pyrogram.errors import FloodWait +from pyrogram.file_id import FileId +from pyrogram.types import Message +from pySmartDL import SmartDL + +from misskaty import app +from misskaty.core.decorator import new_task, ratelimiter +from misskaty.helper import is_url, progress_for_pyrogram, take_ss +from misskaty.helper.localization import use_chat_lang +from misskaty.helper.pyro_progress import humanbytes + +LOGGER = getLogger(__name__) + +__MODULE__ = "MediaTool" +__HELP__ = """" +/genss [reply to video] - Generate Screenshot From Video. (Support TG Media and Direct URL) +/mediainfo [link/reply to TG Video] - Get Mediainfo From File. +""" + + +@app.on_cmd("genss") +@ratelimiter +@new_task +@use_chat_lang() +async def genss(self: Client, ctx: Message, strings): + if not ctx.from_user: + return + replied = ctx.reply_to_message + if len(ctx.command) == 2 and is_url(ctx.command[1]): + pesan = await ctx.reply_msg(strings("wait_dl"), quote=True) + start_t = datetime.now() + the_url_parts = " ".join(ctx.command[1:]) + url = the_url_parts.strip() + file_name = os.path.basename(url) + download_file_path = os.path.join("downloads/", file_name) + downloader = SmartDL(url, download_file_path, progress_bar=False, timeout=10) + try: + downloader.start(blocking=False) + except Exception as err: + return await pesan.edit(str(err)) + c_time = time.time() + while not downloader.isFinished(): + total_length = downloader.filesize or None + downloaded = downloader.get_dl_size(human=True) + display_message = "" + now = time.time() + diff = now - c_time + percentage = downloader.get_progress() * 100 + speed = downloader.get_speed(human=True) + progress_str = "[{0}{1}]\nProgress: {2}%".format( + "".join(["●" for _ in range(math.floor(percentage / 5))]), + "".join(["○" for _ in range(20 - math.floor(percentage / 5))]), + round(percentage, 2), + ) + + estimated_total_time = downloader.get_eta(human=True) + try: + current_message = "Trying to download...\n" + current_message += f"URL: {url}\n" + current_message += f"File Name: {unquote(file_name)}\n" + current_message += f"Speed: {speed}\n" + current_message += f"{progress_str}\n" + current_message += f"{downloaded} of {humanbytes(total_length)}\n" + current_message += f"ETA: {estimated_total_time}" + if round(diff % 10.00) == 0 and current_message != display_message: + await pesan.edit( + disable_web_page_preview=True, text=current_message + ) + display_message = current_message + await sleep(10) + except Exception as e: + LOGGER.info(str(e)) + if os.path.exists(download_file_path): + end_t = datetime.now() + ms = (end_t - start_t).seconds + await pesan.edit( + f"Downloaded to {download_file_path} in {ms} seconds" + ) + try: + images = await take_ss(download_file_path) + await pesan.edit_msg(strings("up_progress")) + await self.send_chat_action( + chat_id=ctx.chat.id, action=enums.ChatAction.UPLOAD_PHOTO + ) + try: + await gather( + *[ + ctx.reply_document(images, reply_to_message_id=ctx.id), + ctx.reply_photo(images, reply_to_message_id=ctx.id), + ] + ) + except FloodWait as e: + await sleep(e.value) + await gather( + *[ + ctx.reply_document(images, reply_to_message_id=ctx.id), + ctx.reply_photo(images, reply_to_message_id=ctx.id), + ] + ) + await ctx.reply_msg( + strings("up_msg").format( + namma=ctx.from_user.mention, + id=ctx.from_user.id, + bot_uname=self.me.username, + ), + reply_to_message_id=ctx.id, + ) + await pesan.delete() + try: + os.remove(images) + os.remove(download_file_path) + except: + pass + except Exception as exc: + await ctx.reply_msg(strings("err_ssgen").format(exc=exc)) + try: + os.remove(images) + os.remove(download_file_path) + except: + pass + elif replied and replied.media: + vid = [replied.video, replied.document] + media = next((v for v in vid if v is not None), None) + if media is None: + return await ctx.reply_msg(strings("no_reply"), quote=True) + process = await ctx.reply_msg(strings("wait_dl"), quote=True) + if media.file_size > 2097152000: + return await process.edit_msg(strings("limit_dl")) + c_time = time.time() + dc_id = FileId.decode(media.file_id).dc_id + try: + dl = await replied.download( + file_name="/downloads/", + progress=progress_for_pyrogram, + progress_args=(strings("dl_progress"), process, c_time, dc_id), + ) + except FileNotFoundError: + return await process.edit_msg( + "ERROR: FileNotFound, maybe you're spam bot with same file." + ) + the_real_download_location = os.path.join("/downloads/", os.path.basename(dl)) + if the_real_download_location is not None: + try: + await process.edit_msg( + strings("success_dl_msg").format(path=the_real_download_location) + ) + await sleep(2) + images = await take_ss(the_real_download_location) + await process.edit_msg(strings("up_progress")) + await self.send_chat_action( + chat_id=ctx.chat.id, action=enums.ChatAction.UPLOAD_PHOTO + ) + + try: + await gather( + *[ + ctx.reply_document(images, reply_to_message_id=ctx.id), + ctx.reply_photo(images, reply_to_message_id=ctx.id), + ] + ) + except FloodWait as e: + await sleep(e.value) + await gather( + *[ + ctx.reply_document(images, reply_to_message_id=ctx.id), + ctx.reply_photo(images, reply_to_message_id=ctx.id), + ] + ) + await ctx.reply_msg( + strings("up_msg").format( + namma=ctx.from_user.mention, + id=ctx.from_user.id, + bot_uname=self.me.username, + ), + reply_to_message_id=ctx.id, + ) + await process.delete() + try: + os.remove(images) + os.remove(the_real_download_location) + except: + pass + except Exception as exc: + await ctx.reply_msg(strings("err_ssgen").format(exc=exc)) + try: + os.remove(images) + os.remove(the_real_download_location) + except: + pass + else: + await ctx.reply_msg(strings("no_reply"), del_in=6) diff --git a/misskaty/plugins/grup_tools.py b/misskaty/plugins/grup_tools.py new file mode 100644 index 00000000..993e7512 --- /dev/null +++ b/misskaty/plugins/grup_tools.py @@ -0,0 +1,340 @@ +import os +import textwrap +import time +from datetime import datetime, timedelta +from logging import getLogger + +from PIL import Image, ImageChops, ImageDraw, ImageFont +from pyrogram import enums, filters +from pyrogram.errors import ChatAdminRequired, MessageTooLong, RPCError +from pyrogram.types import ChatMemberUpdated, InlineKeyboardButton, InlineKeyboardMarkup + +from database.users_chats_db import db +from misskaty import BOT_USERNAME, app +from misskaty.core.decorator import asyncify, capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, SUDO, SUPPORT_CHAT +from utils import temp + +LOGGER = getLogger(__name__) + + +def circle(pfp, size=(215, 215)): + pfp = pfp.resize(size, Image.LANCZOS).convert("RGBA") + bigsize = (pfp.size[0] * 3, pfp.size[1] * 3) + mask = Image.new("L", bigsize, 0) + draw = ImageDraw.Draw(mask) + draw.ellipse((0, 0) + bigsize, fill=255) + mask = mask.resize(pfp.size, Image.LANCZOS) + mask = ImageChops.darker(mask, pfp.split()[-1]) + pfp.putalpha(mask) + return pfp + + +def draw_multiple_line_text(image, text, font, text_start_height): + """ + From unutbu on [python PIL draw multiline text on image](https://stackoverflow.com/a/7698300/395857) + """ + draw = ImageDraw.Draw(image) + image_width, _ = image.size + y_text = text_start_height + lines = textwrap.wrap(text, width=50) + for line in lines: + text_bbox = font.getbbox(line) + (left, top, right, bottom) = text_bbox + line_width = abs(right - left) + line_height = abs(top - bottom) + draw.text( + ((image_width - line_width) / 2, y_text), line, font=font, fill="black" + ) + y_text += line_height + + +@asyncify +def welcomepic(pic, user, chat, id, strings): + background = Image.open("assets/bg.png") # <- Background Image (Should be PNG) + background = background.resize((1024, 500), Image.LANCZOS) + pfp = Image.open(pic).convert("RGBA") + pfp = circle(pfp) + pfp = pfp.resize( + (265, 265) + ) # Resizes the Profilepicture so it fits perfectly in the circle + font = ImageFont.truetype( + "assets/Calistoga-Regular.ttf", 37 + ) # <- Text Font of the Member Count. Change the text size for your preference + member_text = strings("welcpic_msg").format( + userr=user, id=id + ) # <- Text under the Profilepicture with the Membercount + draw_multiple_line_text(background, member_text, font, 395) + draw_multiple_line_text(background, chat, font, 47) + ImageDraw.Draw(background).text( + (530, 460), + f"Generated by @{BOT_USERNAME}", + font=ImageFont.truetype("assets/Calistoga-Regular.ttf", 28), + size=20, + align="right", + ) + background.paste( + pfp, (379, 123), pfp + ) # Pastes the Profilepicture on the Background Image + background.save( + f"downloads/welcome#{id}.png" + ) # Saves the finished Image in the folder with the filename + return f"downloads/welcome#{id}.png" + + +@app.on_chat_member_updated( + filters.group & filters.chat([-1001128045651, -1001777794636]) +) +@use_chat_lang() +async def member_has_joined(c: app, member: ChatMemberUpdated, strings): + if ( + not member.new_chat_member + or member.new_chat_member.status in {"banned", "left", "restricted"} + or member.old_chat_member + ): + return + user = member.new_chat_member.user if member.new_chat_member else member.from_user + if user.id in SUDO: + await c.send_message( + member.chat.id, + strings("sudo_join_msg"), + ) + return + elif user.is_bot: + return # ignore bots + else: + if (temp.MELCOW).get(f"welcome-{member.chat.id}") is not None: + try: + await temp.MELCOW[f"welcome-{member.chat.id}"].delete() + except: + pass + mention = f"{user.first_name}" + joined_date = datetime.fromtimestamp(time.time()).strftime("%Y.%m.%d %H:%M:%S") + first_name = ( + f"{user.first_name} {user.last_name}" if user.last_name else user.first_name + ) + id = user.id + dc = user.dc_id or "Member tanpa PP" + try: + pic = await app.download_media( + user.photo.big_file_id, file_name=f"pp{user.id}.png" + ) + except AttributeError: + pic = "assets/profilepic.png" + try: + welcomeimg = await welcomepic( + pic, user.first_name, member.chat.title, user.id, strings + ) + temp.MELCOW[f"welcome-{member.chat.id}"] = await c.send_photo( + member.chat.id, + photo=welcomeimg, + caption=f"Hai {mention}, Selamat datang digrup {member.chat.title} harap baca rules di pinned message terlebih dahulu.\n\nNama : {first_name}\nID : {id}\nDC ID : {dc}\nTanggal Join : {joined_date}", + ) + except Exception as e: + LOGGER.info(e) + userspammer = "" + # Combot API Detection + try: + apicombot = ( + await http.get(f"https://api.cas.chat/check?user_id={user.id}") + ).json() + if apicombot.get("ok") == "true": + await app.ban_chat_member( + member.chat.id, user.id, datetime.now() + timedelta(seconds=30) + ) + userspammer += strings("combot_msg").format( + umention=user.mention, uid=user.id + ) + except Exception as err: + LOGGER.error(f"ERROR in Combot API Detection. {err}") + if userspammer != "": + await c.send_message(member.chat.id, userspammer) + try: + os.remove(f"downloads/welcome#{user.id}.png") + os.remove(f"downloads/pp{user.id}.png") + except Exception: + pass + + +@app.on_message(filters.new_chat_members & filters.group, group=4) +@use_chat_lang() +async def greet_group(bot, message, strings): + for u in message.new_chat_members: + try: + pic = await app.download_media( + u.photo.big_file_id, file_name=f"pp{u.id}.png" + ) + except AttributeError: + pic = "assets/profilepic.png" + if (temp.MELCOW).get(f"welcome-{message.chat.id}") is not None: + try: + await temp.MELCOW[f"welcome-{message.chat.id}"].delete() + except: + pass + try: + welcomeimg = await welcomepic( + pic, u.first_name, message.chat.title, u.id, strings + ) + temp.MELCOW[f"welcome-{message.chat.id}"] = await app.send_photo( + message.chat.id, + photo=welcomeimg, + caption=strings("capt_welc").format( + umention=u.mention, uid=u.id, ttl=message.chat.title + ), + ) + userspammer = "" + # Combot API Detection + try: + apicombot = ( + await http.get(f"https://api.cas.chat/check?user_id={u.id}") + ).json() + if apicombot.get("ok") == "true": + await app.ban_chat_member( + message.chat.id, u.id, datetime.now() + timedelta(seconds=30) + ) + userspammer += strings("combot_msg").format( + umention=u.mention, uid=u.id + ) + except Exception as err: + LOGGER.error(f"ERROR in Combot API Detection. {err}") + if userspammer != "": + await bot.send_message(message.chat.id, userspammer) + except Exception as e: + LOGGER.info(e) + try: + os.remove(f"downloads/welcome#{u.id}.png") + os.remove(f"downloads/pp{u.id}.png") + except Exception: + pass + + +@app.on_message(filters.command("leave") & filters.user(SUDO)) +async def leave_a_chat(bot, message): + if len(message.command) == 1: + return await message.reply("Give me a chat id") + chat = message.command[1] + try: + chat = int(chat) + except: + pass + try: + buttons = [ + [InlineKeyboardButton("Support", url=f"https://t.me/{SUPPORT_CHAT}")] + ] + reply_markup = InlineKeyboardMarkup(buttons) + await bot.send_message( + chat_id=chat, + text="Hai kawan, \nOwner aku bilang saya harus pergi! Jika kamu ingin menambahkan bot ini lagi silahkan kontak owner bot ini.", + reply_markup=reply_markup, + ) + await bot.leave_chat(chat) + except Exception as e: + await message.reply(f"Error - {e}") + await bot.leave_chat(chat) + + +# Not to be used +# @app.on_message(filters.command('invite') & filters.user(SUDO)) +async def gen_invite(bot, message): + if len(message.command) == 1: + return await message.reply("Give me a chat id") + chat = message.command[1] + try: + chat = int(chat) + except: + return await message.reply("Give Me A Valid Chat ID") + try: + link = await bot.create_chat_invite_link(chat) + except ChatAdminRequired: + return await message.reply( + "Invite Link Generation Failed, Iam Not Having Sufficient Rights" + ) + except Exception as e: + return await message.reply(f"Error {e}") + await message.reply(f"Here is your Invite Link {link.invite_link}") + + +@app.on_message(filters.command(["adminlist"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def adminlist(_, message): + if message.chat.type == enums.ChatType.PRIVATE: + return await message.reply("Perintah ini hanya untuk grup") + try: + msg = await message.reply_msg(f"Getting admin list in {message.chat.title}..") + administrators = [] + async for m in app.get_chat_members( + message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS + ): + uname = f"@{m.user.username}" if m.user.username else "" + administrators.append(f"{m.user.first_name} [{uname}]") + + res = "".join(f"💠 {i}\n" for i in administrators) + return await msg.edit_msg( + f"Admin in {message.chat.title} ({message.chat.id}):\n{res}" + ) + except Exception as e: + await message.reply(f"ERROR: {str(e)}") + + +@app.on_message(filters.command(["kickme"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def kickme(_, message): + reason = None + if len(message.text.split()) >= 2: + reason = message.text.split(None, 1)[1] + try: + await message.chat.ban_member(message.from_user.id) + txt = f"Pengguna {message.from_user.mention} menendang dirinya sendiri. Mungkin dia sedang frustasi 😕" + txt += f"\nAlasan: {reason}" if reason else "-" + await message.reply_text(txt) + await message.chat.unban_member(message.from_user.id) + except RPCError as ef: + await message.reply_text( + f"Sepertinya ada error, silahkan report ke owner saya. \nERROR: {str(ef)}" + ) + except Exception as err: + await message.reply(f"ERROR: {err}") + + +@app.on_message(filters.command("users") & filters.user(SUDO)) +async def list_users(_, message): + # https://t.me/GetTGLink/4184 + msg = await message.reply("Getting List Of Users") + users = await db.get_all_users() + out = "Users Saved In DB Are:\n\n" + async for user in users: + out += f"User ID: {user.get('id')} -> {user.get('name')}" + if user["ban_status"]["is_banned"]: + out += "( Banned User )" + out += "\n" + try: + await msg.edit_text(out) + except MessageTooLong: + with open("users.txt", "w+") as outfile: + outfile.write(out) + await message.reply_document("users.txt", caption="List Of Users") + await msg.delete_msg() + + +@app.on_message(filters.command("chats") & filters.user(SUDO)) +async def list_chats(_, message): + msg = await message.reply("Getting List Of chats") + chats = await db.get_all_chats() + out = "Chats Saved In DB Are:\n\n" + async for chat in chats: + out += f"Title: {chat.get('title')} ({chat.get('id')}) " + if chat["chat_status"]["is_disabled"]: + out += "( Disabled Chat )" + out += "\n" + try: + await msg.edit_text(out) + except MessageTooLong: + with open("chats.txt", "w+") as outfile: + outfile.write(out) + await message.reply_document("chats.txt", caption="List Of Chats") + await msg.delete_msg() diff --git a/misskaty/plugins/imdb_search.py b/misskaty/plugins/imdb_search.py new file mode 100644 index 00000000..fff50cd3 --- /dev/null +++ b/misskaty/plugins/imdb_search.py @@ -0,0 +1,723 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import json +import logging +import re +from urllib.parse import quote_plus + +from bs4 import BeautifulSoup +from deep_translator import GoogleTranslator +from pykeyboard import InlineButton, InlineKeyboard +from pyrogram import Client, enums +from pyrogram.errors import ( + MediaCaptionTooLong, + MediaEmpty, + MessageIdInvalid, + MessageNotModified, + PhotoInvalidDimensions, + WebpageCurlFailed, + WebpageMediaEmpty, +) +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + InputMediaPhoto, + Message, +) + +from database.imdb_db import add_imdbset, is_imdbset, remove_imdbset +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.misskaty_patch.listen.listen import ListenerTimeout +from misskaty.helper import GENRES_EMOJI, Cache, get_random_string, http, search_jw +from utils import demoji + +LOGGER = logging.getLogger(__name__) +LIST_CARI = Cache(filename="imdb_cache.db", path="cache", in_memory=False) +headers = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10" +} + + +# IMDB Choose Language +@app.on_cmd("imdb") +@ratelimiter +async def imdb_choose(_, ctx: Message): + if len(ctx.command) == 1: + return await ctx.reply_msg( + f"ℹ️ Please add query after CMD!\nEx: /{ctx.command[0]} Jurassic World", + del_in=7, + ) + if ctx.sender_chat: + return await ctx.reply_msg( + "Cannot identify user, please use in private chat.", del_in=7 + ) + kuery = ctx.text.split(" ", 1)[1] + is_imdb, lang = await is_imdbset(ctx.from_user.id) + if is_imdb: + if lang == "eng": + return await imdb_search_en(kuery, ctx) + else: + return await imdb_search_id(kuery, ctx) + buttons = InlineKeyboard() + ranval = get_random_string(4) + LIST_CARI.add(ranval, kuery, timeout=180) + buttons.row( + InlineButton("🇺🇸 English", f"imdbcari#eng#{ranval}#{ctx.from_user.id}"), + InlineButton("🇮🇩 Indonesia", f"imdbcari#ind#{ranval}#{ctx.from_user.id}"), + ) + buttons.row(InlineButton("🚩 Set Default Language", f"imdbset#{ctx.from_user.id}")) + buttons.row(InlineButton("❌ Close", f"close#{ctx.from_user.id}")) + msg = await ctx.reply_photo( + "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg", + caption=f"Hi {ctx.from_user.mention}, Please select the language you want to use on IMDB Search. If you want use default lang for every user, click third button. So no need click select lang if use CMD.", + reply_markup=buttons, + quote=True, + ) + try: + await msg.wait_for_click(from_user_id=ctx.from_user.id, timeout=30) + except ListenerTimeout: + del LIST_CARI[ranval] + try: + await msg.edit_caption( + "😶‍🌫️ Callback Query Timeout. Task Has Been Canceled!" + ) + except MessageIdInvalid: + pass + + +@app.on_cb("imdbset") +@ratelimiter +async def imdblangset(_, query: CallbackQuery): + _, uid = query.data.split("#") + if query.from_user.id != int(uid): + return await query.answer("⚠️ Access Denied!", True) + buttons = InlineKeyboard() + buttons.row( + InlineButton("🇺🇸 English", f"setimdb#eng#{query.from_user.id}"), + InlineButton("🇮🇩 Indonesia", f"setimdb#ind#{query.from_user.id}"), + ) + is_imdb, _ = await is_imdbset(query.from_user.id) + if is_imdb: + buttons.row( + InlineButton("🗑 Remove UserSetting", f"setimdb#rm#{query.from_user.id}") + ) + buttons.row(InlineButton("❌ Close", f"close#{query.from_user.id}")) + msg = await query.message.edit_caption( + "Please select available language below..", reply_markup=buttons + ) + try: + await msg.wait_for_click(from_user_id=int(uid), timeout=30) + except ListenerTimeout: + try: + await msg.edit_caption( + "😶‍🌫️ Callback Query Timeout. Task Has Been Canceled!" + ) + except MessageIdInvalid: + pass + + +@app.on_cb("setimdb") +@ratelimiter +async def imdbsetlang(_, query: CallbackQuery): + _, lang, uid = query.data.split("#") + if query.from_user.id != int(uid): + return await query.answer("⚠️ Access Denied!", True) + _, langset = await is_imdbset(query.from_user.id) + if langset == lang: + return await query.answer(f"⚠️ Your Setting Already in ({langset})!", True) + if lang == "eng": + await add_imdbset(query.from_user.id, lang) + await query.message.edit_caption( + "Language interface for IMDB has been changed to English." + ) + elif lang == "ind": + await add_imdbset(query.from_user.id, lang) + await query.message.edit_caption( + "Bahasa tampilan IMDB sudah diubah ke Indonesia." + ) + else: + await remove_imdbset(query.from_user.id) + await query.message.edit_caption( + "UserSetting for IMDB has been deleted from database." + ) + + +async def imdb_search_id(kueri, message): + BTN = [] + k = await message.reply_photo( + "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg", + caption=f"🔎 Menelusuri {kueri} di database IMDb ...", + quote=True, + ) + msg = "" + buttons = InlineKeyboard(row_width=4) + try: + r = await http.get( + f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json", + headers=headers, + ) + res = r.json().get("d") + if not res: + return await k.edit_caption( + f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}" + ) + msg += f"🎬 Ditemukan ({len(res)}) hasil untuk kueri: {kueri}\n\n" + for num, movie in enumerate(res, start=1): + title = movie.get("l") + if year := movie.get("yr"): + year = f"({year})" + elif year := movie.get("y"): + year = f"({year})" + else: + year = "(N/A)" + typee = movie.get("q", "N/A").replace("feature", "movie").title() + movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] + msg += f"{num}. {title} {year} - {typee}\n" + BTN.append( + InlineKeyboardButton( + text=num, + callback_data=f"imdbres_id#{message.from_user.id}#{movieID}", + ) + ) + BTN.extend( + ( + InlineKeyboardButton( + text="🚩 Language", + callback_data=f"imdbset#{message.from_user.id}", + ), + InlineKeyboardButton( + text="❌ Close", + callback_data=f"close#{message.from_user.id}", + ), + ) + ) + buttons.add(*BTN) + msg = await k.edit_caption(msg, reply_markup=buttons) + try: + await msg.wait_for_click(from_user_id=message.from_user.id, timeout=30) + except ListenerTimeout: + try: + await msg.edit_caption("😶‍🌫️ Waktu Habis. Task Telah Dibatalkan!") + except MessageIdInvalid: + pass + except Exception as err: + await k.edit_caption( + f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}" + ) + + +async def imdb_search_en(kueri, message): + BTN = [] + k = await message.reply_photo( + "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg", + caption=f"🔎 Searching {kueri} in IMDb Database...", + quote=True, + ) + msg = "" + buttons = InlineKeyboard(row_width=4) + try: + r = await http.get( + f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json", + headers=headers, + ) + res = r.json().get("d") + if not res: + return await k.edit_caption( + f"⛔️ Result not found for keywords: {kueri}" + ) + msg += f"🎬 Found ({len(res)}) result for keywords: {kueri}\n\n" + for num, movie in enumerate(res, start=1): + title = movie.get("l") + if year := movie.get("yr"): + year = f"({year})" + elif year := movie.get("y"): + year = f"({year})" + else: + year = "(N/A)" + typee = movie.get("q", "N/A").replace("feature", "movie").title() + movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] + msg += f"{num}. {title} {year} - {typee}\n" + BTN.append( + InlineKeyboardButton( + text=num, + callback_data=f"imdbres_en#{message.from_user.id}#{movieID}", + ) + ) + BTN.extend( + ( + InlineKeyboardButton( + text="🚩 Language", + callback_data=f"imdbset#{message.from_user.id}", + ), + InlineKeyboardButton( + text="❌ Close", + callback_data=f"close#{message.from_user.id}", + ), + ) + ) + buttons.add(*BTN) + msg = await k.edit_caption(msg, reply_markup=buttons) + try: + await msg.wait_for_click(from_user_id=message.from_user.id, timeout=30) + except ListenerTimeout: + try: + await msg.edit_caption("😶‍🌫️ Timeout. Task Has Been Cancelled!") + except MessageIdInvalid: + pass + except Exception as err: + await k.edit_caption( + f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}" + ) + + +@app.on_cb("imdbcari") +@ratelimiter +async def imdbcari(_, query: CallbackQuery): + BTN = [] + _, lang, msg, uid = query.data.split("#") + if lang == "ind": + if query.from_user.id != int(uid): + return await query.answer("⚠️ Akses Ditolak!", True) + try: + kueri = LIST_CARI.get(msg) + del LIST_CARI[msg] + except KeyError: + return await query.message.edit_caption("⚠️ Callback Query Sudah Expired!") + await query.message.edit_caption("🔎 Sedang mencari di Database IMDB..") + msg = "" + buttons = InlineKeyboard(row_width=4) + try: + r = await http.get( + f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json", + headers=headers, + ) + res = r.json().get("d") + if not res: + return await query.message.edit_caption( + f"⛔️ Tidak ditemukan hasil untuk kueri: {kueri}" + ) + msg += f"🎬 Ditemukan ({len(res)}) hasil dari: {kueri} ~ {query.from_user.mention}\n\n" + for num, movie in enumerate(res, start=1): + title = movie.get("l") + if year := movie.get("yr"): + year = f"({year})" + elif year := movie.get("y"): + year = f"({year})" + else: + year = "(N/A)" + typee = movie.get("q", "N/A").replace("feature", "movie").title() + movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] + msg += f"{num}. {title} {year} - {typee}\n" + BTN.append( + InlineKeyboardButton( + text=num, callback_data=f"imdbres_id#{uid}#{movieID}" + ) + ) + BTN.extend( + ( + InlineKeyboardButton( + text="🚩 Language", callback_data=f"imdbset#{uid}" + ), + InlineKeyboardButton(text="❌ Close", callback_data=f"close#{uid}"), + ) + ) + buttons.add(*BTN) + try: + msg = await query.message.edit_caption(msg, reply_markup=buttons) + await msg.wait_for_click(from_user_id=int(uid), timeout=30) + except ListenerTimeout: + try: + await msg.edit_caption("😶‍🌫️ Waktu Habis. Task Telah Dibatalkan!") + except MessageIdInvalid: + await msg.reply("😶‍🌫️ Waktu Habis. Task Telah Dibatalkan!") + except MessageIdInvalid: + pass + except Exception as err: + await query.message.edit_caption( + f"Ooppss, gagal mendapatkan daftar judul di IMDb. Mungkin terkena rate limit atau down.\n\nERROR: {err}" + ) + else: + if query.from_user.id != int(uid): + return await query.answer("⚠️ Access Denied!", True) + try: + kueri = LIST_CARI.get(msg) + del LIST_CARI[msg] + except KeyError: + return await query.message.edit_caption("⚠️ Callback Query Expired!") + await query.message.edit_caption("🔎 Looking in the IMDB Database..") + msg = "" + buttons = InlineKeyboard(row_width=4) + try: + r = await http.get( + f"https://v3.sg.media-imdb.com/suggestion/titles/x/{quote_plus(kueri)}.json", + headers=headers, + ) + res = r.json().get("d") + if not res: + return await query.message.edit_caption( + f"⛔️ Result not found for keywords: {kueri}" + ) + msg += f"🎬 Found ({len(res)}) result for keywords: {kueri} ~ {query.from_user.mention}\n\n" + for num, movie in enumerate(res, start=1): + title = movie.get("l") + if year := movie.get("yr"): + year = f"({year})" + elif year := movie.get("y"): + year = f"({year})" + else: + year = "(N/A)" + typee = movie.get("q", "N/A").replace("feature", "movie").title() + movieID = re.findall(r"tt(\d+)", movie.get("id"))[0] + msg += f"{num}. {title} {year} - {typee}\n" + BTN.append( + InlineKeyboardButton( + text=num, callback_data=f"imdbres_en#{uid}#{movieID}" + ) + ) + BTN.extend( + ( + InlineKeyboardButton( + text="🚩 Language", callback_data=f"imdbset#{uid}" + ), + InlineKeyboardButton(text="❌ Close", callback_data=f"close#{uid}"), + ) + ) + buttons.add(*BTN) + try: + msg = await query.message.edit_caption(msg, reply_markup=buttons) + await msg.wait_for_click(from_user_id=int(uid), timeout=30) + except ListenerTimeout: + try: + await msg.edit_caption("😶‍🌫️ Timeout. Task Has Been Cancelled!") + except MessageIdInvalid: + await msg.reply("😶‍🌫️ Timeout. Task Has Been Cancelled!") + except MessageIdInvalid: + pass + except Exception as err: + await query.message.edit_caption( + f"Failed when requesting movies title. Maybe got rate limit or down.\n\nERROR: {err}" + ) + + +@app.on_cb("imdbres_id") +@ratelimiter +async def imdb_id_callback(self: Client, query: CallbackQuery): + i, userid, movie = query.data.split("#") + if query.from_user.id != int(userid): + return await query.answer("⚠️ Akses Ditolak!", True) + try: + await query.message.edit_caption("⏳ Permintaan kamu sedang diproses.. ") + imdb_url = f"https://www.imdb.com/title/tt{movie}/" + resp = await http.get(imdb_url, headers=headers) + sop = BeautifulSoup(resp, "lxml") + r_json = json.loads( + sop.find("script", attrs={"type": "application/ld+json"}).contents[0] + ) + ott = await search_jw(r_json.get("name"), "ID") + typee = r_json.get("@type", "") + res_str = "" + tahun = ( + re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] + if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) + else "N/A" + ) + res_str += f"📹 Judul: {r_json.get('name')} [{tahun}] ({typee})\n" + if aka := r_json.get("alternateName"): + res_str += f"📢 AKA: {aka}\n\n" + else: + res_str += "\n" + if durasi := sop.select('li[data-testid="title-techspec_runtime"]'): + durasi = ( + durasi[0].find(class_="ipc-metadata-list-item__content-container").text + ) + res_str += f"Durasi: {GoogleTranslator('auto', 'id').translate(durasi)}\n" + if kategori := r_json.get("contentRating"): + res_str += f"Kategori: {kategori} \n" + if rating := r_json.get("aggregateRating"): + res_str += f"Peringkat: {rating['ratingValue']}⭐️ dari {rating['ratingCount']} pengguna\n" + if release := sop.select('li[data-testid="title-details-releasedate"]'): + rilis = ( + release[0] + .find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + .text + ) + rilis_url = release[0].find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + )["href"] + res_str += ( + f"Rilis: {rilis}\n" + ) + if genre := r_json.get("genre"): + genre = "".join( + f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " + if i in GENRES_EMOJI + else f"#{i.replace('-', '_').replace(' ', '_')}, " + for i in r_json["genre"] + ) + res_str += f"Genre: {genre[:-2]}\n" + if negara := sop.select('li[data-testid="title-details-origin"]'): + country = "".join( + f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " + for country in negara[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Negara: {country[:-2]}\n" + if bahasa := sop.select('li[data-testid="title-details-languages"]'): + language = "".join( + f"#{lang.text.replace(' ', '_').replace('-', '_')}, " + for lang in bahasa[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Bahasa: {language[:-2]}\n" + res_str += "\n🙎 Info Cast:\n" + if directors := r_json.get("director"): + director = "".join( + f"{i['name']}, " for i in directors + ) + res_str += f"Sutradara: {director[:-2]}\n" + if creators := r_json.get("creator"): + creator = "".join( + f"{i['name']}, " + for i in creators + if i["@type"] == "Person" + ) + res_str += f"Penulis: {creator[:-2]}\n" + if actors := r_json.get("actor"): + actor = "".join(f"{i['name']}, " for i in actors) + res_str += f"Pemeran: {actor[:-2]}\n\n" + if deskripsi := r_json.get("description"): + summary = GoogleTranslator("auto", "id").translate(deskripsi) + res_str += f"📜 Plot: {summary}\n\n" + if keywd := r_json.get("keywords"): + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " for i in keywd.split(",") + ) + res_str += f"🔥 Kata Kunci: {key_[:-2]} \n" + if award := sop.select('li[data-testid="award_information"]'): + awards = ( + award[0].find(class_="ipc-metadata-list-item__list-content-item").text + ) + res_str += f"🏆 Penghargaan: {GoogleTranslator('auto', 'id').translate(awards)}\n" + else: + res_str += "\n" + if ott != "": + res_str += f"Tersedia di:\n{ott}\n" + res_str += f"©️ IMDb by @{self.me.username}" + if trailer := r_json.get("trailer"): + trailer_url = trailer["url"] + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("🎬 Open IMDB", url=imdb_url), + InlineKeyboardButton("▶️ Trailer", url=trailer_url), + ] + ] + ) + else: + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]] + ) + if thumb := r_json.get("image"): + try: + await query.message.edit_media( + InputMediaPhoto( + thumb, caption=res_str, parse_mode=enums.ParseMode.HTML + ), + reply_markup=markup, + ) + except (PhotoInvalidDimensions, WebpageMediaEmpty): + poster = thumb.replace(".jpg", "._V1_UX360.jpg") + await query.message.edit_media( + InputMediaPhoto( + poster, caption=res_str, parse_mode=enums.ParseMode.HTML + ), + reply_markup=markup, + ) + except ( + MediaEmpty, + MediaCaptionTooLong, + WebpageCurlFailed, + MessageNotModified, + ): + await query.message.reply( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) + except Exception as err: + LOGGER.error(f"Terjadi error saat menampilkan data IMDB. ERROR: {err}") + else: + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) + except AttributeError: + await query.message.edit_caption("Maaf, gagal mendapatkan info data dari IMDB.") + except (MessageNotModified, MessageIdInvalid): + pass + + +@app.on_cb("imdbres_en") +@ratelimiter +async def imdb_en_callback(self: Client, query: CallbackQuery): + i, userid, movie = query.data.split("#") + if query.from_user.id != int(userid): + return await query.answer("⚠️ Access Denied!", True) + try: + await query.message.edit_caption("⏳ Getting IMDb source..") + imdb_url = f"https://www.imdb.com/title/tt{movie}/" + resp = await http.get(imdb_url, headers=headers) + sop = BeautifulSoup(resp, "lxml") + r_json = json.loads( + sop.find("script", attrs={"type": "application/ld+json"}).contents[0] + ) + ott = await search_jw(r_json.get("name"), "US") + typee = r_json.get("@type", "") + res_str = "" + tahun = ( + re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] + if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) + else "N/A" + ) + res_str += f"📹 Judul: {r_json.get('name')} [{tahun}] ({typee})\n" + if aka := r_json.get("alternateName"): + res_str += f"📢 AKA: {aka}\n\n" + else: + res_str += "\n" + if durasi := sop.select('li[data-testid="title-techspec_runtime"]'): + durasi = ( + durasi[0].find(class_="ipc-metadata-list-item__content-container").text + ) + res_str += f"Duration: {durasi}\n" + if kategori := r_json.get("contentRating"): + res_str += f"Category: {kategori} \n" + if rating := r_json.get("aggregateRating"): + res_str += f"Rating: {rating['ratingValue']}⭐️ from {rating['ratingCount']} users\n" + if release := sop.select('li[data-testid="title-details-releasedate"]'): + rilis = ( + release[0] + .find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + .text + ) + rilis_url = release[0].find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + )["href"] + res_str += ( + f"Rilis: {rilis}\n" + ) + if genre := r_json.get("genre"): + genre = "".join( + f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " + if i in GENRES_EMOJI + else f"#{i.replace('-', '_').replace(' ', '_')}, " + for i in r_json["genre"] + ) + res_str += f"Genre: {genre[:-2]}\n" + if negara := sop.select('li[data-testid="title-details-origin"]'): + country = "".join( + f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " + for country in negara[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Country: {country[:-2]}\n" + if bahasa := sop.select('li[data-testid="title-details-languages"]'): + language = "".join( + f"#{lang.text.replace(' ', '_').replace('-', '_')}, " + for lang in bahasa[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Language: {language[:-2]}\n" + res_str += "\n🙎 Cast Info:\n" + if r_json.get("director"): + director = "".join( + f"{i['name']}, " for i in r_json["director"] + ) + res_str += f"Director: {director[:-2]}\n" + if r_json.get("creator"): + creator = "".join( + f"{i['name']}, " + for i in r_json["creator"] + if i["@type"] == "Person" + ) + res_str += f"Writer: {creator[:-2]}\n" + if r_json.get("actor"): + actors = actors = "".join( + f"{i['name']}, " for i in r_json["actor"] + ) + res_str += f"Stars: {actors[:-2]}\n\n" + if description := r_json.get("description"): + res_str += f"📜 Summary: {description}\n\n" + if r_json.get("keywords"): + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " + for i in r_json["keywords"].split(",") + ) + res_str += f"🔥 Keywords: {key_[:-2]} \n" + if award := sop.select('li[data-testid="award_information"]'): + awards = ( + award[0].find(class_="ipc-metadata-list-item__list-content-item").text + ) + res_str += f"🏆 Awards: {awards}\n" + else: + res_str += "\n" + if ott != "": + res_str += f"Available On:\n{ott}\n" + res_str += f"©️ IMDb by @{self.me.username}" + if trailer := r_json.get("trailer"): + trailer_url = trailer["url"] + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton("🎬 Open IMDB", url=imdb_url), + InlineKeyboardButton("▶️ Trailer", url=trailer_url), + ] + ] + ) + else: + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton("🎬 Open IMDB", url=imdb_url)]] + ) + if thumb := r_json.get("image"): + try: + await query.message.edit_media( + InputMediaPhoto( + thumb, caption=res_str, parse_mode=enums.ParseMode.HTML + ), + reply_markup=markup, + ) + except (PhotoInvalidDimensions, WebpageMediaEmpty): + poster = thumb.replace(".jpg", "._V1_UX360.jpg") + await query.message.edit_media( + InputMediaPhoto( + poster, caption=res_str, parse_mode=enums.ParseMode.HTML + ), + reply_markup=markup, + ) + except ( + MediaCaptionTooLong, + WebpageCurlFailed, + MediaEmpty, + MessageNotModified, + ): + await query.message.reply( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) + except Exception as err: + LOGGER.error(f"Error while displaying IMDB Data. ERROR: {err}") + else: + await query.message.edit_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) + except AttributeError: + await query.message.edit_caption("Sorry, failed getting data from IMDB.") + except (MessageNotModified, MessageIdInvalid): + pass diff --git a/misskaty/plugins/inkick_user.py b/misskaty/plugins/inkick_user.py new file mode 100644 index 00000000..8666621e --- /dev/null +++ b/misskaty/plugins/inkick_user.py @@ -0,0 +1,265 @@ +import time +from asyncio import sleep + +from pyrogram import enums, filters +from pyrogram.errors import FloodWait +from pyrogram.errors.exceptions.bad_request_400 import ( + ChatAdminRequired, + UserAdminInvalid, +) +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "Inkick" +__HELP__ = """" +/instatus - View member status in group. +/ban_ghosts - Remove deleted account from group. +""" + + +@app.on_message( + filters.incoming & ~filters.private & filters.command(["inkick"], COMMAND_HANDLER) +) +@ratelimiter +@app.adminsOnly("can_restrict_members") +async def inkick(_, message): + if message.sender_chat: + return await message.reply_msg( + "This feature not available for channel.", del_in=4 + ) + user = await app.get_chat_member(message.chat.id, message.from_user.id) + if user.status.value in ("administrator", "owner"): + if len(message.command) > 1: + input_str = message.command + sent_message = await message.reply_text( + "🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**" + ) + count = 0 + async for member in app.get_chat_members(message.chat.id): + if member.user.is_bot: + continue + if ( + member.user.status.value in input_str + and member.status.value not in ("administrator", "owner") + ): + try: + await message.chat.ban_member(member.user.id) + count += 1 + await sleep(1) + await message.chat.unban_member(member.user.id) + except (ChatAdminRequired, UserAdminInvalid): + await sent_message.edit( + "❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__" + ) + await app.leave_chat(message.chat.id) + break + except FloodWait as e: + await sleep(e.value) + try: + await sent_message.edit( + f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**" + ) + + except ChatWriteForbidden: + await app.leave_chat(message.chat.id) + else: + await message.reply_text( + "❗ **Arguments Required**\n__See /help in personal message for more information.__" + ) + else: + sent_message = await message.reply_text( + "❗ **You have to be the group creator to do that.**" + ) + await sleep(5) + await sent_message.delete() + + +# Kick User Without Username +@app.on_message( + filters.incoming & ~filters.private & filters.command(["uname"], COMMAND_HANDLER) +) +@ratelimiter +@app.adminsOnly("can_restrict_members") +async def uname(_, message): + if message.sender_chat: + return await message.reply_msg( + "This feature not available for channel.", del_in=4 + ) + user = await app.get_chat_member(message.chat.id, message.from_user.id) + if user.status.value in ("administrator", "owner"): + sent_message = await message.reply_text( + "🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**" + ) + count = 0 + async for member in app.get_chat_members(message.chat.id): + if not member.user.username and member.status.value not in ( + "administrator", + "owner", + ): + try: + await message.chat.ban_member(member.user.id) + count += 1 + await sleep(1) + await message.chat.unban_member(member.user.id) + except (ChatAdminRequired, UserAdminInvalid): + await sent_message.edit( + "❗**Oh tidaakk, saya bukan admin disini**\n__Saya pergi dari sini, tambahkan aku kembali dengan perijinan banned pengguna.__" + ) + await app.leave_chat(message.chat.id) + break + except FloodWait as e: + await sleep(e.value) + try: + await sent_message.edit( + f"✔️ **Berhasil menendang {count} pengguna berdasarkan argumen.**" + ) + + except ChatWriteForbidden: + await app.leave_chat(message.chat.id) + else: + sent_message = await message.reply_text( + "❗ **You have to be the group creator to do that.**" + ) + await sleep(5) + await sent_message.delete() + + +@app.on_message( + filters.incoming + & ~filters.private + & filters.command(["ban_ghosts"], COMMAND_HANDLER) +) +@ratelimiter +@app.adminsOnly("can_restrict_members") +async def rm_delacc(_, message): + if message.sender_chat: + return await message.reply_msg( + "This feature not available for channel.", del_in=4 + ) + user = await app.get_chat_member(message.chat.id, message.from_user.id) + if user.status.value in ("administrator", "owner"): + sent_message = await message.reply_text( + "🚮**Sedang membersihkan user, mungkin butuh waktu beberapa saat...**" + ) + count = 0 + async for member in app.get_chat_members(message.chat.id): + if member.user.is_deleted and member.status.value not in ( + "administrator", + "owner", + ): + try: + await message.chat.ban_member(member.user.id) + count += 1 + await sleep(1) + await message.chat.unban_member(member.user.id) + except (ChatAdminRequired, UserAdminInvalid): + await sent_message.edit( + "❗**Oh Nooo, i'm doesn't have admin permission in this group. Make sure i'm have admin permission to ban users." + ) + break + except FloodWait as e: + await sleep(e.value) + if count == 0: + return await sent_message.edit_msg( + "There are no deleted accounts in this chat." + ) + await sent_message.edit_msg(f"✔️ **Berhasil menendang {count} akun terhapus.**") + else: + sent_message = await message.reply_text( + "❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**" + ) + await sleep(5) + await sent_message.delete() + + +@app.on_message( + filters.incoming & ~filters.private & filters.command(["instatus"], COMMAND_HANDLER) +) +@ratelimiter +@app.adminsOnly("can_restrict_members") +async def instatus(client, message): + if message.sender_chat: + return await message.reply_msg("Not supported channel.", del_in=4) + bstat = await app.get_chat_member(message.chat.id, client.me.id) + if bstat.status.value != "administrator": + return await message.reply_msg( + "Please give me all basic admin permission, to run this command." + ) + start_time = time.perf_counter() + user = await app.get_chat_member(message.chat.id, message.from_user.id) + count = await app.get_chat_members_count(message.chat.id) + if user.status in ( + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ): + sent_message = await message.reply_text( + "**Sedang mengumpulkan informasi pengguna...**" + ) + recently = 0 + within_week = 0 + within_month = 0 + long_time_ago = 0 + deleted_acc = 0 + premium_acc = 0 + no_username = 0 + restricted = 0 + banned = 0 + uncached = 0 + bot = 0 + async for _ in app.get_chat_members( + message.chat.id, filter=enums.ChatMembersFilter.BANNED + ): + banned += 1 + async for _ in app.get_chat_members( + message.chat.id, filter=enums.ChatMembersFilter.RESTRICTED + ): + restricted += 1 + async for member in app.get_chat_members(message.chat.id): + user = member.user + if user.is_deleted: + deleted_acc += 1 + elif user.is_bot: + bot += 1 + elif user.is_premium: + premium_acc += 1 + elif not user.username: + no_username += 1 + elif user.status.value == "recently": + recently += 1 + elif user.status.value == "last_week": + within_week += 1 + elif user.status.value == "last_month": + within_month += 1 + elif user.status.value == "long_ago": + long_time_ago += 1 + else: + uncached += 1 + end_time = time.perf_counter() + timelog = "{:.2f}".format(end_time - start_time) + await sent_message.edit_msg( + "💠 {}\n👥 {} Anggota\n——————\n👁‍🗨 Informasi Status Anggota\n——————\n🕒 recently: {}\n🕒 last_week: {}\n🕒 last_month: {}\n🕒 long_ago: {}\n🉑 Tanpa Username: {}\n🤐 Dibatasi: {}\n🚫 Diblokir: {}\n👻 Deleted Account (/ban_ghosts): {}\n🤖 Bot: {}\n⭐️ Premium User: {}\n👽 UnCached: {}\n\n⏱ Waktu eksekusi {} detik.".format( + message.chat.title, + count, + recently, + within_week, + within_month, + long_time_ago, + no_username, + restricted, + banned, + deleted_acc, + bot, + premium_acc, + uncached, + timelog, + ) + ) + else: + sent_message = await message.reply_text( + "❗ **Kamu harus jadi admin atau owner grup untuk melakukan tindakan ini.**" + ) + await sleep(5) + await sent_message.delete() diff --git a/misskaty/plugins/inline_search.py b/misskaty/plugins/inline_search.py new file mode 100644 index 00000000..0ff28458 --- /dev/null +++ b/misskaty/plugins/inline_search.py @@ -0,0 +1,760 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import json +import re +import traceback +from logging import getLogger +from sys import platform +from sys import version as pyver + +from bs4 import BeautifulSoup +from deep_translator import GoogleTranslator +from pykeyboard import InlineButton, InlineKeyboard +from pyrogram import __version__ as pyrover +from pyrogram import enums, filters +from pyrogram.errors import MessageIdInvalid, MessageNotModified +from pyrogram.types import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + InlineQuery, + InlineQueryResultArticle, + InlineQueryResultPhoto, + InputTextMessageContent, +) + +from misskaty import BOT_USERNAME, app, user +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import GENRES_EMOJI, http, post_to_telegraph, search_jw +from misskaty.plugins.dev import shell_exec +from misskaty.plugins.misc_tools import get_content +from misskaty.vars import USER_SESSION +from utils import demoji + +__MODULE__ = "InlineFeature" +__HELP__ = """ +To use this feature, just type bot username with following args below. +~ imdb [query] - Search movie details in IMDb.com. +~ pypi [query] - Search package from Pypi. +~ git [query] - Search in Git. +~ google [query] - Search in Google. +~ info [user id/username] - Check info about a user. +""" + +keywords_list = ["imdb", "pypi", "git", "google", "secretmsg", "info", "botapi"] + +PRVT_MSGS = {} +LOGGER = getLogger() + + +@app.on_inline_query() +async def inline_menu(_, inline_query: InlineQuery): + if inline_query.query.strip().lower().strip() == "": + aspymon_ver = (await shell_exec("pip freeze | grep async-pymongo"))[0] + buttons = InlineKeyboard(row_width=2) + buttons.add( + *[ + (InlineKeyboardButton(text=i, switch_inline_query_current_chat=i)) + for i in keywords_list + ] + ) + + btn = InlineKeyboard(row_width=2) + bot_state = "Alive" if USER_SESSION and await app.get_me() else "Dead" + ubot_state = "Alive" if USER_SESSION and await user.get_me() else "Dead" + btn.add( + InlineKeyboardButton("Stats", callback_data="stats_callback"), + InlineKeyboardButton("Go Inline!", switch_inline_query_current_chat=""), + ) + + msg = f""" +**[MissKaty✨](https://github.com/yasirarism):** +**MainBot Stats:** `{bot_state}` +**UserBot Stats:** `{ubot_state}` +**Python:** `{pyver.split()[0]}` +**Pyrogram:** `{pyrover}` +**MongoDB:** `{aspymon_ver}` +**Platform:** `{platform}` +**Bot:** {(await app.get_me()).first_name} +""" + if USER_SESSION: + msg += f"**UserBot:** {(await user.get_me()).first_name}" + answerss = [ + InlineQueryResultArticle( + title="Inline Commands", + description="Help Related To Inline Usage.", + input_message_content=InputTextMessageContent( + "Click A Button To Get Started." + ), + thumb_url="https://hamker.me/cy00x5x.png", + reply_markup=buttons, + ), + InlineQueryResultArticle( + title="Github Repo", + description="Github Repo of This Bot.", + input_message_content=InputTextMessageContent( + f"Github Repo @{BOT_USERNAME}\n\nhttps://github.com/yasirarism/MissKatyPyro" + ), + thumb_url="https://hamker.me/gjc9fo3.png", + ), + InlineQueryResultArticle( + title="Alive", + description="Check Bot's Stats", + thumb_url="https://yt3.ggpht.com/ytc/AMLnZu-zbtIsllERaGYY8Aecww3uWUASPMjLUUEt7ecu=s900-c-k-c0x00ffffff-no-rj", + input_message_content=InputTextMessageContent( + msg, disable_web_page_preview=True + ), + reply_markup=btn, + ), + ] + await inline_query.answer(results=answerss) + elif inline_query.query.strip().lower().split()[0] == "botapi": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="Bot Api Docs | botapi [QUERY]", + switch_pm_parameter="inline", + ) + kueri = inline_query.query.split(None, 1)[1].strip() + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/61.0.3163.100 Safari/537.36" + } + jsonapi = await http.get( + "https://github.com/PaulSonOfLars/telegram-bot-api-spec/raw/main/api.json", + headers=headers, + follow_redirects=True, + ) + parsemethod = jsonapi.json().get("methods") + parsetypes = jsonapi.json().get("types") + datajson = [] + method = None + is_img = False + for method in parsemethod: + if kueri.lower() in method.lower(): + link = parsemethod[method]["href"] + description = parsemethod[method]["description"][0] + buttons = InlineKeyboard() + buttons.row( + InlineButton("Open Docs", url=link), + InlineButton( + "Search Again", + switch_inline_query_current_chat=inline_query.query, + ), + ) + buttons.row( + InlineButton("Give Coffee", url="https://yasirpedia.eu.org"), + ) + returns = "".join(f"{i}, " for i in parsemethod[method]["returns"]) + msg = f"{method} ({returns[:-2]})\n" + msg += f"{description}\n\n" + msg += "Variables:\n" + if parsemethod[method].get("fields"): + for i in parsemethod[method]["fields"]: + msg += f"{i['name']} ({i['types'][0]})\nRequired: {i['required']}\n{i['description']}\n\n" + if len(msg.encode("utf-8")) > 4096: + body_text = f""" +
    {msg.replace("", "(user_id)")}
    + """ + msg = await post_to_telegraph(is_img, method, body_text) + datajson.append( + InlineQueryResultArticle( + title=method, + input_message_content=InputTextMessageContent( + message_text=msg, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=True, + ), + url=link, + description=description, + thumb_url="https://img.freepik.com/premium-vector/open-folder-folder-with-documents-document-protection-concept_183665-104.jpg", + reply_markup=buttons, + ) + ) + for types in parsetypes: + if kueri.lower() in types.lower(): + link = parsetypes[types]["href"] + description = parsetypes[types]["description"][0] + buttons = InlineKeyboard() + buttons.row( + InlineButton("Open Docs", url=link), + InlineButton( + "Search Again", + switch_inline_query_current_chat=inline_query.query, + ), + ) + buttons.row( + InlineButton("Give Coffee", url="https://yasirpedia.eu.org"), + ) + msg = f"{types}\n" + msg += f"{description}\n\n" + msg += "Variables:\n" + if parsetypes[types].get("fields"): + for i in parsetypes[types]["fields"]: + msg += f"{i['name']} ({i['types'][0]})\nRequired: {i['required']}\n{i['description']}\n\n" + if len(msg.encode("utf-8")) > 4096: + body_text = f""" +
    {msg}
    + """ + msg = await post_to_telegraph(is_img, method, body_text) + datajson.append( + InlineQueryResultArticle( + title=types, + input_message_content=InputTextMessageContent( + message_text=msg, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=True, + ), + url=link, + description=description, + thumb_url="https://img.freepik.com/premium-vector/open-folder-folder-with-documents-document-protection-concept_183665-104.jpg", + reply_markup=buttons, + ) + ) + await inline_query.answer( + results=datajson[:50], + is_gallery=False, + is_personal=False, + next_offset="", + cache_time=5, + switch_pm_text=f"Found {len(datajson)} results", + switch_pm_parameter="help", + ) + elif inline_query.query.strip().lower().split()[0] == "google": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="Google Search | google [QUERY]", + switch_pm_parameter="inline", + ) + judul = inline_query.query.split(None, 1)[1].strip() + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edge/107.0.1418.42" + } + search_results = await http.get( + f"https://www.google.com/search?q={judul}&num=20", headers=headers + ) + soup = BeautifulSoup(search_results.text, "lxml") + data = [] + for result in soup.find_all("div", class_="kvH3mc BToiNc UK95Uc"): + link = result.find("div", class_="yuRUbf").find("a").get("href") + title = result.find("div", class_="yuRUbf").find("h3").get_text() + try: + snippet = result.find( + "div", class_="VwiC3b yXK7lf MUxGbd yDYNvb lyLwlc lEBKkf" + ).get_text() + except: + snippet = "-" + message_text = f"{title}\n" + message_text += f"Deskription: {snippet}" + data.append( + InlineQueryResultArticle( + title=f"{title}", + input_message_content=InputTextMessageContent( + message_text=message_text, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=False, + ), + url=link, + description=snippet, + thumb_url="https://te.legra.ph/file/ed8ea62ae636793000bb4.jpg", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="Open Website", url=link)]] + ), + ) + ) + await inline_query.answer( + results=data, + is_gallery=False, + is_personal=False, + next_offset="", + switch_pm_text=f"Found {len(data)} results", + switch_pm_parameter="google", + ) + elif inline_query.query.strip().lower().split()[0] == "info": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="User Info | info [id/username]", + switch_pm_parameter="inline", + ) + userr = inline_query.query.split(None, 1)[1].strip() + if "t.me" in userr: + r = re.search(r"t.me/(\w+)", userr) + userr = r[1] + try: + diaa = await app.get_users(userr) + except Exception: # pylint: disable=broad-except + inline_query.stop_propagation() + return + namanya = ( + f"{diaa.first_name} {diaa.last_name}" if diaa.last_name else diaa.first_name + ) + msg = f"🏷 Name: {namanya}\n🆔 ID: {diaa.id}\n" + if diaa.username: + msg += f"🌐 Username: @{diaa.username}\n" + if diaa.status: + msg += f"🕰 User Status: {diaa.status}\n" + if diaa.dc_id: + msg += f"🌏 DC: {diaa.dc_id}\n" + msg += f"✨ Premium: {diaa.is_premium}\n" + msg += f"⭐️ Verified: {diaa.is_verified}\n" + msg += f"🤖 Bot: {diaa.is_bot}\n" + if diaa.language_code: + msg += f"🇮🇩 Language: {diaa.language_code}" + results = [ + InlineQueryResultArticle( + title=f"Get information off {diaa.id}", + input_message_content=InputTextMessageContent(msg), + description=f"Get information off {diaa.id}", + ) + ] + await inline_query.answer(results=results, cache_time=3) + elif inline_query.query.strip().lower().split()[0] == "secretmsg": + if len(inline_query.query.strip().lower().split()) < 3: + return await inline_query.answer( + results=[], + switch_pm_text="SecretMsg | secretmsg [USERNAME/ID] [MESSAGE]", + switch_pm_parameter="inline", + ) + _id = inline_query.query.split()[1] + msg = inline_query.query.split(None, 2)[2].strip() + + if not msg or not msg.endswith(":"): + inline_query.stop_propagation() + + try: + penerima = await app.get_users(_id.strip()) + except Exception: # pylint: disable=broad-except + inline_query.stop_propagation() + return + + PRVT_MSGS[inline_query.id] = ( + penerima.id, + penerima.first_name, + inline_query.from_user.id, + msg.strip(": "), + ) + prvte_msg = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "Show Message 🔐", callback_data=f"prvtmsg({inline_query.id})" + ) + ], + [ + InlineKeyboardButton( + "Destroy☠️ this msg", + callback_data=f"destroy({inline_query.id})", + ) + ], + ] + ) + mention = ( + f"@{penerima.username}" + if penerima.username + else f"{penerima.first_name}" + ) + msg_c = ( + f"🔒 A private message to {mention} [{penerima.id}], " + ) + msg_c += "Only he/she can open it." + results = [ + InlineQueryResultArticle( + title=f"A Private Msg to {penerima.first_name}", + input_message_content=InputTextMessageContent(msg_c), + description="Only he/she can open it", + thumb_url="https://te.legra.ph/file/16133ab3297b3f73c8da5.png", + reply_markup=prvte_msg, + ) + ] + await inline_query.answer(results=results, cache_time=3) + elif inline_query.query.strip().lower().split()[0] == "git": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="Github Search | git [QUERY]", + switch_pm_parameter="inline", + ) + query = inline_query.query.split(None, 1)[1].strip() + search_results = await http.get( + f"https://api.github.com/search/repositories?q={query}" + ) + srch_results = json.loads(search_results.text) + item = srch_results.get("items") + data = [] + for sraeo in item: + title = sraeo.get("full_name") + link = sraeo.get("html_url") + deskripsi = sraeo.get("description") + lang = sraeo.get("language") + message_text = f"🔗: {sraeo.get('html_url')}\n│\n└─🍴Forks: {sraeo.get('forks')} ┃┃ 🌟Stars: {sraeo.get('stargazers_count')}\n\n" + message_text += f"Description: {deskripsi}\n" + message_text += f"Language: {lang}" + data.append( + InlineQueryResultArticle( + title=f"{title}", + input_message_content=InputTextMessageContent( + message_text=message_text, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=False, + ), + url=link, + description=deskripsi, + thumb_url="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="Open Github Link", url=link)]] + ), + ) + ) + await inline_query.answer( + results=data, + is_gallery=False, + is_personal=False, + next_offset="", + switch_pm_text=f"Found {len(data)} results", + switch_pm_parameter="github", + ) + elif inline_query.query.strip().lower().split()[0] == "pypi": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="Pypi Search | pypi [QUERY]", + switch_pm_parameter="inline", + ) + query = inline_query.query.split(None, 1)[1].strip() + search_results = await http.get(f"https://yasirapi.eu.org/pypi?q={query}") + srch_results = search_results.json() + data = [] + for sraeo in srch_results["result"]: + title = sraeo.get("name") + link = sraeo.get("url") + deskripsi = sraeo.get("description") + version = sraeo.get("version") + message_text = f"{title} {version}\n" + message_text += f"Description: {deskripsi}\n" + data.append( + InlineQueryResultArticle( + title=f"{title}", + input_message_content=InputTextMessageContent( + message_text=message_text, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=False, + ), + url=link, + description=deskripsi, + thumb_url="https://raw.githubusercontent.com/github/explore/666de02829613e0244e9441b114edb85781e972c/topics/pip/pip.png", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="Open Link", url=link)]] + ), + ) + ) + await inline_query.answer( + results=data, + is_gallery=False, + is_personal=False, + next_offset="", + switch_pm_text=f"Found {len(data)} results", + switch_pm_parameter="pypi", + ) + elif inline_query.query.strip().lower().split()[0] == "yt": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="YouTube Search | yt [QUERY]", + switch_pm_parameter="inline", + ) + judul = inline_query.query.split(None, 1)[1].strip() + search_results = await http.get( + f"https://api.abir-hasan.tk/youtube?query={judul}" + ) + srch_results = json.loads(search_results.text) + asroe = srch_results.get("results") + oorse = [] + for sraeo in asroe: + title = sraeo.get("title") + link = sraeo.get("link") + view = sraeo.get("viewCount").get("text") + thumb = sraeo.get("thumbnails")[0].get("url") + durasi = sraeo.get("accessibility").get("duration") + publishTime = sraeo.get("publishedTime") + try: + deskripsi = "".join( + f"{i['text']} " for i in sraeo.get("descriptionSnippet") + ) + except: + deskripsi = "-" + message_text = f"{title}\n" + message_text += f"Description: {deskripsi}\n" + message_text += f"Total View: {view}\n" + message_text += f"Duration: {durasi}\n" + message_text += f"Published Time: {publishTime}" + oorse.append( + InlineQueryResultArticle( + title=f"{title}", + input_message_content=InputTextMessageContent( + message_text=message_text, + parse_mode=enums.ParseMode.HTML, + disable_web_page_preview=False, + ), + url=link, + description=deskripsi, + thumb_url=thumb, + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="Watch Video 📹", url=link)]] + ), + ) + ) + await inline_query.answer( + results=oorse, + is_gallery=False, + is_personal=False, + next_offset="", + switch_pm_text=f"Found {len(asroe)} results", + switch_pm_parameter="yt", + ) + elif inline_query.query.strip().lower().split()[0] == "imdb": + if len(inline_query.query.strip().lower().split()) < 2: + return await inline_query.answer( + results=[], + switch_pm_text="IMDB Search | imdb [QUERY]", + switch_pm_parameter="inline", + ) + movie_name = inline_query.query.split(None, 1)[1].strip() + search_results = await http.get( + f"https://yasirapi.eu.org/imdb-search?q={movie_name}" + ) + res = json.loads(search_results.text).get("result") + oorse = [] + for midb in res: + title = midb.get("l", "") + description = midb.get("q", "") + stars = midb.get("s", "") + imdb_url = f"https://imdb.com/title/{midb.get('id')}" + year = f"({midb.get('y', '')})" + image_url = ( + midb.get("i").get("imageUrl").replace(".jpg", "._V1_UX360.jpg") + if midb.get("i") + else "https://te.legra.ph/file/e263d10ff4f4426a7c664.jpg" + ) + caption = f"🎬" + caption += f"{title} {year}" + oorse.append( + InlineQueryResultPhoto( + title=f"{title} {year}", + caption=caption, + description=f" {description} | {stars}", + photo_url=image_url, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Get IMDB details", + callback_data=f"imdbinl#{inline_query.from_user.id}#{midb.get('id')}", + ) + ] + ] + ), + ) + ) + resfo = json.loads(search_results.text).get("q") + await inline_query.answer( + results=oorse, + is_gallery=False, + is_personal=False, + next_offset="", + switch_pm_text=f"Found {len(oorse)} results for {resfo}", + switch_pm_parameter="imdb", + ) + + +@app.on_callback_query(filters.regex(r"prvtmsg\((.+)\)")) +@ratelimiter +async def prvt_msg(_, c_q): + msg_id = str(c_q.matches[0].group(1)) + + if msg_id not in PRVT_MSGS: + await c_q.answer("Message now outdated !", show_alert=True) + return + + user_id, flname, sender_id, msg = PRVT_MSGS[msg_id] + + if c_q.from_user.id in (user_id, sender_id): + await c_q.answer(msg, show_alert=True) + else: + await c_q.answer(f"Only {flname} can see this Private Msg!", show_alert=True) + + +@app.on_callback_query(filters.regex(r"destroy\((.+)\)")) +@ratelimiter +async def destroy_msg(_, c_q): + msg_id = str(c_q.matches[0].group(1)) + + if msg_id not in PRVT_MSGS: + await c_q.answer("message now outdated !", show_alert=True) + return + + user_id, flname, sender_id, _ = PRVT_MSGS[msg_id] + + if c_q.from_user.id in (user_id, sender_id): + del PRVT_MSGS[msg_id] + by = "receiver" if c_q.from_user.id == user_id else "sender" + await c_q.edit_message_text(f"This secret message is ☠️destroyed☠️ by msg {by}") + else: + await c_q.answer(f"only {flname} can see this Private Msg!", show_alert=True) + + +@app.on_callback_query(filters.regex("^imdbinl#")) +@ratelimiter +async def imdb_inl(_, query): + i, cbuser, movie = query.data.split("#") + if cbuser == f"{query.from_user.id}": + try: + await query.edit_message_caption( + "⏳ Permintaan kamu sedang diproses.. " + ) + url = f"https://www.imdb.com/title/{movie}/" + resp = await get_content(url) + sop = BeautifulSoup(resp, "lxml") + r_json = json.loads( + sop.find("script", attrs={"type": "application/ld+json"}).contents[0] + ) + ott = await search_jw(r_json["name"], "en_ID") + res_str = "" + typee = r_json.get("@type", "") + tahun = ( + re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text)[0] + if re.findall(r"\d{4}\W\d{4}|\d{4}-?", sop.title.text) + else "N/A" + ) + res_str += f"📹 Judul: {r_json['name']} [{tahun}] ({typee})\n" + if r_json.get("alternateName"): + res_str += ( + f"📢 AKA: {r_json.get('alternateName')}\n\n" + ) + else: + res_str += "\n" + if durasi := sop.select('li[data-testid="title-techspec_runtime"]'): + durasi = ( + durasi[0] + .find(class_="ipc-metadata-list-item__content-container") + .text + ) + res_str += f"Durasi: {GoogleTranslator('auto', 'id').translate(durasi)}\n" + if r_json.get("contentRating"): + res_str += f"Kategori: {r_json['contentRating']} \n" + if r_json.get("aggregateRating"): + res_str += f"Peringkat: {r_json['aggregateRating']['ratingValue']}⭐️ dari {r_json['aggregateRating']['ratingCount']} pengguna \n" + if release := sop.select('li[data-testid="title-details-releasedate"]'): + rilis = ( + release[0] + .find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + .text + ) + rilis_url = release[0].find( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + )["href"] + res_str += f"Rilis: {rilis}\n" + if r_json.get("genre"): + genre = "".join( + f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, " + if i in GENRES_EMOJI + else f"#{i.replace('-', '_').replace(' ', '_')}, " + for i in r_json["genre"] + ) + res_str += f"Genre: {genre[:-2]}\n" + if negara := sop.select('li[data-testid="title-details-origin"]'): + country = "".join( + f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, " + for country in negara[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Negara: {country[:-2]}\n" + if bahasa := sop.select('li[data-testid="title-details-languages"]'): + language = "".join( + f"#{lang.text.replace(' ', '_').replace('-', '_')}, " + for lang in bahasa[0].findAll( + class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link" + ) + ) + res_str += f"Bahasa: {language[:-2]}\n" + res_str += "\n🙎 Info Cast:\n" + if r_json.get("director"): + director = "".join( + f"{i['name']}, " + for i in r_json["director"] + ) + res_str += f"Sutradara: {director[:-2]}\n" + if r_json.get("creator"): + creator = "".join( + f"{i['name']}, " + for i in r_json["creator"] + if i["@type"] == "Person" + ) + res_str += f"Penulis: {creator[:-2]}\n" + if r_json.get("actor"): + actors = "".join( + f"{i['name']}, " for i in r_json["actor"] + ) + res_str += f"Pemeran: {actors[:-2]}\n\n" + if r_json.get("description"): + summary = GoogleTranslator("auto", "id").translate( + r_json.get("description") + ) + res_str += f"📜 Plot: {summary}\n\n" + if r_json.get("keywords"): + key_ = "".join( + f"#{i.replace(' ', '_').replace('-', '_')}, " + for i in r_json["keywords"].split(",") + ) + res_str += f"🔥 Kata Kunci: {key_[:-2]} \n" + if award := sop.select('li[data-testid="award_information"]'): + awards = ( + award[0] + .find(class_="ipc-metadata-list-item__list-content-item") + .text + ) + res_str += f"🏆 Penghargaan: {GoogleTranslator('auto', 'id').translate(awards)}\n" + else: + res_str += "\n" + if ott != "": + res_str += f"Available On:\n{ott}\n" + res_str += "©️ IMDb by @MissKatyRoBot" + if r_json.get("trailer"): + trailer_url = r_json["trailer"]["url"] + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "🎬 Buka IMDB", + url=url, + ), + InlineKeyboardButton("▶️ Trailer", url=trailer_url), + ] + ] + ) + else: + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "🎬 Open IMDB", + url=url, + ) + ] + ] + ) + await query.edit_message_caption( + res_str, parse_mode=enums.ParseMode.HTML, reply_markup=markup + ) + except (MessageNotModified, MessageIdInvalid): + pass + except Exception: + exc = traceback.format_exc() + await query.edit_message_caption(f"ERROR:\n{exc}") + else: + await query.answer("⚠️ Akses Ditolak!", True) diff --git a/misskaty/plugins/json.py b/misskaty/plugins/json.py new file mode 100644 index 00000000..aa47eaec --- /dev/null +++ b/misskaty/plugins/json.py @@ -0,0 +1,48 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" + +import os + +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter + + +# View Structure Telegram Message As JSON +@app.on_cmd("json") +@ratelimiter +async def jsonify(_, message: Message): + the_real_message = None + reply_to_id = None + + the_real_message = message.reply_to_message or message + try: + await message.reply_text( + f"{the_real_message}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="❌ Close", + callback_data=f"close#{message.from_user.id if message.from_user else 2024984460}", + ) + ] + ] + ), + ) + except Exception as e: + with open("json.txt", "w+", encoding="utf8") as out_file: + out_file.write(str(the_real_message)) + await message.reply_document( + document="json.txt", + caption=f"{str(e)}", + disable_notification=True, + reply_to_message_id=reply_to_id, + thumb="assets/thumb.jpg", + ) + os.remove("json.txt") diff --git a/misskaty/plugins/karma.py b/misskaty/plugins/karma.py new file mode 100644 index 00000000..17913d9b --- /dev/null +++ b/misskaty/plugins/karma.py @@ -0,0 +1,216 @@ +import re + +from pyrogram import filters + +from database.karma_db import ( + get_karma, + get_karmas, + is_karma_on, + karma_off, + karma_on, + update_karma, +) +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import adminsOnly +from misskaty.helper.functions import alpha_to_int, int_to_alpha + +__MODULE__ = "Karma" +__HELP__ = """ +Give reputation to other people in group. + +/karma_toggle [enable/disable] - Enable/Disable Karma. +/karma - View all karma from member group. +""" + +karma_positive_group = 3 +karma_negative_group = 4 + +regex_upvote = r"^(\+|\+\+|\+1|thx|tnx|ty|tq|thank you|thanx|thanks|pro|cool|good|agree|makasih|👍|\+\+ .+)$" +regex_downvote = r"^(-|--|-1|not cool|disagree|worst|bad|👎|-- .+)$" + +n = "\n" +w = " " + +bold = lambda x: f"**{x}:** " +bold_ul = lambda x: f"**--{x}:**-- " +mono = lambda x: f"`{x}`{n}" + + +def section( + title: str, + body: dict, + indent: int = 2, + underline: bool = False, +) -> str: + text = (bold_ul(title) + n) if underline else bold(title) + n + + for key, value in body.items(): + text += ( + indent * w + + bold(key) + + ((value[0] + n) if isinstance(value, list) else mono(value)) + ) + return text + + +async def get_user_id_and_usernames(client) -> dict: + with client.storage.lock, client.storage.conn: + users = client.storage.conn.execute( + 'SELECT * FROM peers WHERE type in ("user", "bot") AND username NOT null' + ).fetchall() + return {user[0]: user[3] for user in users} + + +@app.on_message( + filters.text + & filters.group + & filters.incoming + & filters.reply + & filters.regex(regex_upvote, re.IGNORECASE) + & ~filters.via_bot + & ~filters.bot, + group=karma_positive_group, +) +@capture_err +async def upvote(_, message): + if not await is_karma_on(message.chat.id): + return + if not message.reply_to_message.from_user: + return + if not message.from_user: + return + if message.reply_to_message.from_user.is_bot: + return + if message.reply_to_message.from_user.id == message.from_user.id: + return + chat_id = message.chat.id + user_id = message.reply_to_message.from_user.id + user_mention = message.reply_to_message.from_user.mention + current_karma = await get_karma(chat_id, await int_to_alpha(user_id)) + if current_karma: + current_karma = current_karma["karma"] + karma = current_karma + 1 + else: + karma = 1 + new_karma = {"karma": karma} + await update_karma(chat_id, await int_to_alpha(user_id), new_karma) + await message.reply_msg( + f"Incremented Karma of {user_mention} By 1 \nTotal Points: {karma}" + ) + + +@app.on_message( + filters.text + & filters.group + & filters.incoming + & filters.reply + & filters.regex(regex_downvote, re.IGNORECASE) + & ~filters.via_bot + & ~filters.bot, + group=karma_negative_group, +) +@capture_err +async def downvote(_, message): + if not await is_karma_on(message.chat.id): + return + if not message.reply_to_message.from_user: + return + if not message.from_user: + return + if message.reply_to_message.from_user.is_bot: + return + if message.reply_to_message.from_user.id == message.from_user.id: + return + + chat_id = message.chat.id + user_id = message.from_user.id + current_karma = await get_karma(chat_id, await int_to_alpha(user_id)) + if current_karma: + current_karma = current_karma["karma"] + karma = current_karma - 1 + else: + karma = 1 + new_karma = {"karma": karma} + await update_karma(chat_id, await int_to_alpha(user_id), new_karma) + user_id = message.reply_to_message.from_user.id + user_mention = message.reply_to_message.from_user.mention + current_karma = await get_karma(chat_id, await int_to_alpha(user_id)) + if current_karma: + current_karma = current_karma["karma"] + karma = current_karma - 1 + else: + karma = 1 + new_karma = {"karma": karma} + await update_karma(chat_id, await int_to_alpha(user_id), new_karma) + await message.reply_msg( + f"Decremented Karma of {user_mention} By 1 \nTotal Points: {karma}" + ) + + +@app.on_message(filters.command("karma") & filters.group) +@capture_err +async def command_karma(_, message): + chat_id = message.chat.id + if not message.reply_to_message: + m = await message.reply_msg("Analyzing Karma...") + karma = await get_karmas(chat_id) + if not karma: + return await m.edit("No karma in DB for this chat.") + msg = f"Karma list of {message.chat.title}" + limit = 0 + karma_dicc = {} + for i in karma: + user_id = await alpha_to_int(i) + user_karma = karma[i]["karma"] + karma_dicc[str(user_id)] = user_karma + karma_arranged = dict( + sorted( + karma_dicc.items(), + key=lambda item: item[1], + reverse=True, + ) + ) + if not karma_dicc: + return await m.edit("No karma in DB for this chat.") + try: + userdb = await get_user_id_and_usernames(app) + except (AttributeError, TypeError): + return + karma = {} + for user_idd, karma_count in karma_arranged.items(): + if limit > 15: + break + if int(user_idd) not in list(userdb.keys()): + continue + username = userdb[int(user_idd)] + karma[f"@{username}"] = [f"**{str(karma_count)}**"] + limit += 1 + await m.edit(section(msg, karma)) + else: + if not message.reply_to_message.from_user: + return await message.reply("Anon user has no karma.") + + user_id = message.reply_to_message.from_user.id + karma = await get_karma(chat_id, await int_to_alpha(user_id)) + karma = karma["karma"] if karma else 0 + await message.reply_text(f"**Total Points**: __{karma}__") + + +@app.on_message(filters.command("karma_toggle") & ~filters.private) +@adminsOnly("can_change_info") +async def captcha_state(_, message): + usage = "**Usage:**\n/karma_toggle [ENABLE|DISABLE]" + if len(message.command) != 2: + return await message.reply_text(usage) + chat_id = message.chat.id + state = message.text.split(None, 1)[1].strip() + state = state.lower() + if state == "enable": + await karma_on(chat_id) + await message.reply_text("Enabled Karma System for this chat.") + elif state == "disable": + await karma_off(chat_id) + await message.reply_text("Disabled Karma System for this chat.") + else: + await message.reply_text(usage) diff --git a/misskaty/plugins/lang_setting.py b/misskaty/plugins/lang_setting.py new file mode 100644 index 00000000..f251b5c8 --- /dev/null +++ b/misskaty/plugins/lang_setting.py @@ -0,0 +1,120 @@ +from functools import partial +from typing import Union + +from pyrogram import filters +from pyrogram.enums import ChatType +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from database.locale_db import set_db_lang +from misskaty import app +from misskaty.core.misskaty_patch.listen.listen import ListenerTimeout +from misskaty.vars import COMMAND_HANDLER + +from ..core.decorator.permissions import require_admin +from ..helper.localization import ( + default_language, + get_locale_string, + langdict, + use_chat_lang, +) + + +def gen_langs_kb(): + langs = list(langdict) + kb = [] + while langs: + lang = langdict[langs[0]]["main"] + a = [ + InlineKeyboardButton( + f"{lang['language_flag']} {lang['language_name']}", + callback_data=f"set_lang {langs[0]}", + ) + ] + + langs.pop(0) + if langs: + lang = langdict[langs[0]]["main"] + a.append( + InlineKeyboardButton( + f"{lang['language_flag']} {lang['language_name']}", + callback_data=f"set_lang {langs[0]}", + ) + ) + + langs.pop(0) + kb.append(a) + return kb + + +@app.on_callback_query(filters.regex("^chlang$")) +@app.on_message(filters.command(["setchatlang", "setlang"], COMMAND_HANDLER)) +@require_admin(allow_in_private=True) +@use_chat_lang() +async def chlang(_, m: Union[CallbackQuery, Message], strings): + keyboard = InlineKeyboardMarkup( + inline_keyboard=[ + *gen_langs_kb(), + [ + InlineKeyboardButton( + strings("back_btn", context="general"), callback_data="start_back" + ) + ], + ] + ) + + if isinstance(m, CallbackQuery): + msg = m.message + sender = msg.edit_text + else: + msg = m + sender = msg.reply_text + if not msg.from_user: + return + + res = ( + strings("language_changer_private") + if msg.chat.type == ChatType.PRIVATE + else strings("language_changer_chat") + ) + msg = await sender(res, reply_markup=keyboard) + try: + await msg.wait_for_click(from_user_id=m.from_user.id, timeout=30) + except ListenerTimeout: + await msg.edit_msg(strings("exp_task", context="general")) + + +@app.on_callback_query(filters.regex("^set_lang ")) +@require_admin(allow_in_private=True) +@use_chat_lang() +async def set_chat_lang(_, m: CallbackQuery, strings): + lang = m.data.split()[1] + await set_db_lang(m.message.chat.id, m.message.chat.type, lang) + + strings = partial( + get_locale_string, + langdict[lang].get("lang_setting", langdict[default_language]["lang_setting"]), + lang, + "lang_setting", + ) + + if m.message.chat.type == ChatType.PRIVATE: + keyboard = InlineKeyboardMarkup( + inline_keyboard=[ + [ + InlineKeyboardButton( + strings("back_btn", context="general"), + callback_data="start_back", + ) + ] + ] + ) + else: + keyboard = None + await m.message.edit_msg( + strings("language_changed_successfully"), reply_markup=keyboard + ) diff --git a/misskaty/plugins/locks.py b/misskaty/plugins/locks.py new file mode 100644 index 00000000..746a8b05 --- /dev/null +++ b/misskaty/plugins/locks.py @@ -0,0 +1,190 @@ +""" +MIT License + +Copyright (c) 2023 TheHamkerCat + +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 ChatNotModified, FloodWait +from pyrogram.types import ChatPermissions + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import adminsOnly, list_admins +from misskaty.helper.functions import get_urls_from_text +from misskaty.vars import COMMAND_HANDLER, SUDO + +__MODULE__ = "Locks" +__HELP__ = """ +Commands: /lock | /unlock | /locks [No Parameters Required] + +Parameters: + messages | stickers | gifs | media | games | polls + + inline | url | group_info | user_add | pin + +You can only pass the "all" parameter with /lock, not with /unlock + +Example: + /lock all +""" + +incorrect_parameters = "Incorrect Parameters, Check Locks Section In Help." +# Using disable_preview as a switch for url checker +# That way we won't need an additional db to check +# If url lock is enabled/disabled for a chat +data = { + "messages": "can_send_messages", + "stickers": "can_send_other_messages", + "gifs": "can_send_other_messages", + "media": "can_send_media_messages", + "games": "can_send_other_messages", + "inline": "can_send_other_messages", + "url": "can_add_web_page_previews", + "polls": "can_send_polls", + "group_info": "can_change_info", + "useradd": "can_invite_users", + "pin": "can_pin_messages", +} + + +async def current_chat_permissions(chat_id): + perms = [] + try: + perm = (await app.get_chat(chat_id)).permissions + except FloodWait as e: + await asyncio.sleep(e.value) + perm = (await app.get_chat(chat_id)).permissions + if perm.can_send_messages: + perms.append("can_send_messages") + if perm.can_send_media_messages: + perms.append("can_send_media_messages") + if perm.can_send_other_messages: + perms.append("can_send_other_messages") + if perm.can_add_web_page_previews: + perms.append("can_add_web_page_previews") + if perm.can_send_polls: + perms.append("can_send_polls") + if perm.can_change_info: + perms.append("can_change_info") + if perm.can_invite_users: + perms.append("can_invite_users") + if perm.can_pin_messages: + perms.append("can_pin_messages") + + return perms + + +async def tg_lock(message, permissions: list, perm: str, lock: bool): + if lock: + if perm not in permissions: + return await message.reply_text("Already locked.") + permissions.remove(perm) + elif perm in permissions: + return await message.reply_text("Already Unlocked.") + else: + permissions.append(perm) + + permissions = {perm: True for perm in list(set(permissions))} + + try: + await app.set_chat_permissions(message.chat.id, ChatPermissions(**permissions)) + except ChatNotModified: + return await message.reply_text( + "To unlock this, you have to unlock 'messages' first." + ) + + await message.reply_text(("Locked." if lock else "Unlocked.")) + + +@app.on_message(filters.command(["lock", "unlock"], COMMAND_HANDLER) & ~filters.private) +@adminsOnly("can_restrict_members") +async def locks_func(_, message): + if len(message.command) != 2: + return await message.reply_text(incorrect_parameters) + + chat_id = message.chat.id + parameter = message.text.strip().split(None, 1)[1].lower() + state = message.command[0].lower() + + if parameter not in data and parameter != "all": + return await message.reply_text(incorrect_parameters) + + permissions = await current_chat_permissions(chat_id) + + if parameter in data: + await tg_lock(message, permissions, data[parameter], state == "lock") + elif parameter == "all" and state == "lock": + await app.set_chat_permissions(chat_id, ChatPermissions()) + await message.reply_text(f"Locked Everything in {message.chat.title}") + + elif parameter == "all" and state == "unlock": + await app.set_chat_permissions( + chat_id, + ChatPermissions( + can_send_messages=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + can_send_polls=True, + can_change_info=False, + can_invite_users=True, + can_pin_messages=False, + ), + ) + await message.reply(f"Unlocked Everything in {message.chat.title}") + + +@app.on_message(filters.command("locks", COMMAND_HANDLER) & ~filters.private) +@capture_err +async def locktypes(_, message): + permissions = await current_chat_permissions(message.chat.id) + + if not permissions: + return await message.reply_text("No Permissions.") + + perms = "".join(f"__**{i}**__\n" for i in permissions) + await message.reply_text(perms) + + +@app.on_message(filters.text & ~filters.private, group=69) +async def url_detector(_, message): + user = message.from_user + chat_id = message.chat.id + text = message.text.lower().strip() + + if not text or not user: + return + mods = await list_admins(chat_id) + if user.id in mods or user.id in SUDO: + return + + if get_urls_from_text(text): + permissions = await current_chat_permissions(chat_id) + if "can_add_web_page_previews" not in permissions: + try: + await message.delete_msg() + except Exception: + await message.reply_msg( + "This message contains a URL, " + + "but i don't have enough permissions to delete it" + ) diff --git a/misskaty/plugins/media_extractor.py b/misskaty/plugins/media_extractor.py new file mode 100644 index 00000000..806663ff --- /dev/null +++ b/misskaty/plugins/media_extractor.py @@ -0,0 +1,221 @@ +""" + * @author yasir + * @created 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import json +import os +from logging import getLogger +from re import I +from re import split as ngesplit +from time import time +from urllib.parse import unquote + +from pyrogram import Client, filters +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.misskaty_patch.listen.listen import ListenerTimeout +from misskaty.helper.human_read import get_readable_time +from misskaty.helper.localization import use_chat_lang +from misskaty.helper.pyro_progress import progress_for_pyrogram +from misskaty.helper.tools import get_random_string +from misskaty.plugins.dev import shell_exec +from misskaty.vars import COMMAND_HANDLER + +LOGGER = getLogger(__name__) + +ARCH_EXT = ( + "mkv", + "mp4", + "mov", + "wmv", + "3gp", + "mpg", + "webm", + "avi", + "flv", + "m4v", +) + +__MODULE__ = "MediaExtract" +__HELP__ = """ +/extractmedia [URL] - Extract subtitle or audio from video using link. (Not support TG File to reduce bandwith usage.) +/converttosrt [Reply to .ass or .vtt TG File] - Convert from .ass or .vtt to srt +/converttoass [Reply to .srt or .vtt TG File] - Convert from .srt or .vtt to srt +""" + + +def get_base_name(orig_path: str): + if ext := [ext for ext in ARCH_EXT if orig_path.lower().endswith(ext)]: + ext = ext[0] + return ngesplit(f"{ext}$", orig_path, maxsplit=1, flags=I)[0] + + +def get_subname(lang, url, ext): + fragment_removed = url.split("#")[0] # keep to left of first # + query_string_removed = fragment_removed.split("?")[0] + scheme_removed = query_string_removed.split("://")[-1].split(":")[-1] + if scheme_removed.find("/") == -1 or not get_base_name( + os.path.basename(unquote(scheme_removed)) + ): + return f"[{lang.upper()}] MissKatySub{get_random_string(4)}.{ext}" + return f"[{lang.upper()}] {get_base_name(os.path.basename(unquote(scheme_removed)))}{get_random_string(3)}.{ext}" + + +@app.on_message(filters.command(["ceksub", "extractmedia"], COMMAND_HANDLER)) +@ratelimiter +@use_chat_lang() +async def ceksub(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg( + strings("sub_extr_help").format(cmd=ctx.command[0]), quote=True, del_in=5 + ) + link = ctx.command[1] + start_time = time() + pesan = await ctx.reply_msg(strings("progress_str"), quote=True) + try: + res = ( + await shell_exec( + f"ffprobe -loglevel 0 -print_format json -show_format -show_streams {link}" + ) + )[0] + details = json.loads(res) + buttons = [] + for stream in details["streams"]: + mapping = stream["index"] + try: + stream_name = stream["codec_name"] + except: + stream_name = "-" + stream_type = stream["codec_type"] + if stream_type not in ("audio", "subtitle"): + continue + try: + lang = stream["tags"]["language"] + except: + lang = mapping + buttons.append( + [ + InlineKeyboardButton( + f"0:{mapping}({lang}): {stream_type}: {stream_name}", + f"streamextract#{lang}#0:{mapping}#{stream_name}", + ) + ] + ) + timelog = time() - start_time + buttons.append( + [InlineKeyboardButton(strings("cancel_btn"), f"close#{ctx.from_user.id}")] + ) + msg = await pesan.edit_msg( + strings("press_btn_msg").format(timelog=get_readable_time(timelog)), + reply_markup=InlineKeyboardMarkup(buttons), + ) + await msg.wait_for_click(from_user_id=ctx.from_user.id, timeout=30) + except ListenerTimeout: + await msg.edit_msg(strings("exp_task", context="general")) + except Exception: + await pesan.edit_msg(strings("fail_extr_media")) + + +@app.on_message(filters.command(["converttosrt", "converttoass"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +@use_chat_lang() +async def convertsrt(self: Client, ctx: Message, strings): + reply = ctx.reply_to_message + if ( + not reply + or not reply.document + or not reply.document.file_name + or not reply.document.file_name.endswith((".vtt", ".ass", ".srt")) + ): + return await ctx.reply_msg( + strings("conv_sub_help").format(cmd=ctx.command[0]), del_in=6 + ) + msg = await ctx.reply_msg(strings("convert_str"), quote=True) + if not os.path.exists("downloads"): + os.makedirs("downloads") + dl = await reply.download(file_name="downloads/") + filename = dl.split("/", 3)[3] + LOGGER.info( + f"ConvertSub: {filename} by {ctx.from_user.first_name if ctx.from_user else ctx.sender_chat.title} [{ctx.from_user.id if ctx.from_user else ctx.sender_chat.id}]" + ) + suffix = "srt" if ctx.command[0] == "converttosrt" else "ass" + await shell_exec(f"ffmpeg -i '{dl}' 'downloads/{filename}.{suffix}'") + c_time = time() + await ctx.reply_document( + f"downloads/{filename}.{suffix}", + caption=strings("capt_conv_sub").format(nf=filename, bot=self.me.username), + thumb="assets/thumb.jpg", + progress=progress_for_pyrogram, + progress_args=(strings("up_str"), msg, c_time, self.me.dc_id), + ) + await msg.delete_msg() + try: + os.remove(dl) + os.remove(f"downloads/{filename}.{suffix}") + except: + pass + + +@app.on_callback_query(filters.regex(r"^streamextract#")) +@ratelimiter +@use_chat_lang() +async def stream_extract(self: Client, update: CallbackQuery, strings): + cb_data = update.data + usr = update.message.reply_to_message + if update.from_user.id != usr.from_user.id: + return await update.answer(strings("unauth_cb"), True) + _, lang, map_code, codec = cb_data.split("#") + try: + link = update.message.reply_to_message.command[1] + except: + return await update.answer(strings("invalid_cb"), True) + await update.message.edit_msg(strings("progress_str")) + if codec == "aac": + ext = "aac" + elif codec == "mp3": + ext = "mp3" + elif codec == "eac3": + ext = "eac3" + else: + ext = "srt" + start_time = time() + namafile = get_subname(lang, link, ext) + try: + LOGGER.info( + f"ExtractSub: {namafile} by {update.from_user.first_name} [{update.from_user.id}]" + ) + (await shell_exec(f"ffmpeg -i {link} -map {map_code} '{namafile}'"))[0] + timelog = time() - start_time + c_time = time() + await update.message.reply_document( + namafile, + caption=strings("capt_extr_sub").format( + nf=namafile, bot=self.me.username, timelog=get_readable_time(timelog) + ), + reply_to_message_id=usr.id, + thumb="assets/thumb.jpg", + progress=progress_for_pyrogram, + progress_args=(strings("up_str"), update.message, c_time, self.me.dc_id), + ) + await update.message.delete_msg() + try: + os.remove(namafile) + except: + pass + except Exception as e: + try: + os.remove(namafile) + except: + pass + await update.message.edit_msg(strings("fail_extr_sub").format(link=link, e=e)) diff --git a/misskaty/plugins/mediainfo.py b/misskaty/plugins/mediainfo.py new file mode 100644 index 00000000..3bd6f929 --- /dev/null +++ b/misskaty/plugins/mediainfo.py @@ -0,0 +1,136 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import io +import subprocess +import time +from os import path +from os import remove as osremove + +from pyrogram import filters +from pyrogram.file_id import FileId +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import post_to_telegraph, progress_for_pyrogram, runcmd +from misskaty.helper.localization import use_chat_lang +from misskaty.helper.mediainfo_paste import mediainfo_paste +from misskaty.vars import COMMAND_HANDLER +from utils import get_file_id + + +@app.on_message(filters.command(["mediainfo"], COMMAND_HANDLER)) +@ratelimiter +@use_chat_lang() +async def mediainfo(_, ctx: Message, strings): + if not ctx.from_user: + return + if ctx.reply_to_message and ctx.reply_to_message.media: + process = await ctx.reply_msg(strings("processing_text"), quote=True) + file_info = get_file_id(ctx.reply_to_message) + if file_info is None: + return await process.edit_msg(strings("media_invalid")) + if ( + ctx.reply_to_message.video + and ctx.reply_to_message.video.file_size > 2097152000 + ) or ( + ctx.reply_to_message.document + and ctx.reply_to_message.document.file_size > 2097152000 + ): + return await process.edit_msg(strings("dl_limit_exceeded"), del_in=6) + c_time = time.time() + dc_id = FileId.decode(file_info.file_id).dc_id + try: + dl = await ctx.reply_to_message.download( + file_name="/downloads/", + progress=progress_for_pyrogram, + progress_args=(strings("dl_args_text"), process, c_time, dc_id), + ) + except FileNotFoundError: + return await process.edit_msg( + "ERROR: FileNotFound, maybe you're spam bot with same file." + ) + file_path = path.join("/downloads/", path.basename(dl)) + output_ = await runcmd(f'mediainfo "{file_path}"') + out = output_[0] if len(output_) != 0 else None + body_text = f""" +MissKatyBot MediaInfo +JSON +{file_info}.type + +DETAILS +{out or 'Not Supported'} + """ + try: + link = await mediainfo_paste(out, "MissKaty Mediainfo") + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text=strings("viweb"), url=link)]] + ) + except: + try: + link = await post_to_telegraph(False, "MissKaty MediaInfo", body_text) + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text=strings("viweb"), url=link)]] + ) + except: + markup = None + with io.BytesIO(str.encode(body_text)) as out_file: + out_file.name = "MissKaty_Mediainfo.txt" + await ctx.reply_document( + out_file, + caption=strings("capt_media").format(ment=ctx.from_user.mention), + thumb="assets/thumb.jpg", + reply_markup=markup, + ) + await process.delete() + try: + osremove(file_path) + except Exception: + pass + else: + try: + link = ctx.input + process = await ctx.reply_msg(strings("wait_msg")) + try: + output = subprocess.check_output(["mediainfo", f"{link}"]).decode( + "utf-8" + ) + except Exception: + return await process.edit_msg(strings("err_link")) + body_text = f""" + MissKatyBot MediaInfo + {output} + """ + # link = await post_to_telegraph(False, title, body_text) + try: + link = await mediainfo_paste(out, "MissKaty Mediainfo") + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text=strings("viweb"), url=link)]] + ) + except: + try: + link = await post_to_telegraph( + False, "MissKaty MediaInfo", body_text + ) + markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text=strings("viweb"), url=link)]] + ) + except: + markup = None + with io.BytesIO(str.encode(output)) as out_file: + out_file.name = "MissKaty_Mediainfo.txt" + await ctx.reply_document( + out_file, + caption=strings("capt_media").format(ment=ctx.from_user.mention), + thumb="assets/thumb.jpg", + reply_markup=markup, + ) + await process.delete() + except IndexError: + return await ctx.reply_msg( + strings("mediainfo_help").format(cmd=ctx.command[0]), del_in=6 + ) diff --git a/misskaty/plugins/misc_tools.py b/misskaty/plugins/misc_tools.py new file mode 100644 index 00000000..d18069dd --- /dev/null +++ b/misskaty/plugins/misc_tools.py @@ -0,0 +1,574 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" + +import asyncio +import json +import os +import traceback +from logging import getLogger +from urllib.parse import quote + +import aiohttp +from bs4 import BeautifulSoup +from deep_translator import GoogleTranslator +from gtts import gTTS +from PIL import Image +from pyrogram import Client, filters +from pyrogram.errors import ( + ChatAdminRequired, + MessageTooLong, + QueryIdInvalid, + UserNotParticipant, +) +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from misskaty import BOT_USERNAME, app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.helper.tools import rentry +from misskaty.vars import COMMAND_HANDLER +from utils import extract_user, get_file_id + +LOGGER = getLogger(__name__) + +__MODULE__ = "Misc" +__HELP__ = """ +/carbon [text or reply to text or caption] - Make beautiful snippet code on carbon from text. +/kbbi [keyword] - Search definition on KBBI (For Indonesian People) +/sof [query] - Search your problem in StackOverflow. +/google [query] - Search using Google Search. +(/tr, /trans, /translate) [lang code] - Translate text using Google Translate. +/tts - Convert Text to Voice. +/imdb [query] - Find Movie Details From IMDB.com (Available in English and Indonesia version). +/readqr [reply to photo] - Read QR Code From Photo. +/createqr [text] - Convert Text to QR Code. +/anime [query] - Search title in myanimelist. +/info - Get info user with Pic and full description if user set profile picture. +/id - Get simple user ID. +""" + + +def remove_html_tags(text): + """Remove html tags from a string""" + import re + + clean = re.compile("<.*?>") + return re.sub(clean, "", text) + + +headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edge/107.0.1418.42" +} + + +async def get_content(url): + async with aiohttp.ClientSession() as session: + r = await session.get(url, headers=headers) + return await r.read() + + +@app.on_cmd("kbbi") +async def kbbi_search(_, ctx: Client): + if len(ctx.command) == 1: + return await ctx.reply_msg("Please add keyword to search definition in kbbi") + r = (await http.get(f"https://yasirapi.eu.org/kbbi?kata={ctx.input}")).json() + if nomsg := r.get("detail"): + return await ctx.reply_msg(nomsg) + kbbi_btn = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="Open in Web", url=r.get("link"))]] + ) + res = "Definisi:\n" + for _, a in enumerate(r.get("result"), start=1): + submakna = "".join(f"{a}, " for a in a["makna"][0]["submakna"])[:-2] + contoh = "".join(f"{a}, " for a in a["makna"][0]["contoh"])[:-2] + kt_dasar = "".join(f"{a}, " for a in a["kata_dasar"])[:-2] + bt_takbaku = "".join(f"{a}, " for a in a["bentuk_tidak_baku"])[:-2] + res += f"{a['nama']} ({a['makna'][0]['kelas'][0]['nama']}: {a['makna'][0]['kelas'][0]['deskripsi']})\nKata Dasar: {kt_dasar if kt_dasar else '-'}\nBentuk Tidak Baku: {bt_takbaku if bt_takbaku else '-'}\nSubmakna: {submakna}\nContoh: {contoh if contoh else '-'}\n\n" + await ctx.reply(f"{res}By YasirPedia API", reply_markup=kbbi_btn) + + +@app.on_cmd("carbon") +async def carbon_make(self: Client, ctx: Message): + if ctx.reply_to_message and ctx.reply_to_message.text: + text = ctx.reply_to_message.text + elif ctx.reply_to_message and ctx.reply_to_message.caption: + text = ctx.reply_to_message.caption + elif len(ctx.command) > 1: + text = ctx.input + else: + return await ctx.reply( + "Please reply text to make carbon or add text after command." + ) + json_data = { + "code": text, + "backgroundColor": "#1F816D", + } + + response = await http.post( + "https://carbon.yasirapi.eu.org/api/cook", json=json_data + ) + if response.status_code != 200: + return await ctx.reply_photo(f"https://http.cat/{response.status_code}", caption="🤧 Carbon API ERROR") + fname = ( + f"carbonBY_{ctx.from_user.id if ctx.from_user else ctx.sender_chat.title}.png" + ) + with open(fname, "wb") as e: + e.write(response.content) + await ctx.reply_photo(fname, caption=f"Generated by @{self.me.username}") + os.remove(fname) + + +@app.on_message(filters.command("readqr", COMMAND_HANDLER)) +@ratelimiter +async def readqr(c, m): + if not m.reply_to_message: + return await m.reply("Please reply photo that contain valid QR Code.") + if not m.reply_to_message.photo: + return await m.reply("Please reply photo that contain valid QR Code.") + foto = await m.reply_to_message.download() + myfile = {"file": (foto, open(foto, "rb"), "application/octet-stream")} + url = "http://api.qrserver.com/v1/read-qr-code/" + r = await http.post(url, files=myfile) + os.remove(foto) + if res := r.json()[0]["symbol"][0]["data"] is None: + return await m.reply_msg(res) + await m.reply_msg( + f"QR Code Reader by @{c.me.username}: {r.json()[0]['symbol'][0]['data']}", + quote=True, + ) + + +@app.on_message(filters.command("createqr", COMMAND_HANDLER)) +@ratelimiter +async def makeqr(c, m): + if m.reply_to_message and m.reply_to_message.text: + teks = m.reply_to_message.text + elif len(m.command) > 1: + teks = m.text.split(None, 1)[1] + else: + return await m.reply( + "Please add text after command to convert text -> QR Code." + ) + url = f"https://api.qrserver.com/v1/create-qr-code/?data={quote(teks)}&size=300x300" + await m.reply_photo( + url, caption=f"QR Code Maker by @{c.me.username}", quote=True + ) + + +@app.on_message(filters.command(["sof"], COMMAND_HANDLER)) +@capture_err +async def stackoverflow(_, message): + if len(message.command) == 1: + return await message.reply("Give a query to search in StackOverflow!") + r = ( + await http.get( + f"https://api.stackexchange.com/2.3/search/excerpts?order=asc&sort=relevance&q={message.command[1]}&accepted=True&migrated=False¬ice=False&wiki=False&site=stackoverflow" + ) + ).json() + msg = await message.reply("Getting data..") + hasil = "" + for count, data in enumerate(r["items"], start=1): + question = data["question_id"] + title = data["title"] + snippet = ( + remove_html_tags(data["excerpt"])[:80].replace("\n", "").replace(" ", "") + if len(remove_html_tags(data["excerpt"])) > 80 + else remove_html_tags(data["excerpt"]).replace("\n", "").replace(" ", "") + ) + hasil += f"{count}. {title}\n{snippet}\n" + try: + await msg.edit(hasil) + except MessageTooLong: + url = await rentry(hasil) + await msg.edit(f"Your text pasted to rentry because has long text:\n{url}") + except Exception as e: + await msg.edit(e) + + +@app.on_message(filters.command(["google"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def gsearch(_, message): + if len(message.command) == 1: + return await message.reply("Give a query to search in Google!") + query = message.text.split(" ", maxsplit=1)[1] + msg = await message.reply_text(f"**Googling** for `{query}` ...") + try: + html = await http.get( + f"https://www.google.com/search?q={query}&gl=id&hl=id&num=17", + headers=headers, + ) + soup = BeautifulSoup(html.text, "lxml") + + # collect data + data = [] + + for result in soup.find_all("div", class_="kvH3mc BToiNc UK95Uc"): + link = result.find("div", class_="yuRUbf").find("a").get("href") + title = result.find("div", class_="yuRUbf").find("h3").get_text() + try: + snippet = result.find( + "div", class_="VwiC3b yXK7lf MUxGbd yDYNvb lyLwlc lEBKkf" + ).get_text() + except: + snippet = "-" + + # appending data to an array + data.append( + { + "title": title, + "link": link, + "snippet": snippet, + } + ) + arr = json.dumps(data, indent=2, ensure_ascii=False) + parse = json.loads(arr) + total = len(parse) + res = "".join( + f"{i['title']}\n{i['snippet']}\n\n" for i in parse + ) + except Exception: + exc = traceback.format_exc() + return await msg.edit(exc) + await msg.edit( + text=f"Ada {total} Hasil Pencarian dari {query}:\n{res}Scraped by @{BOT_USERNAME}", + disable_web_page_preview=True, + ) + + +@app.on_message(filters.command(["tr", "trans", "translate"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def translate(_, message): + if message.reply_to_message and ( + message.reply_to_message.text or message.reply_to_message.caption + ): + target_lang = "id" if len(message.command) == 1 else message.text.split()[1] + text = message.reply_to_message.text or message.reply_to_message.caption + else: + if len(message.command) < 3: + return await message.reply_msg( + "Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\nUsage: /tr en", + ) + target_lang = message.text.split(None, 2)[1] + text = message.text.split(None, 2)[2] + msg = await message.reply_msg("Menerjemahkan...") + try: + my_translator = GoogleTranslator(source="auto", target=target_lang) + result = my_translator.translate(text=text) + await msg.edit_msg( + f"Translation using source = {my_translator.source} and target = {my_translator.target}\n\n-> {result}" + ) + except MessageTooLong: + url = await rentry(result) + await msg.edit_msg( + f"Your translated text pasted to rentry because has long text:\n{url}" + ) + except Exception as err: + await msg.edit_msg(f"Oppss, Error: {str(err)}") + + +@app.on_message(filters.command(["tts"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def tts_convert(_, message): + if message.reply_to_message and ( + message.reply_to_message.text or message.reply_to_message.caption + ): + if len(message.text.split()) == 1: + target_lang = "id" + else: + target_lang = message.text.split()[1] + text = message.reply_to_message.text or message.reply_to_message.caption + else: + if len(message.text.split()) <= 2: + await message.reply_text( + "Berikan Kode bahasa yang valid.\n[Available options](https://telegra.ph/Lang-Codes-11-08).\n*Usage:* /tts en [text]", + ) + return + target_lang = message.text.split(None, 2)[1] + text = message.text.split(None, 2)[2] + msg = await message.reply("Converting to voice...") + fname = f"tts_BY_{message.from_user.id if message.from_user else message.sender_chat.title}.mp3" + try: + tts = gTTS(text, lang=target_lang) + tts.save(fname) + except ValueError as err: + await msg.edit(f"Error: {str(err)}") + return + await msg.delete() + await msg.reply_audio(fname) + if os.path.exists(fname): + os.remove(fname) + + +@app.on_message(filters.command(["tosticker"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def tostick(client, message): + try: + if not message.reply_to_message or not message.reply_to_message.photo: + return await message.reply_text("Reply ke foto untuk mengubah ke sticker") + sticker = await client.download_media( + message.reply_to_message.photo.file_id, + f"tostick_{message.from_user.id}.webp", + ) + await message.reply_sticker(sticker) + os.remove(sticker) + except Exception as e: + await message.reply_text(str(e)) + + +@app.on_message(filters.command(["toimage"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def topho(client, message): + try: + if not message.reply_to_message or not message.reply_to_message.sticker: + return await message.reply_text("Reply ke sticker untuk mengubah ke foto") + if message.reply_to_message.sticker.is_animated: + return await message.reply_text( + "Ini sticker animasi, command ini hanya untuk sticker biasa." + ) + photo = await message.reply_to_message.download() + im = Image.open(photo).convert("RGB") + filename = f"toimg_{message.from_user.id}.png" + im.save(filename, "png") + await asyncio.gather( + *[ + message.reply_document(filename), + message.reply_photo( + filename, caption=f"Sticker -> Image\n@{client.me.username}" + ), + ] + ) + os.remove(photo) + os.remove(filename) + except Exception as e: + await message.reply_text(str(e)) + + +@app.on_message(filters.command(["id"], COMMAND_HANDLER)) +@ratelimiter +async def showid(_, message): + chat_type = message.chat.type.value + if chat_type == "private": + user_id = message.chat.id + first = message.from_user.first_name + last = message.from_user.last_name or "" + username = message.from_user.username + dc_id = message.from_user.dc_id or "" + await message.reply_text( + f"➲ First Name: {first}\n➲ Last Name: {last}\n➲ Username: {username}\n➲ Telegram ID: {user_id}\n➲ Data Centre: {dc_id}", + quote=True, + ) + + elif chat_type in ["group", "supergroup"]: + _id = "" + _id += "➲ Chat ID: " f"{message.chat.id}\n" + if message.reply_to_message: + _id += ( + "➲ User ID: " + f"{message.from_user.id if message.from_user else 'Anonymous'}\n" + "➲ Replied User ID: " + f"{message.reply_to_message.from_user.id if message.reply_to_message.from_user else 'Anonymous'}\n" + ) + file_info = get_file_id(message.reply_to_message) + else: + _id += ( + "➲ User ID: " + f"{message.from_user.id if message.from_user else 'Anonymous'}\n" + ) + file_info = get_file_id(message) + if file_info: + _id += ( + f"{file_info.message_type}: " + f"{file_info.file_id}\n" + ) + await message.reply_text(_id, quote=True) + + +@app.on_message(filters.command(["info"], COMMAND_HANDLER)) +@ratelimiter +async def who_is(client, message): + # https://github.com/SpEcHiDe/PyroGramBot/blob/master/pyrobot/plugins/admemes/whois.py#L19 + if message.sender_chat: + return await message.reply_msg("Not supported channel..") + status_message = await message.reply_text("`Fetching user info...`") + await status_message.edit("`Processing user info...`") + from_user = None + from_user_id, _ = extract_user(message) + try: + from_user = await client.get_users(from_user_id) + except Exception as error: + await status_message.edit(str(error)) + return + if from_user is None: + return await status_message.edit("no valid user_id / message specified") + message_out_str = "" + message_out_str += f"➲First Name: {from_user.first_name}\n" + last_name = from_user.last_name or "None" + message_out_str += f"➲Last Name: {last_name}\n" + message_out_str += f"➲Telegram ID: {from_user.id}\n" + username = from_user.username or "None" + dc_id = from_user.dc_id or "[User Doesn't Have Profile Pic]" + message_out_str += f"➲Data Centre: {dc_id}\n" + message_out_str += f"➲User Name: @{username}\n" + message_out_str += f"➲User Link: Click Here\n" + if message.chat.type.value in (("supergroup", "channel")): + try: + chat_member_p = await message.chat.get_member(from_user.id) + joined_date = chat_member_p.joined_date + message_out_str += ( + "➲Joined this Chat on: " f"{joined_date}" "\n" + ) + except (UserNotParticipant, ChatAdminRequired): + pass + if chat_photo := from_user.photo: + local_user_photo = await client.download_media(message=chat_photo.big_file_id) + buttons = [ + [ + InlineKeyboardButton( + "🔐 Close", callback_data=f"close#{message.from_user.id}" + ) + ] + ] + reply_markup = InlineKeyboardMarkup(buttons) + await message.reply_photo( + photo=local_user_photo, + quote=True, + reply_markup=reply_markup, + caption=message_out_str, + disable_notification=True, + ) + os.remove(local_user_photo) + else: + buttons = [ + [ + InlineKeyboardButton( + "🔐 Close", callback_data=f"close#{message.from_user.id}" + ) + ] + ] + reply_markup = InlineKeyboardMarkup(buttons) + await message.reply_text( + text=message_out_str, + reply_markup=reply_markup, + quote=True, + disable_notification=True, + ) + await status_message.delete() + + +@app.on_callback_query(filters.regex("^close")) +@ratelimiter +async def close_callback(_, query: CallbackQuery): + _, userid = query.data.split("#") + if query.from_user.id != int(userid): + try: + return await query.answer("⚠️ Access Denied!", True) + except QueryIdInvalid: + return + try: + await query.answer("Deleting this message in 5 seconds.") + await asyncio.sleep(5) + await query.message.delete() + await query.message.reply_to_message.delete() + except: + pass + + +async def mdlapi(title): + link = f"https://kuryana.vercel.app/search/q/{title}" + async with aiohttp.ClientSession() as ses, ses.get(link) as result: + return await result.json() + + +@app.on_message(filters.command(["mdl"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +async def mdlsearch(_, message): + if " " in message.text: + _, title = message.text.split(None, 1) + k = await message.reply("Sedang mencari di Database MyDramaList.. 😴") + movies = await mdlapi(title) + res = movies["results"]["dramas"] + if not movies: + return await k.edit("Tidak ada hasil ditemukan.. 😕") + btn = [ + [ + InlineKeyboardButton( + text=f"{movie.get('title')} ({movie.get('year')})", + callback_data=f"mdls#{message.from_user.id}#{message.id}#{movie['slug']}", + ) + ] + for movie in res + ] + await k.edit( + f"Ditemukan {len(movies)} query dari {title}", + reply_markup=InlineKeyboardMarkup(btn), + ) + else: + await message.reply("Berikan aku nama drama yang ingin dicari. 🤷🏻‍♂️") + + +@app.on_callback_query(filters.regex("^mdls")) +@ratelimiter +async def mdl_callback(_, query: CallbackQuery): + _, user, _, slug = query.data.split("#") + if user == f"{query.from_user.id}": + await query.message.edit_text("Permintaan kamu sedang diproses.. ") + result = "" + try: + res = (await http.get(f"https://kuryana.vercel.app/id/{slug}")).json() + result += f"Title: {res['data']['title']}\n" + result += ( + f"AKA: {res['data']['others']['also_known_as']}\n\n" + ) + result += f"Rating: {res['data']['details']['score']}\n" + result += f"Content Rating: {res['data']['details']['content_rating']}\n" + result += f"Type: {res['data']['details']['type']}\n" + result += ( + f"Country: {res['data']['details']['country']}\n" + ) + if res["data"]["details"]["type"] == "Movie": + result += f"Release Date: {res['data']['details']['release_date']}\n" + elif res["data"]["details"]["type"] == "Drama": + result += f"Episode: {res['data']['details']['episodes']}\n" + result += ( + f"Aired: {res['data']['details']['aired']}\n" + ) + try: + result += f"Aired on: {res['data']['details']['aired_on']}\n" + except: + pass + try: + result += f"Original Network: {res['data']['details']['original_network']}\n" + except: + pass + result += ( + f"Duration: {res['data']['details']['duration']}\n" + ) + result += ( + f"Genre: {res['data']['others']['genres']}\n\n" + ) + result += f"Synopsis: {res['data']['synopsis']}\n" + result += f"Tags: {res['data']['others']['tags']}\n" + btn = InlineKeyboardMarkup( + [[InlineKeyboardButton("🎬 Open MyDramaList", url=res["data"]["link"])]] + ) + await query.message.edit_text(result, reply_markup=btn) + except Exception as e: + await query.message.edit_text(f"ERROR:\n{e}") + else: + await query.answer("Tombol ini bukan untukmu", show_alert=True) diff --git a/misskaty/plugins/nightmodev2.py b/misskaty/plugins/nightmodev2.py new file mode 100644 index 00000000..d115b1e8 --- /dev/null +++ b/misskaty/plugins/nightmodev2.py @@ -0,0 +1,261 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import platform +import re +from datetime import datetime, timedelta + +import pytz +from apscheduler.jobstores.base import ConflictingIdError +from pyrogram import __version__, filters +from pyrogram.errors import ( + ChannelInvalid, + ChannelPrivate, + ChatAdminRequired, + ChatNotModified, +) +from pyrogram.types import ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup + +from database.locale_db import get_db_lang +from misskaty import BOT_NAME, app, scheduler +from misskaty.core.decorator.permissions import require_admin +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.localization import langdict, use_chat_lang +from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, TZ + +__MODULE__ = "NightMode" +__HELP__ = """Enable or disable nightmode (locks the chat at specified intervals everyday) +Flags: +'-s': "Specify starting time in 24hr format." +'-e': "Specify duration in hours / minute" +'-d': "Disable nightmode for chat." + +Examples: +/nightmode -s=23:53 -e=6h +/nightmode -s=23:50 -e=120m +/nightmode -d +""" + +TIME_ZONE = pytz.timezone(TZ) +reply_markup = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="❤️", callback_data="nightmd")]] +) + + +# Check calculate how long it will take to Ramadhan +def puasa(): + now = datetime.now(pytz.timezone("Asia/Jakarta")) + tahun = now.strftime("%Y") + bulan = now.strftime("%m") + tgl = now.strftime("%d") + jam = now.strftime("%H") + menit = now.strftime("%M") + detik = now.strftime("%S") + x = datetime(int(tahun), int(bulan), int(tgl), int(jam), int(menit), int(detik)) + y = datetime(2022, 4, 2, 0, 0, 0) + return y - x + + +def tglsekarang(): + now = datetime.now(pytz.timezone("Asia/Jakarta")) + days = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"] + month = [ + "Unknown", + "Januari", + "Februari", + "Maret", + "April", + "Mei", + "Juni", + "Juli", + "Agustus", + "September", + "Oktober", + "November", + "Desember", + ] + tgl = now.strftime("%d") + tahun = now.strftime("%Y") + jam = now.strftime("%H:%M") + return f"{days[now.weekday()]}, {tgl} {month[now.month]} {tahun} {jam}" + + +def extract_time(time_val: str): + if any(time_val.endswith(unit) for unit in ("m", "h")): + unit = time_val[-1] + time_num = time_val[:-1] + if not time_num.isdigit(): + return "" + if unit == "m": + time = int(time_num) * 60 + elif unit == "h": + time = int(time_num) * 60 * 60 + else: + return "" + return time + return "" + + +async def un_mute_chat(chat_id: int, perm: ChatPermissions): + getlang = await get_db_lang(chat_id) + getlang = getlang or "en-US" + try: + await app.set_chat_permissions(chat_id, perm) + except ChatAdminRequired: + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_off_not_admin"].format( + chat_id=chat_id, bname=BOT_NAME + ), + ) + except (ChannelInvalid, ChannelPrivate): + scheduler.remove_job(f"enable_nightmode_{chat_id}") + scheduler.remove_job(f"disable_nightmode_{chat_id}") + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_off_not_present"].format( + chat_id=chat_id, bname=BOT_NAME + ), + ) + except ChatNotModified: + pass + except Exception as e: + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_off_err"].format( + chat_id=chat_id, e=e + ), + ) + else: + job = scheduler.get_job(f"enable_nightmode_{chat_id}") + close_at = job.next_run_time + await app.send_message( + chat_id, + langdict[getlang]["nightmodev2"]["nmd_off_success"].format( + dt=tglsekarang(), close_at=close_at + ), + reply_markup=reply_markup, + ) + + +async def mute_chat(chat_id: int): + getlang = await get_db_lang(chat_id) + getlang = getlang or "en-US" + try: + await app.set_chat_permissions(chat_id, ChatPermissions()) + except ChatAdminRequired: + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_on_not_admin"].format( + chat_id=chat_id, bname=BOT_NAME + ), + ) + except (ChannelInvalid, ChannelPrivate): + scheduler.remove_job(f"enable_nightmode_{chat_id}") + scheduler.remove_job(f"disable_nightmode_{chat_id}") + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_on_not_present"].format( + chat_id=chat_id, bname=BOT_NAME + ), + ) + except ChatNotModified: + pass + except Exception as e: + await app.send_message( + LOG_CHANNEL, + langdict[getlang]["nightmodev2"]["nmd_on_err"].format(chat_id=chat_id, e=e), + ) + else: + job = scheduler.get_job(f"disable_nightmode_{chat_id}") + open_at = job.next_run_time + await app.send_message( + chat_id, + langdict[getlang]["nightmodev2"]["nmd_on_success"].format( + dt=tglsekarang(), open_at=open_at + ), + reply_markup=reply_markup, + ) + + +@app.on_message(filters.command("nightmode", COMMAND_HANDLER) & filters.group) +@require_admin(permissions=["can_change_info"]) +@use_chat_lang() +async def nightmode_handler(_, msg, strings): + chat_id = msg.chat.id + + if "-d" in msg.text: + if scheduler.get_job(job_id=f"enable_nightmode_{chat_id}"): + scheduler.remove_job(job_id=f"enable_nightmode_{chat_id}") + scheduler.remove_job(job_id=f"disable_nightmode_{chat_id}") + if not bool(scheduler.get_jobs()) and bool(scheduler.state): + scheduler.shutdown() + return await msg.reply_msg(strings("nmd_disabled")) + return await msg.reply_msg(strings("nmd_not_enabled")) + + starttime = re.findall(r"-s=(\d+:\d+)", msg.text) + start = starttime[0] if starttime else "00:00" + now = datetime.now(TIME_ZONE) + + try: + start_timestamp = TIME_ZONE.localize( + datetime.strptime((now.strftime("%m:%d:%Y - ") + start), "%m:%d:%Y - %H:%M") + ) + except ValueError: + return await msg.reply_msg(strings("invalid_time_format"), del_in=6) + lockdur = re.findall(r"-e=(\w+)", msg.text) + lockdur = lockdur[0] if lockdur else "6h" + lock_dur = extract_time(lockdur.lower()) + + if not lock_dur: + return await msg.reply_msg(strings("invalid_lockdur"), del_in=6) + + if start_timestamp < now: + start_timestamp = start_timestamp + timedelta(days=1) + end_time_stamp = start_timestamp + timedelta(seconds=int(lock_dur)) + try: + # schedule to enable nightmode + scheduler.add_job( + mute_chat, + "interval", + [chat_id], + id=f"enable_nightmode_{chat_id}", + days=1, + next_run_time=start_timestamp, + max_instances=50, + misfire_grace_time=None, + ) + + # schedule to disable nightmode + scheduler.add_job( + un_mute_chat, + "interval", + [chat_id, msg.chat.permissions], + id=f"disable_nightmode_{chat_id}", + days=1, + next_run_time=end_time_stamp, + max_instances=50, + misfire_grace_time=None, + ) + except ConflictingIdError: + return await msg.reply_msg(strings("schedule_already_on")) + await msg.reply_msg( + strings("nmd_enable_success").format( + st=start_timestamp.strftime("%H:%M:%S"), lockdur=lockdur + ) + ) + if not bool(scheduler.state): + scheduler.start() + + +@app.on_callback_query(filters.regex(r"^nightmd$")) +@ratelimiter +@use_chat_lang() +async def callbackanightmd(c, q, strings): + await q.answer( + strings("nmd_cb").format( + bname=c.me.first_name, ver=__version__, pyver=platform.python_version() + ), + show_alert=True, + ) diff --git a/misskaty/plugins/notes.py b/misskaty/plugins/notes.py new file mode 100644 index 00000000..ca6d119e --- /dev/null +++ b/misskaty/plugins/notes.py @@ -0,0 +1,132 @@ +""" +MIT License + +Copyright (c) 2021 TheHamkerCat + +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 re import findall + +from pyrogram import filters + +from database.notes_db import delete_note, get_note, get_note_names, save_note +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.permissions import adminsOnly +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.keyboard import ikb +from misskaty.helper.functions import extract_text_and_keyb + +__MODULE__ = "Notes" +__HELP__ = """/notes To Get All The Notes In The Chat. + +(/save, /addnote) [NOTE_NAME] To Save A Note (Can be a sticker or text). + +#NOTE_NAME To Get A Note. + +(/clear, /delnote) [NOTE_NAME] To Delete A Note. +""" + + +@app.on_message(filters.command(["addnote", "save"]) & ~filters.private) +@adminsOnly("can_change_info") +@ratelimiter +async def save_notee(_, message): + if len(message.command) < 2 or not message.reply_to_message: + await message.reply( + text="**Usage:**\nReply to a text or sticker with /addnote [NOTE_NAME] to save it.", + ) + + elif not message.reply_to_message.text and not message.reply_to_message.sticker: + await message.reply("__**You can only save text or stickers in notes.**__") + else: + name = message.text.split(None, 1)[1].strip() + if not name: + return await message.reply("**Usage**\n__/save [NOTE_NAME]__") + _type = "text" if message.reply_to_message.text else "sticker" + note = { + "type": _type, + "data": message.reply_to_message.text.markdown + if _type == "text" + else message.reply_to_message.sticker.file_id, + } + chat_id = message.chat.id + await save_note(chat_id, name, note) + await message.reply(f"__**Saved note {name}.**__") + + +@app.on_message(filters.command("notes") & ~filters.private) +@capture_err +@ratelimiter +async def get_notes(_, message): + chat_id = message.chat.id + + _notes = await get_note_names(chat_id) + + if not _notes: + return await message.reply("**No notes in this chat.**") + _notes.sort() + msg = f"List of notes in {message.chat.title} - {message.chat.id}\n" + for note in _notes: + msg += f"**-** `{note}`\n" + await message.reply(msg) + + +@app.on_message(filters.regex(r"^#.+") & filters.text & ~filters.private) +@capture_err +@ratelimiter +async def get_one_note(_, message): + name = message.text.replace("#", "", 1) + if not name: + return + _note = await get_note(message.chat.id, name) + if not _note: + return + if _note["type"] == "text": + data = _note["data"] + keyb = None + if findall(r"\[.+\,.+\]", data): + if keyboard := extract_text_and_keyb(ikb, data): + data, keyb = keyboard + await message.reply_text( + data, + reply_markup=keyb, + disable_web_page_preview=True, + ) + else: + await message.reply_sticker(_note["data"]) + + +@app.on_message(filters.command(["delnote", "clear"]) & ~filters.private) +@adminsOnly("can_change_info") +@ratelimiter +async def del_note(_, message): + if len(message.command) == 1: + return await message.reply("**Usage**\n__/delnote [NOTE_NAME]__") + name = message.text.split(None, 1)[1].strip() + if not name: + return await message.reply("**Usage**\n__/delnote [NOTE_NAME]__") + + chat_id = message.chat.id + + deleted = await delete_note(chat_id, name) + if deleted: + await message.reply(f"**Deleted note {name} successfully.**") + else: + await message.reply("**No such note.**") diff --git a/misskaty/plugins/nulis.py b/misskaty/plugins/nulis.py new file mode 100644 index 00000000..2bfb8b20 --- /dev/null +++ b/misskaty/plugins/nulis.py @@ -0,0 +1,65 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import os + +from PIL import Image, ImageDraw, ImageFont +from pyrogram import filters + +from misskaty import app +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "nulis" +__HELP__ = """ +Command: /nulis [reply to msg or after cmd] +Desc: For those of you who are lazy to write. +""" + + +def text_set(text): + lines = [] + if len(text) <= 55: + lines.append(text) + else: + all_lines = text.split("\n") + for line in all_lines: + if len(line) <= 55: + lines.append(line) + else: + k = len(line) // 55 + lines.extend(line[((z - 1) * 55) : (z * 55)] for z in range(1, k + 2)) + return lines[:25] + + +@app.on_message(filters.command(["nulis"], COMMAND_HANDLER)) +async def handwrite(client, message): + if message.reply_to_message and message.reply_to_message.text: + txt = message.reply_to_message.text + elif len(message.command) > 1: + txt = message.text.split(None, 1)[1] + else: + return await message.reply( + "Please reply to message or write after command to use Nulis CMD." + ) + nan = await message.reply_msg("Processing...") + try: + img = Image.open("assets/kertas.jpg") + draw = ImageDraw.Draw(img) + font = ImageFont.truetype("assets/assfont.ttf", 30) + x, y = 150, 140 + lines = text_set(txt) + line_height = font.getbbox("hg")[3] + for line in lines: + draw.text((x, y), line, fill=(1, 22, 55), font=font) + y = y + line_height - 5 + file = f"nulis_{message.from_user.id}.jpg" + img.save(file) + if os.path.exists(file): + await message.reply_photo( + photo=file, caption=f"Written By : {client.me.mention}" + ) + os.remove(file) + await nan.delete() + except Exception as e: + return await message.reply(e) diff --git a/misskaty/plugins/ocr.py b/misskaty/plugins/ocr.py new file mode 100644 index 00000000..a274c564 --- /dev/null +++ b/misskaty/plugins/ocr.py @@ -0,0 +1,62 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" + + +import os + +from pyrogram import filters +from pyrogram.types import Message +from telegraph.aio import Telegraph + +from misskaty import app +from misskaty.core.decorator.errors import capture_err +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "OCR" +__HELP__ = "/ocr [reply to photo] - Read Text From Image" + + +@app.on_message(filters.command(["ocr"], COMMAND_HANDLER)) +@capture_err +@ratelimiter +@use_chat_lang() +async def ocr(_, ctx: Message, strings): + reply = ctx.reply_to_message + if ( + not reply + or not reply.sticker + and not reply.photo + and (not reply.document or not reply.document.mime_type.startswith("image")) + ): + return await ctx.reply_msg( + strings("no_photo").format(cmd=ctx.command[0]), quote=True + ) + msg = await ctx.reply_msg(strings("read_ocr"), quote=True) + try: + file_path = await reply.download() + if reply.sticker: + file_path = await reply.download( + f"ocr_{ctx.from_user.id if ctx.from_user else ctx.sender_chat.id}.jpg" + ) + response = await Telegraph().upload_file(file_path) + url = f"https://telegra.ph{response[0]['src']}" + req = ( + await http.get( + f"https://script.google.com/macros/s/AKfycbwURISN0wjazeJTMHTPAtxkrZTWTpsWIef5kxqVGoXqnrzdLdIQIfLO7jsR5OQ5GO16/exec?url={url}", + follow_redirects=True, + ) + ).json() + await msg.edit_msg(strings("result_ocr").format(result=req["text"])) + if os.path.exists(file_path): + os.remove(file_path) + except Exception as e: + await msg.edit_msg(str(e)) + if os.path.exists(file_path): + os.remove(file_path) diff --git a/misskaty/plugins/paste.py b/misskaty/plugins/paste.py new file mode 100644 index 00000000..3158995a --- /dev/null +++ b/misskaty/plugins/paste.py @@ -0,0 +1,522 @@ +""" + * @author Yasir Aris M + * @created 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +from json import loads as json_loads +from os import remove +from re import compile as compiles + +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import http, post_to_telegraph, rentry +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "Paste" +__HELP__ = """ +/paste [Text/Reply To Message] - Post text to My Pastebin. +/sbin [Text/Reply To Message] - Post text to Spacebin. +/neko [Text/Reply To Message] - Post text to Nekobin. +/tgraph [Text/Reply To Message] - Post text/media to Telegra.ph. +/rentry [Text/Reply To Message] - Post text to Rentry using markdown style. +/temp_paste [Text/Reply To Message] - Post text to tempaste.com using html style. +""" + + +# Size Checker for Limit +def humanbytes(size: int): + """Convert Bytes To Bytes So That Human Can Read It""" + if not isinstance(size, int): + try: + pass + except ValueError: + size = None + if not size: + return "0 B" + size = int(size) + power = 2**10 + raised_to_pow = 0 + dict_power_n = { + 0: "", + 1: "K", + 2: "M", + 3: "G", + 4: "T", + 5: "P", + 6: "E", + 7: "Z", + 8: "Y", + } + while size > power: + size /= power + raised_to_pow += 1 + try: + real_size = f"{str(round(size, 2))} {dict_power_n[raised_to_pow]}B" + except KeyError: + real_size = "Can't Define Real Size !" + return real_size + + +# Pattern if extension supported, PR if want to add more +pattern = compiles(r"^text/|json$|yaml$|xml$|toml$|x-sh$|x-shellscript$|x-subrip$") + + +@app.on_message(filters.command(["tgraph"], COMMAND_HANDLER)) +@ratelimiter +async def telegraph_paste(_, message): + reply = message.reply_to_message + if not reply and len(message.command) < 2: + return await message.reply_msg( + f"**Reply To A Message With /{message.command[0]} or with command**", + del_in=6, + ) + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username} [{message.from_user.id}]" + else: + uname = f"[{message.from_user.first_name}](tg://user?id={message.from_user.id}) [{message.from_user.id}]" + else: + uname = message.sender_chat.title + msg = await message.reply_msg("`Pasting to Telegraph...`") + if reply and (reply.photo or reply.animation): + file = await reply.download() + try: + url = await post_to_telegraph(True, media=file) + except Exception as err: + remove(file) + return msg.edit_msg(f"Failed to upload. ERR: {err}") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully upload your media to Telegraph.\n\nUpload by {uname}**" + remove(file) + return await msg.edit_msg( + pasted, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup(button), + ) + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await msg.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await msg.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + title = ( + message.text.split(None, 1)[1] + if len(message.command) > 1 + else "MissKaty Paste" + ) + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await msg.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + title = ( + message.text.split(None, 1)[1] + if len(message.command) > 1 + else "MissKaty Paste" + ) + data = reply.text.html.replace("\n", "
    ") or reply.caption.html.replace( + "\n", "
    " + ) + elif not reply and len(message.command) >= 2: + title = "MissKaty Paste" + data = message.text.split(None, 1)[1] + + try: + url = await post_to_telegraph(False, title, data) + except Exception as e: + return await msg.edit_msg(f"ERROR: {e}") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to Telegraph.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) + + +# Default Paste to Wastebin using Deta +@app.on_message(filters.command(["paste"], COMMAND_HANDLER)) +@ratelimiter +async def wastepaste(_, message): + reply = message.reply_to_message + target = str(message.command[0]).split("@", maxsplit=1)[0] + if not reply and len(message.command) < 2: + return await message.reply_msg( + f"**Reply To A Message With /{target} or with command**", del_in=6 + ) + + msg = await message.reply_msg("`Pasting to YasirBin...`") + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await msg.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await msg.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await msg.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + data = reply.text or reply.caption + elif not reply and len(message.command) >= 2: + data = message.text.split(None, 1)[1] + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username} [{message.from_user.id}]" + else: + uname = f"[{message.from_user.first_name}](tg://user?id={message.from_user.id}) [{message.from_user.id}]" + else: + uname = message.sender_chat.title + + try: + json_data = { + "content": data, + "highlighting_language": "auto", + "ephemeral": False, + "expire_at": 0, + "expire_in": 0, + } + response = await http.post("https://paste.yasir.eu.org/api/new", json=json_data) + url = f"https://paste.yasir.eu.org/{response.json()['id']}" + except Exception as e: + return await msg.edit_msg(f"ERROR: {e}") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to YasirBin.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) + + +# Nekobin Paste +@app.on_message(filters.command(["neko"], COMMAND_HANDLER)) +@ratelimiter +async def nekopaste(_, message): + reply = message.reply_to_message + target = str(message.command[0]).split("@", maxsplit=1)[0] + if not reply and len(message.command) < 2: + return await message.reply_msg( + f"**Reply To A Message With /{target} or with command**", del_in=6 + ) + + msg = await message.reply_msg("`Pasting to Nekobin...`") + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await message.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await message.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await message.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + data = reply.text.html or reply.caption.html + elif not reply and len(message.command) >= 2: + data = message.text.split(None, 1)[1] + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username}" + else: + uname = ( + f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})" + ) + else: + uname = message.sender_chat.title + + try: + x = ( + await http.post("https://nekobin.com/api/documents", json={"content": data}) + ).json() + url = f"https://nekobin.com/{x['result']['key']}" + except Exception as e: + return await msg.edit_msg(f"ERROR: {e}") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to Nekobin.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) + + +# Paste as spacebin +@app.on_message(filters.command(["sbin"], COMMAND_HANDLER)) +@ratelimiter +async def spacebinn(_, message): + reply = message.reply_to_message + target = str(message.command[0]).split("@", maxsplit=1)[0] + if not reply and len(message.command) < 2: + return await message.reply_msg( + f"**Reply To A Message With /{target} or with command**", del_in=6 + ) + + msg = await message.reply_msg("`Pasting to Spacebin...`") + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await msg.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await msg.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await msg.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + data = reply.text.html or reply.caption.html + elif not reply and len(message.command) >= 2: + data = message.text.split(None, 1)[1] + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username}" + else: + uname = ( + f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})" + ) + else: + uname = message.sender_chat.title + + try: + siteurl = "https://spaceb.in/api/v1/documents/" + response = await http.post(siteurl, data={"content": data, "extension": "txt"}) + response = response.json() + url = "https://spaceb.in/" + response["payload"]["id"] + except Exception as e: + return await msg.edit_msg(f"ERROR: {e}") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to Spacebin.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) + + +# Rentry paste +@app.on_message(filters.command(["rentry"], COMMAND_HANDLER)) +@ratelimiter +async def rentrypaste(_, message): + reply = message.reply_to_message + target = str(message.command[0]).split("@", maxsplit=1)[0] + if not reply and len(message.command) < 2: + return await message.reply_msg( + f"**Reply To A Message With /{target} or with command**", del_in=6 + ) + + msg = await message.reply_msg("`Pasting to Rentry...`") + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await msg.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await msg.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await msg.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + data = reply.text.markdown or reply.caption.markdown + elif not reply and len(message.command) >= 2: + data = message.text.split(None, 1)[1] + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username}" + else: + uname = ( + f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})" + ) + else: + uname = message.sender_chat.title + + try: + url = await rentry(data) + except Exception as e: + return await msg.edit(f"`{e}`") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to Rentry.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) + + +# Tempaste pastebin +@app.on_message(filters.command(["temp_paste"], COMMAND_HANDLER)) +@ratelimiter +async def tempaste(_, message): + reply = message.reply_to_message + target = str(message.command[0]).split("@", maxsplit=1)[0] + if not reply and len(message.command) < 2: + return await message.edit_msg( + f"**Reply To A Message With /{target} or with command**", del_in=6 + ) + + msg = await message.reply_msg("`Pasting to TempPaste...`") + data = "" + limit = 1024 * 1024 + if reply and reply.document: + if reply.document.file_size > limit: + return await msg.edit_msg( + f"**You can only paste files smaller than {humanbytes(limit)}.**" + ) + if not pattern.search(reply.document.mime_type): + return await msg.edit_msg("**Only text files can be pasted.**") + file = await reply.download() + try: + with open(file, "r") as text: + data = text.read() + remove(file) + except UnicodeDecodeError: + try: + remove(file) + except: + pass + return await msg.edit_msg("`File Not Supported !`") + elif reply and (reply.text or reply.caption): + data = reply.text.html or reply.caption.html + elif not reply and len(message.command) >= 2: + data = message.text.split(None, 1)[1] + + if message.from_user: + if message.from_user.username: + uname = f"@{message.from_user.username}" + else: + uname = ( + f"[{message.from_user.first_name}](tg://user?id={message.from_user.id})" + ) + else: + uname = message.sender_chat.title + + try: + req = await http.post( + "https://tempaste.com/api/v1/create-paste/", + data={ + "api_key": "xnwuzXubxk3kCUz9Q2pjMVR8xeTO4t", + "title": "MissKaty Paste", + "paste_content": data, + "visibility": "public", + "expiry_date_type": "months", + "expiry_date": 1, + }, + ) + url = f"https://tempaste.com/{json_loads(req.text)['url']}" + except Exception as e: + return await msg.edit_msg(f"`{e}`") + + if not url: + return await msg.edit_msg("Text Too Short Or File Problems") + button = [ + [InlineKeyboardButton("Open Link", url=url)], + [ + InlineKeyboardButton( + "Share Link", url=f"https://telegram.me/share/url?url={url}" + ) + ], + ] + + pasted = f"**Successfully pasted your data to Tempaste.\n\nPaste by {uname}**" + await msg.edit_msg(pasted, reply_markup=InlineKeyboardMarkup(button)) diff --git a/misskaty/plugins/ping.py b/misskaty/plugins/ping.py new file mode 100644 index 00000000..0282c30c --- /dev/null +++ b/misskaty/plugins/ping.py @@ -0,0 +1,66 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import platform +import time +from asyncio import Lock +from re import MULTILINE, findall +from subprocess import run as srun + +from pyrogram import __version__ as pyrover +from pyrogram import filters +from pyrogram.types import Message + +from misskaty import app, botStartTime, misskaty_version +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.human_read import get_readable_time +from misskaty.vars import COMMAND_HANDLER + + +@app.on_message(filters.command(["ping"], COMMAND_HANDLER)) +@ratelimiter +async def ping(_, ctx: Message): + currentTime = get_readable_time(time.time() - botStartTime) + start_t = time.time() + rm = await ctx.reply_msg("🐱 Pong!!...") + end_t = time.time() + time_taken_s = round(end_t - start_t, 3) + await rm.edit_msg( + f"🐈 MissKatyBot {misskaty_version} based Pyrogram {pyrover} Online.\n\nPing: {time_taken_s} detik\nUptime: {currentTime}\nPython Version: {platform.python_version()}" + ) + + +@app.on_message(filters.command(["ping_dc"], COMMAND_HANDLER)) +@ratelimiter +async def ping_handler(_, ctx: Message): + m = await ctx.reply_msg("Pinging datacenters...") + async with Lock(): + ips = { + "dc1": "149.154.175.53", + "dc2": "149.154.167.51", + "dc3": "149.154.175.100", + "dc4": "149.154.167.91", + "dc5": "91.108.56.130", + } + text = "**Pings:**\n" + + for dc, ip in ips.items(): + try: + shell = srun( + ["ping", "-c", "1", "-W", "2", ip], + text=True, + check=True, + capture_output=True, + ) + resp_time = findall(r"time=.+m?s", shell.stdout, MULTILINE)[0].replace( + "time=", "" + ) + + text += f" **{dc.upper()}:** {resp_time} ✅\n" + except Exception: + # There's a cross emoji here, but it's invisible. + text += f" **{dc.upper}:** ❌\n" + await m.edit_msg(text) diff --git a/misskaty/plugins/pypi_search.py b/misskaty/plugins/pypi_search.py new file mode 100644 index 00000000..5f731439 --- /dev/null +++ b/misskaty/plugins/pypi_search.py @@ -0,0 +1,157 @@ +""" + * @author yasir + * @date 2023-01-23 19:41:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +from pykeyboard import InlineButton, InlineKeyboard +from pyrogram import filters +from pyrogram.errors import QueryIdInvalid +from pyrogram.types import CallbackQuery, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import http, Cache +from misskaty.plugins.web_scraper import headers, split_arr +from misskaty.vars import COMMAND_HANDLER + +PYPI_DICT = Cache(filename="pypi_cache.db", path="cache", in_memory=False) + + +async def getDataPypi(msg, kueri, CurrentPage, user): + if not PYPI_DICT.get(msg.id): + pypijson = (await http.get(f"https://yasirapi.eu.org/pypi?q={kueri}")).json() + if not pypijson.get("result"): + await msg.edit_msg("Sorry could not find any matching results!", del_in=6) + return None, 0, None + PYPI_DICT.add(msg.id, [split_arr(pypijson["result"], 6), kueri], timeout=1600) + try: + index = int(CurrentPage - 1) + PageLen = len(PYPI_DICT[msg.id][0]) + extractbtn = [] + pypiResult = f"#Pypi Results For: {kueri}\n\n" + for c, i in enumerate(PYPI_DICT[msg.id][0][index], start=1): + pypiResult += f"{c}. {i['name']} {i['version']}\nCreated: {i['created']}\nDesc: {i['description']}\n\n" + extractbtn.append( + InlineButton(c, f"pypidata#{CurrentPage}#{c}#{user}#{msg.id}") + ) + pypiResult = "".join(i for i in pypiResult if i not in "[]") + return pypiResult, PageLen, extractbtn + except (IndexError, KeyError): + await msg.edit_msg("Sorry could not find any matching results!", del_in=6) + return None, 0, None + + +@app.on_message(filters.command(["pypi"], COMMAND_HANDLER)) +@ratelimiter +async def pypi_s(_, ctx: Message): + kueri = " ".join(ctx.command[1:]) + if not kueri: + return await ctx.reply_msg( + "Please add query after command. Ex: /pypi pyrogram", del_in=6 + ) + pesan = await ctx.reply_msg("⏳ Please wait, getting data from pypi..", quote=True) + CurrentPage = 1 + pypires, PageLen, btn = await getDataPypi( + pesan, kueri, CurrentPage, ctx.from_user.id + ) + if not pypires: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, CurrentPage, "page_pypi#{number}" + f"#{pesan.id}#{ctx.from_user.id}" + ) + keyboard.row(InlineButton("👇 Get Info ", "Hmmm")) + keyboard.row(*btn) + keyboard.row(InlineButton("❌ Close", f"close#{ctx.from_user.id}")) + await pesan.edit_msg(pypires, reply_markup=keyboard) + + +@app.on_callback_query(filters.create(lambda _, __, query: "page_pypi#" in query.data)) +@ratelimiter +async def pypipage_callback(_, callback_query: CallbackQuery): + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer("Not yours..", True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + kueri = PYPI_DICT[message_id][1] + except KeyError: + return await callback_query.answer( + "Invalid callback data, please send CMD again.." + ) + except QueryIdInvalid: + return + + try: + pypires, PageLen, btn = await getDataPypi( + callback_query.message, kueri, CurrentPage, callback_query.from_user.id + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_pypi#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton("👇 Extract Data ", "Hmmm")) + keyboard.row(*btn) + keyboard.row(InlineButton("❌ Close", f"close#{callback_query.from_user.id}")) + await callback_query.message.edit_msg(pypires, reply_markup=keyboard) + + +@app.on_callback_query(filters.create(lambda _, __, query: "pypidata#" in query.data)) +@ratelimiter +async def pypi_getdata(_, callback_query: CallbackQuery): + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer("Not yours..", True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + pkgname = PYPI_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("name") + except KeyError: + return await callback_query.answer( + "Invalid callback data, please send CMD again.." + ) + + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + "↩️ Back", + f"page_pypi#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton("❌ Close", f"close#{callback_query.from_user.id}"), + ) + try: + html = await http.get(f"https://pypi.org/pypi/{pkgname}/json", headers=headers) + res = html.json() + requirement = ( + "".join(f"{i}, " for i in res["info"].get("requires_dist")) + if res["info"].get("requires_dist") + else "Unknown" + ) + msg = "" + msg += f"Package Name: {res['info'].get('name', 'Unknown')}\n" + msg += f"Version: {res['info'].get('version', 'Unknown')}\n" + msg += f"License: {res['info'].get('license', 'Unknown')}\n" + msg += f"Author: {res['info'].get('author', 'Unknown')}\n" + msg += f"Author Email: {res['info'].get('author_email', 'Unknown')}\n" + msg += f"Requirements: {requirement}\n" + msg += ( + f"Requires Python: {res['info'].get('requires_python', 'Unknown')}\n" + ) + msg += f"HomePage: {res['info'].get('home_page', 'Unknown')}\n" + msg += f"Bug Track: {res['info'].get('vulnerabilities', 'Unknown')}\n" + if res["info"].get("project_urls"): + msg += f"Docs Url: {res['info']['project_urls'].get('Documentation', 'Unknown')}\n" + msg += f"Description: {res['info'].get('summary', 'Unknown')}\n" + msg += ( + f"Pip Command: pip3 install {res['info'].get('name', 'Unknown')}\n" + ) + msg += f"Keywords: {res['info'].get('keywords', 'Unknown')}\n" + await callback_query.message.edit_msg(msg, reply_markup=keyboard) + except Exception as err: + await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) diff --git a/misskaty/plugins/quotly.py b/misskaty/plugins/quotly.py new file mode 100644 index 00000000..ffd2c0ce --- /dev/null +++ b/misskaty/plugins/quotly.py @@ -0,0 +1,299 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +from io import BytesIO + +from pyrogram import Client, filters +from pyrogram.types import Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http + +__MODULE__ = "Fun" +__HELP__ = """ +/q [int] - Generate quotly from message +/memify [text] - Reply to sticker to give text on sticker. +""" + + +class QuotlyException(Exception): + pass + + +async def get_message_sender_id(ctx: Message): + if ctx.forward_date: + if ctx.forward_sender_name: + return 1 + elif ctx.forward_from: + return ctx.forward_from.id + elif ctx.forward_from_chat: + return ctx.forward_from_chat.id + else: + return 1 + elif ctx.from_user: + return ctx.from_user.id + elif ctx.sender_chat: + return ctx.sender_chat.id + else: + return 1 + + +async def get_message_sender_name(ctx: Message): + if ctx.forward_date: + if ctx.forward_sender_name: + return ctx.forward_sender_name + elif ctx.forward_from: + return ( + f"{ctx.forward_from.first_name} {ctx.forward_from.last_name}" + if ctx.forward_from.last_name + else ctx.forward_from.first_name + ) + + elif ctx.forward_from_chat: + return ctx.forward_from_chat.title + else: + return "" + elif ctx.from_user: + if ctx.from_user.last_name: + return f"{ctx.from_user.first_name} {ctx.from_user.last_name}" + else: + return ctx.from_user.first_name + elif ctx.sender_chat: + return ctx.sender_chat.title + else: + return "" + + +async def get_custom_emoji(ctx: Message): + if ctx.forward_date: + return ( + "" + if ctx.forward_sender_name + or not ctx.forward_from + and ctx.forward_from_chat + or not ctx.forward_from + else ctx.forward_from.emoji_status.custom_emoji_id + ) + + return ctx.from_user.emoji_status.custom_emoji_id if ctx.from_user else "" + + +async def get_message_sender_username(ctx: Message): + if ctx.forward_date: + if ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + and ctx.forward_from_chat.username + ): + return ctx.forward_from_chat.username + elif ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + or ctx.forward_sender_name + or not ctx.forward_from + ): + return "" + else: + return ctx.forward_from.username or "" + elif ctx.from_user and ctx.from_user.username: + return ctx.from_user.username + elif ( + ctx.from_user + or ctx.sender_chat + and not ctx.sender_chat.username + or not ctx.sender_chat + ): + return "" + else: + return ctx.sender_chat.username + + +async def get_message_sender_photo(ctx: Message): + if ctx.forward_date: + if ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + and ctx.forward_from_chat.photo + ): + return { + "small_file_id": ctx.forward_from_chat.photo.small_file_id, + "small_photo_unique_id": ctx.forward_from_chat.photo.small_photo_unique_id, + "big_file_id": ctx.forward_from_chat.photo.big_file_id, + "big_photo_unique_id": ctx.forward_from_chat.photo.big_photo_unique_id, + } + elif ( + not ctx.forward_sender_name + and not ctx.forward_from + and ctx.forward_from_chat + or ctx.forward_sender_name + or not ctx.forward_from + ): + return "" + else: + return ( + { + "small_file_id": ctx.forward_from.photo.small_file_id, + "small_photo_unique_id": ctx.forward_from.photo.small_photo_unique_id, + "big_file_id": ctx.forward_from.photo.big_file_id, + "big_photo_unique_id": ctx.forward_from.photo.big_photo_unique_id, + } + if ctx.forward_from.photo + else "" + ) + + elif ctx.from_user and ctx.from_user.photo: + return { + "small_file_id": ctx.from_user.photo.small_file_id, + "small_photo_unique_id": ctx.from_user.photo.small_photo_unique_id, + "big_file_id": ctx.from_user.photo.big_file_id, + "big_photo_unique_id": ctx.from_user.photo.big_photo_unique_id, + } + elif ( + ctx.from_user + or ctx.sender_chat + and not ctx.sender_chat.photo + or not ctx.sender_chat + ): + return "" + else: + return { + "small_file_id": ctx.sender_chat.photo.small_file_id, + "small_photo_unique_id": ctx.sender_chat.photo.small_photo_unique_id, + "big_file_id": ctx.sender_chat.photo.big_file_id, + "big_photo_unique_id": ctx.sender_chat.photo.big_photo_unique_id, + } + + +async def get_text_or_caption(ctx: Message): + if ctx.text: + return ctx.text + elif ctx.caption: + return ctx.caption + else: + return "" + + +async def pyrogram_to_quotly(messages, is_reply): + if not isinstance(messages, list): + messages = [messages] + payload = { + "type": "quote", + "format": "png", + "backgroundColor": "#1b1429", + "messages": [], + } + + for message in messages: + the_message_dict_to_append = {} + if message.entities: + the_message_dict_to_append["entities"] = [ + { + "type": entity.type.name.lower(), + "offset": entity.offset, + "length": entity.length, + } + for entity in message.entities + ] + elif message.caption_entities: + the_message_dict_to_append["entities"] = [ + { + "type": entity.type.name.lower(), + "offset": entity.offset, + "length": entity.length, + } + for entity in message.caption_entities + ] + else: + the_message_dict_to_append["entities"] = [] + the_message_dict_to_append["chatId"] = await get_message_sender_id(message) + the_message_dict_to_append["text"] = await get_text_or_caption(message) + the_message_dict_to_append["avatar"] = True + the_message_dict_to_append["from"] = {} + the_message_dict_to_append["from"]["id"] = await get_message_sender_id(message) + the_message_dict_to_append["from"]["name"] = await get_message_sender_name( + message + ) + the_message_dict_to_append["from"][ + "username" + ] = await get_message_sender_username(message) + the_message_dict_to_append["from"]["type"] = message.chat.type.name.lower() + the_message_dict_to_append["from"]["photo"] = await get_message_sender_photo( + message + ) + if message.reply_to_message and is_reply: + the_message_dict_to_append["replyMessage"] = { + "name": await get_message_sender_name(message.reply_to_message), + "text": await get_text_or_caption(message.reply_to_message), + "chatId": await get_message_sender_id(message.reply_to_message), + } + else: + the_message_dict_to_append["replyMessage"] = {} + payload["messages"].append(the_message_dict_to_append) + r = await http.post("https://bot.lyo.su/quote/generate.png", json=payload) + if not r.is_error: + return r.read() + else: + raise QuotlyException(r.json()) + + +def isArgInt(txt) -> list: + count = txt + try: + count = int(count) + return [True, count] + except ValueError: + return [False, 0] + + +@app.on_message(filters.command(["q", "qr"]) & filters.reply) +@ratelimiter +async def msg_quotly_cmd(self: Client, ctx: Message): + is_reply = False + if ctx.command[0][1] == "r": + is_reply = True + if len(ctx.text.split()) > 1: + check_arg = isArgInt(ctx.command[1]) + if check_arg[0]: + if check_arg[1] < 2 or check_arg[1] > 10: + return await ctx.reply_msg("Invalid range", del_in=6) + try: + messages = [ + i + for i in await self.get_messages( + chat_id=ctx.chat.id, + message_ids=range( + ctx.reply_to_message.id, + ctx.reply_to_message.id + (check_arg[1] + 5), + ), + replies=-1, + ) + if not i.empty and not i.media + ] + except Exception: + return await ctx.reply_text("🤷🏻‍♂️") + try: + make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) + bio_sticker = BytesIO(make_quotly) + bio_sticker.name = "biosticker.webp" + return await ctx.reply_sticker(bio_sticker) + except Exception: + return await ctx.reply_msg("🤷🏻‍♂️") + try: + messages_one = await self.get_messages( + chat_id=ctx.chat.id, message_ids=ctx.reply_to_message.id, replies=-1 + ) + messages = [messages_one] + except Exception: + return await ctx.reply_msg("🤷🏻‍♂️") + try: + make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) + bio_sticker = BytesIO(make_quotly) + bio_sticker.name = "misskatyquote_sticker.webp" + return await ctx.reply_sticker(bio_sticker) + except Exception as e: + return await ctx.reply_msg(f"ERROR: {e}") diff --git a/misskaty/plugins/sangmata.py b/misskaty/plugins/sangmata.py new file mode 100644 index 00000000..461ef5cb --- /dev/null +++ b/misskaty/plugins/sangmata.py @@ -0,0 +1,122 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +from pyrogram import filters +from pyrogram.types import Message + +from database.sangmata_db import ( + add_userdata, + cek_userdata, + get_userdata, + is_sangmata_on, + sangmata_off, + sangmata_on, +) +from misskaty import app +from misskaty.core.decorator.permissions import adminsOnly +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER + +__MODULE__ = "SangMata" +__HELP__ = """" +This feature inspired from SangMata Bot. I'm created simple detection to check user data include username, first_name, and last_name. +/sangmata_set [on/off] - Enable/disable sangmata in groups. +""" + + +# Check user that change first_name, last_name and usernaname +@app.on_message( + filters.group & ~filters.bot & ~filters.via_bot, + group=5, +) +@use_chat_lang() +async def cek_mataa(_, ctx: Message, strings): + if ctx.sender_chat or not await is_sangmata_on(ctx.chat.id): + return + if not await cek_userdata(ctx.from_user.id): + return await add_userdata( + ctx.from_user.id, + ctx.from_user.username, + ctx.from_user.first_name, + ctx.from_user.last_name, + ) + usernamebefore, first_name, lastname_before = await get_userdata(ctx.from_user.id) + msg = "" + if ( + usernamebefore != ctx.from_user.username + or first_name != ctx.from_user.first_name + or lastname_before != ctx.from_user.last_name + ): + msg += f"👀 Mata MissKaty\n\n🌞 User: {ctx.from_user.mention} [{ctx.from_user.id}]\n" + if usernamebefore != ctx.from_user.username: + usernamebefore = f"@{usernamebefore}" if usernamebefore else strings("no_uname") + usernameafter = ( + f"@{ctx.from_user.username}" + if ctx.from_user.username + else strings("no_uname") + ) + msg += strings("uname_change_msg").format(bef=usernamebefore, aft=usernameafter) + await add_userdata( + ctx.from_user.id, + ctx.from_user.username, + ctx.from_user.first_name, + ctx.from_user.last_name, + ) + if first_name != ctx.from_user.first_name: + msg += strings("firstname_change_msg").format( + bef=first_name, aft=ctx.from_user.first_name + ) + await add_userdata( + ctx.from_user.id, + ctx.from_user.username, + ctx.from_user.first_name, + ctx.from_user.last_name, + ) + if lastname_before != ctx.from_user.last_name: + lastname_before = lastname_before or strings("no_last_name") + lastname_after = ctx.from_user.last_name or strings("no_last_name") + msg += strings("lastname_change_msg").format( + bef=lastname_before, aft=lastname_after + ) + await add_userdata( + ctx.from_user.id, + ctx.from_user.username, + ctx.from_user.first_name, + ctx.from_user.last_name, + ) + if msg != "": + await ctx.reply_msg(msg, quote=True) + + +@app.on_message( + filters.group + & filters.command("sangmata_set", COMMAND_HANDLER) + & ~filters.bot + & ~filters.via_bot +) +@adminsOnly("can_change_info") +@ratelimiter +@use_chat_lang() +async def set_mataa(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg( + strings("set_sangmata_help").format(cmd=ctx.command[0]), del_in=6 + ) + if ctx.command[1] == "on": + cekset = await is_sangmata_on(ctx.chat.id) + if cekset: + await ctx.reply_msg(strings("sangmata_already_on")) + else: + await sangmata_on(ctx.chat.id) + await ctx.reply_msg(strings("sangmata_enabled")) + elif ctx.command[1] == "off": + cekset = await is_sangmata_on(ctx.chat.id) + if not cekset: + await ctx.reply_msg(strings("sangmata_already_off")) + else: + await sangmata_off(ctx.chat.id) + await ctx.reply_msg(strings("sangmata_disabled")) + else: + await ctx.reply_msg(strings("wrong_param"), del_in=6) diff --git a/misskaty/plugins/sed.py b/misskaty/plugins/sed.py new file mode 100644 index 00000000..e4d86ca9 --- /dev/null +++ b/misskaty/plugins/sed.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2018-2022 Amano Team + +import html + +import regex +from pyrogram import Client, filters +from pyrogram.errors import MessageEmpty +from pyrogram.types import Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter + + +@app.on_message(filters.regex(r"^s/(.+)?/(.+)?(/.+)?") & filters.reply) +@ratelimiter +async def sed(self: Client, ctx: Message): + exp = regex.split(r"(? 3 else "" + + rflags = 0 + + count = 0 if "g" in flags else 1 + if "i" in flags and "s" in flags: + rflags = regex.I | regex.S + elif "i" in flags: + rflags = regex.I + elif "s" in flags: + rflags = regex.S + + text = ctx.reply_to_message.text or ctx.reply_to_message.caption + + if not text: + return + + try: + res = regex.sub( + pattern, replace_with, text, count=count, flags=rflags, timeout=1 + ) + except TimeoutError: + return await ctx.reply_msg("Oops, your regex pattern has run for too long.") + except regex.error as e: + return await ctx.reply_msg(str(e)) + else: + try: + await self.send_msg( + ctx.chat.id, + f"
    {html.escape(res)}
    ", + reply_to_message_id=ctx.reply_to_message.id, + ) + except MessageEmpty: + return await ctx.reply_msg( + "Please reply message to use this feature.", del_in=5 + ) + except Exception as e: + return await ctx.reply_msg(f"ERROR: {str(e)}") diff --git a/misskaty/plugins/session_generator.py b/misskaty/plugins/session_generator.py new file mode 100644 index 00000000..aa71de97 --- /dev/null +++ b/misskaty/plugins/session_generator.py @@ -0,0 +1,278 @@ +import traceback +from logging import getLogger + +from pyrogram import Client, filters +from pyrogram.errors import ( + ApiIdInvalid, + PasswordHashInvalid, + PhoneCodeExpired, + PhoneCodeInvalid, + PhoneNumberInvalid, + SessionPasswordNeeded, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup +from telethon import TelegramClient +from telethon.errors import ( + ApiIdInvalidError, + PasswordHashInvalidError, + PhoneCodeExpiredError, + PhoneCodeInvalidError, + PhoneNumberInvalidError, + SessionPasswordNeededError, +) +from telethon.sessions import StringSession + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.misskaty_patch.listen.listen import ListenerTimeout +from misskaty.vars import API_HASH, API_ID, COMMAND_HANDLER + +LOGGER = getLogger(__name__) + +__MODULE__ = "SessionGen" +__HELP__ = """ +/genstring - Generate string session using this bot. Only support Pyrogram v2 and Telethon. +""" + + +ask_ques = "**» Please choose the library for which you want generate string :**\n\nNote: I'm not collecting any personal info from this feature, you can deploy own bot if you want." +buttons_ques = [ + [ + InlineKeyboardButton("Pyrogram", callback_data="pyrogram"), + InlineKeyboardButton("Telethon", callback_data="telethon"), + ], + [ + InlineKeyboardButton("Pyrogram Bot", callback_data="pyrogram_bot"), + InlineKeyboardButton("Telethon Bot", callback_data="telethon_bot"), + ], +] + +gen_button = [ + [InlineKeyboardButton(text="🙄 Generate Session 🙄", callback_data="genstring")] +] + + +async def is_batal(msg): + if msg.text == "/cancel": + await msg.reply( + "**» Cancelled the ongoing string session generation process !**", + quote=True, + reply_markup=InlineKeyboardMarkup(gen_button), + ) + return True + elif msg.text == "/skip": + return False + elif msg.text.startswith("/"): # Bot Commands + await msg.reply( + "**» Cancelled the ongoing string session generation process !**", + quote=True, + ) + return True + else: + return False + + +@app.on_callback_query( + filters.regex(pattern=r"^(genstring|pyrogram|pyrogram_bot|telethon_bot|telethon)$") +) +@ratelimiter +async def callbackgenstring(bot, callback_query): + query = callback_query.matches[0].group(1) + if query == "genstring": + await callback_query.answer() + await callback_query.message.reply( + ask_ques, reply_markup=InlineKeyboardMarkup(buttons_ques) + ) + elif query.startswith("pyrogram") or query.startswith("telethon"): + try: + if query == "pyrogram": + await callback_query.answer() + await generate_session(bot, callback_query.message) + elif query == "pyrogram_bot": + await callback_query.answer( + "» The session generator will be of Pyrogram v2.", show_alert=True + ) + await generate_session(bot, callback_query.message, is_bot=True) + elif query == "telethon_bot": + await callback_query.answer() + await generate_session( + bot, callback_query.message, telethon=True, is_bot=True + ) + elif query == "telethon": + await callback_query.answer() + await generate_session(bot, callback_query.message, telethon=True) + except Exception as e: + LOGGER.error(traceback.format_exc()) + ERROR_MESSAGE = ( + "Something went wrong. \n\n**ERROR** : {} " + "\n\n**Please forward this message to my Owner**, if this message " + "doesn't contain any sensitive data " + "because this error is **not logged by bot.** !" + ) + await callback_query.message.reply(ERROR_MESSAGE.format(str(e))) + + +@app.on_message( + filters.private & ~filters.forwarded & filters.command("genstring", COMMAND_HANDLER) +) +@ratelimiter +async def genstringg(_, msg): + await msg.reply(ask_ques, reply_markup=InlineKeyboardMarkup(buttons_ques)) + + +async def generate_session(bot, msg, telethon=False, is_bot: bool = False): + ty = "Telethon" if telethon else "Pyrogram" + if is_bot: + ty += " Bot" + await msg.reply(f"» Trying to start **{ty}** session generator...") + api_id_msg = await msg.chat.ask( + "Please send your **API_ID** to proceed.\n\nClick on /skip for using bot's api.", + filters=filters.text, + ) + if await is_batal(api_id_msg): + return + if api_id_msg.text == "/skip": + api_id = API_ID + api_hash = API_HASH + else: + try: + api_id = int(api_id_msg.text) + await api_id_msg.delete() + except ValueError: + return await api_id_msg.reply( + "**API_ID** must be integer, start generating your session again.", + quote=True, + reply_markup=InlineKeyboardMarkup(gen_button), + ) + api_hash_msg = await msg.chat.ask( + "» Now please send your **API_HASH** to continue.", filters=filters.text + ) + if await is_batal(api_hash_msg): + return + api_hash = api_hash_msg.text + await api_hash_msg.delete() + t = ( + "Please send your **BOT_TOKEN** to continue.\nExample : `5432198765:abcdanonymousterabaaplol`'" + if is_bot + else "» Please send your **PHONE_NUMBER** with country code for which you want generate session. \nᴇxᴀᴍᴩʟᴇ : `+6286356837789`'" + ) + phone_number_msg = await msg.chat.ask(t, filters=filters.text) + if await is_batal(phone_number_msg): + return + phone_number = phone_number_msg.text + await phone_number_msg.delete() + if not is_bot: + await msg.reply("» Trying to send OTP at the given number...") + else: + await msg.reply("» Trying to login using Bot Token...") + if telethon and is_bot or telethon: + client = TelegramClient(StringSession(), api_id, api_hash) + elif is_bot: + client = Client( + name="bot", + api_id=api_id, + api_hash=api_hash, + bot_token=phone_number, + in_memory=True, + ) + else: + client = Client(name="user", api_id=api_id, api_hash=api_hash, in_memory=True) + await client.connect() + try: + code = None + if not is_bot: + if telethon: + code = await client.send_code_request(phone_number) + else: + code = await client.send_code(phone_number) + except (ApiIdInvalid, ApiIdInvalidError): + return await msg.reply( + "» Your **API_ID** and **API_HASH** combination doesn't match. \n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + except (PhoneNumberInvalid, PhoneNumberInvalidError): + return await msg.reply( + "» The **PHONE_NUMBER** you've doesn't belong to any account in Telegram.\n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + try: + phone_code_msg = None + if not is_bot: + phone_code_msg = await msg.chat.ask( + "» Please send the **OTP** That you've received from Telegram on your account.\nIf OTP is `12345`, **please send it as** `1 2 3 4 5`.", + filters=filters.text, + timeout=600, + ) + if await is_batal(phone_code_msg): + return + except ListenerTimeout: + return await msg.reply( + "» Time limit reached of 10 minutes.\n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + if not is_bot: + phone_code = phone_code_msg.text.replace(" ", "") + await phone_code_msg.delete() + try: + if telethon: + await client.sign_in(phone_number, phone_code, password=None) + else: + await client.sign_in(phone_number, code.phone_code_hash, phone_code) + except (PhoneCodeInvalid, PhoneCodeInvalidError): + return await msg.reply( + "» The OTP you've sent is **wrong.**\n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + except (PhoneCodeExpired, PhoneCodeExpiredError): + return await msg.reply( + "» The OTP you've sent is **expired.**\n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + except (SessionPasswordNeeded, SessionPasswordNeededError): + try: + two_step_msg = await msg.chat.ask( + "» Please enter your **Two Step Verification** password to continue.", + filters=filters.text, + timeout=300, + ) + except ListenerTimeout: + return await msg.reply( + "» Time limit reached of 5 minutes.\n\nPlease start generating your session again.", + reply_markup=InlineKeyboardMarkup(gen_button), + ) + try: + password = two_step_msg.text + await two_step_msg.delete() + if telethon: + await client.sign_in(password=password) + else: + await client.check_password(password=password) + if await is_batal(api_id_msg): + return + except (PasswordHashInvalid, PasswordHashInvalidError): + return await two_step_msg.reply( + "» The password you've sent is wrong.\n\nPlease start generating session again.", + quote=True, + reply_markup=InlineKeyboardMarkup(gen_button), + ) + elif telethon: + await client.start(bot_token=phone_number) + else: + await client.sign_in_bot(phone_number) + if telethon: + string_session = client.session.save() + else: + string_session = await client.export_session_string() + text = f"**This is your {ty} String Session** \n\n`{string_session}` \n\n**Generated By :** @{bot.me.username}\n🍒 **Note :** Don't share it to anyone And don't forget to support this owner bot if you like🥺" + try: + if not is_bot: + await client.send_message("me", text) + else: + await bot.send_message(msg.chat.id, text) + except KeyError: + pass + await client.disconnect() + await bot.send_message( + msg.chat.id, + f'» Successfully generated your {"Telethon" if telethon else "Pyrogram"} String Session.\n\nPlease check saved messages to get it ! \n\n**A String Generator bot by ** @IAmCuteCodes', + ) diff --git a/misskaty/plugins/start_help.py b/misskaty/plugins/start_help.py new file mode 100644 index 00000000..9842d966 --- /dev/null +++ b/misskaty/plugins/start_help.py @@ -0,0 +1,259 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved + """ +import re + +from pyrogram import Client, filters +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from misskaty import BOT_NAME, BOT_USERNAME, HELPABLE, app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import bot_sys_stats, paginate_modules +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER + +home_keyboard_pm = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="Commands ❓", callback_data="bot_commands"), + InlineKeyboardButton( + text="Source Code 🛠", + url="https://github.com/yasirarism/MissKatyPyro", + ), + ], + [ + InlineKeyboardButton( + text="System Stats 🖥", + callback_data="stats_callback", + ), + InlineKeyboardButton(text="Dev 👨", url="https://t.me/YasirArisM"), + ], + [ + InlineKeyboardButton( + text="Add Me To Your Group 🎉", + url=f"http://t.me/{BOT_USERNAME}?startgroup=new", + ) + ], + ] +) + +home_text_pm = f"Hey there! My name is {BOT_NAME}. I have many useful features for you, feel free to add me to your group.\n\nIf you want give coffee to my owner you can send /donate command for more info." + +keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="Help ❓", url=f"t.me/{BOT_USERNAME}?start=help"), + InlineKeyboardButton( + text="Source Code �", + url="https://github.com/yasirarism/MissKatyPyro", + ), + ], + [ + InlineKeyboardButton( + text="System Stats 💻", + callback_data="stats_callback", + ), + InlineKeyboardButton(text="Dev 👨", url="https://t.me/YasirArisM"), + ], + ] +) + + +@app.on_message(filters.command("start", COMMAND_HANDLER)) +@use_chat_lang() +async def start(_, ctx: Message, strings): + if ctx.chat.type.value != "private": + nama = ctx.from_user.mention if ctx.from_user else ctx.sender_chat.title + return await ctx.reply_photo( + photo="https://telegra.ph/file/90e9a448bc2f8b055b762.jpg", + caption=strings("start_msg").format(kamuh=nama), + reply_markup=keyboard, + ) + if len(ctx.text.split()) > 1: + name = (ctx.text.split(None, 1)[1]).lower() + if "_" in name: + module = name.split("_", 1)[1] + text = ( + strings("help_name").format(mod=HELPABLE[module].__MODULE__) + + HELPABLE[module].__HELP__ + ) + await ctx.reply_msg(text, disable_web_page_preview=True) + elif name == "help": + text, keyb = await help_parser(ctx.from_user.first_name) + await ctx.reply_msg( + text, + reply_markup=keyb, + ) + else: + await ctx.reply_photo( + photo="https://telegra.ph/file/90e9a448bc2f8b055b762.jpg", + caption=home_text_pm, + reply_markup=home_keyboard_pm, + ) + + +@app.on_callback_query(filters.regex("bot_commands")) +@ratelimiter +async def commands_callbacc(_, cb: CallbackQuery): + text, keyb = await help_parser(cb.from_user.mention) + await app.send_message( + cb.message.chat.id, + text=text, + reply_markup=keyb, + ) + await cb.message.delete_msg() + + +@app.on_callback_query(filters.regex("stats_callback")) +@ratelimiter +async def stats_callbacc(_, cb: CallbackQuery): + text = await bot_sys_stats() + await app.answer_callback_query(cb.id, text, show_alert=True) + + +@app.on_message(filters.command("help", COMMAND_HANDLER)) +@ratelimiter +@use_chat_lang() +async def help_command(_, ctx: Message, strings): + if ctx.chat.type.value != "private": + if len(ctx.command) >= 2: + name = (ctx.text.split(None, 1)[1]).replace(" ", "_").lower() + if str(name) in HELPABLE: + key = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("click_me"), + url=f"t.me/{BOT_USERNAME}?start=help_{name}", + ) + ], + ] + ) + await ctx.reply_msg( + strings("click_btn").format(nm=name), + reply_markup=key, + ) + else: + await ctx.reply_msg(strings("pm_detail"), reply_markup=keyboard) + else: + await ctx.reply_msg(strings("pm_detail"), reply_markup=keyboard) + elif len(ctx.command) >= 2: + name = (ctx.text.split(None, 1)[1]).replace(" ", "_").lower() + if str(name) in HELPABLE: + text = ( + strings("help_name").format(mod=HELPABLE[name].__MODULE__) + + HELPABLE[name].__HELP__ + ) + await ctx.reply_msg(text, disable_web_page_preview=True) + else: + text, help_keyboard = await help_parser(ctx.from_user.first_name) + await ctx.reply_msg( + text, + reply_markup=help_keyboard, + disable_web_page_preview=True, + ) + else: + text, help_keyboard = await help_parser(ctx.from_user.first_name) + await ctx.reply_msg( + text, reply_markup=help_keyboard, disable_web_page_preview=True + ) + + +async def help_parser(name, keyb=None): + if not keyb: + keyb = InlineKeyboardMarkup(paginate_modules(0, HELPABLE, "help")) + return ( + """Hello {first_name}, My name is {bot_name}. +I'm a bot with some useful features. You can change language bot using /setlang command, but it's still in beta stage. +You can choose an option below, by clicking a button. + +If you want give coffee to my owner you can send /donate command for more info. +""".format( + first_name=name, + bot_name="MissKaty", + ), + keyb, + ) + + +@app.on_callback_query(filters.regex(r"help_(.*?)")) +@ratelimiter +@use_chat_lang() +async def help_button(self: Client, query: CallbackQuery, strings): + home_match = re.match(r"help_home\((.+?)\)", query.data) + mod_match = re.match(r"help_module\((.+?)\)", query.data) + prev_match = re.match(r"help_prev\((.+?)\)", query.data) + next_match = re.match(r"help_next\((.+?)\)", query.data) + back_match = re.match(r"help_back", query.data) + create_match = re.match(r"help_create", query.data) + top_text = strings("help_txt").format( + kamuh=query.from_user.first_name, bot=self.me.first_name + ) + if mod_match: + module = mod_match[1].replace(" ", "_") + text = ( + strings("help_name").format(mod=HELPABLE[module].__MODULE__) + + HELPABLE[module].__HELP__ + ) + + await query.message.edit_msg( + text=text, + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(strings("back_btn"), callback_data="help_back")]] + ), + disable_web_page_preview=True, + ) + elif home_match: + await app.send_msg( + query.from_user.id, + text=home_text_pm, + reply_markup=home_keyboard_pm, + ) + await query.message.delete_msg() + elif prev_match: + curr_page = int(prev_match[1]) + await query.message.edit_msg( + text=top_text, + reply_markup=InlineKeyboardMarkup( + paginate_modules(curr_page - 1, HELPABLE, "help") + ), + disable_web_page_preview=True, + ) + + elif next_match: + next_page = int(next_match[1]) + await query.message.edit_msg( + text=top_text, + reply_markup=InlineKeyboardMarkup( + paginate_modules(next_page + 1, HELPABLE, "help") + ), + disable_web_page_preview=True, + ) + + elif back_match: + await query.message.edit_msg( + text=top_text, + reply_markup=InlineKeyboardMarkup(paginate_modules(0, HELPABLE, "help")), + disable_web_page_preview=True, + ) + + elif create_match: + text, keyb = await help_parser(query) + await query.message.edit_msg( + text=text, + reply_markup=keyb, + disable_web_page_preview=True, + ) + + try: + await self.answer_callback_query(query.id) + except: + pass diff --git a/misskaty/plugins/stickers.py b/misskaty/plugins/stickers.py new file mode 100644 index 00000000..b8a49ee0 --- /dev/null +++ b/misskaty/plugins/stickers.py @@ -0,0 +1,412 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import asyncio +import os +import re +import shutil +import tempfile + +from PIL import Image +from pyrogram import Client, emoji, enums, filters +from pyrogram.errors import BadRequest, PeerIdInvalid, StickersetInvalid +from pyrogram.file_id import FileId +from pyrogram.raw.functions.messages import GetStickerSet, SendMedia +from pyrogram.raw.functions.stickers import ( + AddStickerToSet, + CreateStickerSet, + RemoveStickerFromSet, +) +from pyrogram.raw.types import ( + DocumentAttributeFilename, + InputDocument, + InputMediaUploadedDocument, + InputStickerSetItem, + InputStickerSetShortName, +) +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL + +__MODULE__ = "Stickers" +__HELP__ = """ +/kang [Reply to sticker] - Add sticker to your pack. +/unkang [Reply to sticker] - Remove sticker from your pack (Only can remove sticker that added by this bot.). +/getsticker - Convert sticker to png. +/stickerid - View sticker ID +""" + + +def get_emoji_regex(): + e_list = [ + getattr(emoji, e).encode("unicode-escape").decode("ASCII") + for e in dir(emoji) + if not e.startswith("_") + ] + # to avoid re.error excluding char that start with '*' + e_sort = sorted([x for x in e_list if not x.startswith("*")], reverse=True) + # Sort emojis by length to make sure multi-character emojis are + # matched first + pattern_ = f"({'|'.join(e_sort)})" + return re.compile(pattern_) + + +EMOJI_PATTERN = get_emoji_regex() +SUPPORTED_TYPES = ["jpeg", "png", "webp"] + + +@app.on_cmd("getsticker") +@ratelimiter +@use_chat_lang() +async def getsticker_(self: Client, ctx: Message, strings): + if not ctx.reply_to_message or ctx.reply_to_message.sticker: + await ctx.reply_msg(strings("not_sticker")) + else: + sticker = ctx.reply_to_message.sticker + if sticker.is_animated: + await ctx.reply_msg(strings("no_anim_stick")) + else: + with tempfile.TemporaryDirectory() as tempdir: + path = os.path.join(tempdir, "getsticker") + sticker_file = await self.download_media( + message=ctx.reply_to_message, + file_name=f"{path}/{sticker.set_name}.png", + ) + await ctx.reply_to_message.reply_document( + document=sticker_file, + caption=f"Emoji: {sticker.emoji}\n" + f"Sticker ID: {sticker.file_id}\n\n" + f"Send by: @{self.me.username}", + ) + shutil.rmtree(tempdir, ignore_errors=True) + + +@app.on_message(filters.command("stickerid", COMMAND_HANDLER) & filters.reply) +@ratelimiter +async def getstickerid(_, ctx: Message): + if ctx.reply_to_message.sticker: + await ctx.reply_msg( + "The ID of this sticker is: {stickerid}".format( + stickerid=ctx.reply_to_message.sticker.file_id + ) + ) + + +@app.on_message(filters.command("unkang", COMMAND_HANDLER) & filters.reply) +@ratelimiter +@use_chat_lang() +async def unkangs(self: Client, ctx: Message, strings): + if not ctx.from_user: + return await ctx.reply("You're anon, unkang in my PM") + if sticker := ctx.reply_to_message.sticker: + if str(ctx.from_user.id) not in sticker.set_name: + return await ctx.reply_msg("This sticker is not your pack, don't do it..") + pp = await ctx.reply_msg(strings("unkang_msg")) + try: + decoded = FileId.decode(sticker.file_id) + sticker = InputDocument( + id=decoded.media_id, + access_hash=decoded.access_hash, + file_reference=decoded.file_reference, + ) + await app.invoke(RemoveStickerFromSet(sticker=sticker)) + await pp.edit_msg(strings("unkang_success")) + except Exception as e: + await pp.edit_msg(strings("unkang_error").format(e=e)) + else: + await ctx.reply_msg(strings("unkang_help").format(c=self.me.username), del_in=6) + + +@app.on_cmd(["curi", "kang"]) +@ratelimiter +@use_chat_lang() +async def kang_sticker(self: Client, ctx: Message, strings): + if not ctx.from_user: + return await ctx.reply_msg(strings("anon_warn"), del_in=6) + prog_msg = await ctx.reply_msg(strings("kang_msg")) + sticker_emoji = "🤔" + packnum = 0 + packname_found = False + resize = False + animated = False + videos = False + convert = False + reply = ctx.reply_to_message + user = await self.resolve_peer(ctx.from_user.username or ctx.from_user.id) + + if reply and reply.media: + if reply.photo: + resize = True + elif reply.animation: + videos = True + convert = True + elif reply.video: + convert = True + videos = True + elif reply.document: + if "image" in reply.document.mime_type: + # mime_type: image/webp + resize = True + elif reply.document.mime_type in ( + enums.MessageMediaType.VIDEO, + enums.MessageMediaType.ANIMATION, + ): + # mime_type: application/video + videos = True + convert = True + elif "tgsticker" in reply.document.mime_type: + # mime_type: application/x-tgsticker + animated = True + elif reply.sticker: + if not reply.sticker.file_name: + return await prog_msg.edit_msg(strings("stick_no_name")) + if reply.sticker.emoji: + sticker_emoji = reply.sticker.emoji + animated = reply.sticker.is_animated + videos = reply.sticker.is_video + if videos: + convert = False + elif not reply.sticker.file_name.endswith(".tgs"): + resize = True + else: + return await prog_msg.edit_msg() + + pack_prefix = "anim" if animated else "vid" if videos else "a" + packname = f"{pack_prefix}_{ctx.from_user.id}_by_{self.me.username}" + + if ( + len(ctx.command) > 1 + and ctx.command[1].isdigit() + and int(ctx.command[1]) > 0 + ): + # provide pack number to kang in desired pack + packnum = ctx.command.pop(1) + packname = ( + f"{pack_prefix}{packnum}_{ctx.from_user.id}_by_{self.me.username}" + ) + if len(ctx.command) > 1: + # matches all valid emojis in input + sticker_emoji = ( + "".join(set(EMOJI_PATTERN.findall("".join(ctx.command[1:])))) + or sticker_emoji + ) + filename = await self.download_media(ctx.reply_to_message) + if not filename: + # Failed to download + await prog_msg.delete() + return + elif ctx.entities and len(ctx.entities) > 1: + pack_prefix = "a" + filename = "sticker.png" + packname = f"c{ctx.from_user.id}_by_{self.me.username}" + img_url = next( + ( + ctx.text[y.offset : (y.offset + y.length)] + for y in ctx.entities + if y.type == "url" + ), + None, + ) + + if not img_url: + await prog_msg.delete() + return + try: + r = await http.get(img_url) + if r.status_code == 200: + with open(filename, mode="wb") as f: + f.write(r.read()) + except Exception as r_e: + return await prog_msg.edit_msg(f"{r_e.__class__.__name__} : {r_e}") + if len(ctx.command) > 2: + # m.command[1] is image_url + if ctx.command[2].isdigit() and int(ctx.command[2]) > 0: + packnum = ctx.command.pop(2) + packname = f"a{packnum}_{ctx.from_user.id}_by_{self.me.username}" + if len(ctx.command) > 2: + sticker_emoji = ( + "".join(set(EMOJI_PATTERN.findall("".join(ctx.command[2:])))) + or sticker_emoji + ) + resize = True + else: + return await prog_msg.edit_msg(strings("kang_help")) + try: + if resize: + filename = resize_image(filename) + elif convert: + filename = await convert_video(filename) + if filename is False: + return await prog_msg.edit_msg("Error", del_in=6) + max_stickers = 50 if animated else 120 + while not packname_found: + try: + stickerset = await self.invoke( + GetStickerSet( + stickerset=InputStickerSetShortName(short_name=packname), + hash=0, + ) + ) + if stickerset.set.count >= max_stickers: + packnum += 1 + packname = f"{pack_prefix}_{packnum}_{ctx.from_user.id}_by_{self.me.username}" + else: + packname_found = True + except StickersetInvalid: + break + file = await self.save_file(filename) + media = await self.invoke( + SendMedia( + peer=(await self.resolve_peer(LOG_CHANNEL)), + media=InputMediaUploadedDocument( + file=file, + mime_type=self.guess_mime_type(filename), + attributes=[DocumentAttributeFilename(file_name=filename)], + ), + message=f"#Sticker kang by UserID -> {ctx.from_user.id}", + random_id=self.rnd_id(), + ), + ) + msg_ = media.updates[-1].message + stkr_file = msg_.media.document + if packname_found: + await prog_msg.edit_msg(strings("exist_pack")) + await self.invoke( + AddStickerToSet( + stickerset=InputStickerSetShortName(short_name=packname), + sticker=InputStickerSetItem( + document=InputDocument( + id=stkr_file.id, + access_hash=stkr_file.access_hash, + file_reference=stkr_file.file_reference, + ), + emoji=sticker_emoji, + ), + ) + ) + else: + await prog_msg.edit_msg(strings("new_packs")) + stkr_title = f"{ctx.from_user.first_name}'s" + if animated: + stkr_title += "AnimPack" + elif videos: + stkr_title += "VidPack" + if packnum != 0: + stkr_title += f" v{packnum}" + try: + await self.invoke( + CreateStickerSet( + user_id=user, + title=stkr_title, + short_name=packname, + stickers=[ + InputStickerSetItem( + document=InputDocument( + id=stkr_file.id, + access_hash=stkr_file.access_hash, + file_reference=stkr_file.file_reference, + ), + emoji=sticker_emoji, + ) + ], + animated=animated, + videos=videos, + ) + ) + except PeerIdInvalid: + return await prog_msg.edit_msg( + strings("please_start_msg"), + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + strings("click_me"), + url=f"https://t.me/{self.me.username}?start", + ) + ] + ] + ), + ) + + except BadRequest: + return await prog_msg.edit_msg(strings("pack_full")) + except Exception as all_e: + await prog_msg.edit_msg(f"{all_e.__class__.__name__} : {all_e}") + else: + markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text=strings("viewpack"), + url=f"https://t.me/addstickers/{packname}", + ) + ] + ] + ) + await prog_msg.edit_msg( + strings("kang_success").format(emot=sticker_emoji), + reply_markup=markup, + ) + # Cleanup + await self.delete_messages( + chat_id=LOG_CHANNEL, message_ids=msg_.id, revoke=True + ) + try: + os.remove(filename) + except OSError: + pass + + +def resize_image(filename: str) -> str: + im = Image.open(filename) + maxsize = 512 + scale = maxsize / max(im.width, im.height) + sizenew = (int(im.width * scale), int(im.height * scale)) + im = im.resize(sizenew, Image.NEAREST) + downpath, f_name = os.path.split(filename) + # not hardcoding png_image as "sticker.png" + png_image = os.path.join(downpath, f"{f_name.split('.', 1)[0]}.png") + im.save(png_image, "PNG") + if png_image != filename: + os.remove(filename) + return png_image + + +async def convert_video(filename: str) -> str: + downpath, f_name = os.path.split(filename) + webm_video = os.path.join(downpath, f"{f_name.split('.', 1)[0]}.webm") + cmd = [ + "ffmpeg", + "-loglevel", + "quiet", + "-i", + filename, + "-t", + "00:00:03", + "-vf", + "fps=30", + "-c:v", + "vp9", + "-b:v:", + "500k", + "-preset", + "ultrafast", + "-s", + "512x512", + "-y", + "-an", + webm_video, + ] + + proc = await asyncio.create_subprocess_exec(*cmd) + # Wait for the subprocess to finish + await proc.communicate() + + if webm_video != filename: + os.remove(filename) + return webm_video diff --git a/misskaty/plugins/subscene_dl.py b/misskaty/plugins/subscene_dl.py new file mode 100644 index 00000000..bce9602e --- /dev/null +++ b/misskaty/plugins/subscene_dl.py @@ -0,0 +1,252 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import asyncio +import logging +import os + +import cloudscraper +from bs4 import BeautifulSoup +from pykeyboard import InlineButton, InlineKeyboard +from pyrogram import filters +from pyrogram.types import CallbackQuery, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.subscene_helper import down_page +from misskaty.vars import COMMAND_HANDLER + +from .web_scraper import split_arr + +LOGGER = logging.getLogger(__name__) +SUB_TITLE_DICT = {} +SUB_DL_DICT = {} + + +# Get list title based on query +async def getTitleSub(msg, kueri, CurrentPage, user): + if not SUB_TITLE_DICT.get(msg.id): + sdata = [] + scraper = cloudscraper.create_scraper() + param = {"query": kueri} + r = scraper.post( + "https://subscene.com/subtitles/searchbytitle", data=param + ).text + soup = BeautifulSoup(r, "lxml") + lists = soup.find("div", {"class": "search-result"}) + entry = lists.find_all("div", {"class": "title"}) + # if "Tidak Ditemukan" in entry[0].text: + # await msg.edit_msg(f"Sorry, could not find any result for: {kueri}") + # return None, 0, None + for sub in entry: + title = sub.find("a").text + link = f"https://subscene.com{sub.find('a').get('href')}" + sdata.append({"title": title, "link": link}) + SUB_TITLE_DICT[msg.id] = [split_arr(sdata, 10), kueri] + try: + index = int(CurrentPage - 1) + PageLen = len(SUB_TITLE_DICT[msg.id][0]) + extractbtn1 = [] + extractbtn2 = [] + subResult = f"#Subscene Results For: {kueri}\n\n" + for c, i in enumerate(SUB_TITLE_DICT[msg.id][0][index], start=1): + subResult += f"{c}. {i['title']}\n" + if c < 6: + extractbtn1.append( + InlineButton(c, f"sublist#{CurrentPage}#{c}#{msg.id}#{user}") + ) + else: + extractbtn2.append( + InlineButton(c, f"sublist#{CurrentPage}#{c}#{msg.id}#{user}") + ) + subResult = "".join(i for i in subResult if i not in "[]") + return subResult, PageLen, extractbtn1, extractbtn2 + except (IndexError, KeyError): + await msg.edit_msg("Sorry could not find any matching results!", del_in=5) + return None, 0, None + + +# Get list all subtitles from title +async def getListSub(msg, link, CurrentPage, user): + if not SUB_DL_DICT.get(msg.id): + sdata = [] + scraper = cloudscraper.create_scraper() + kuki = { + "LanguageFilter": "13,44,50" + } # Only filter language English, Malay, Indonesian + r = scraper.get(link, cookies=kuki).text + soup = BeautifulSoup(r, "lxml") + for i in soup.findAll(class_="a1"): + lang = i.find("a").findAll("span")[0].text.strip() + title = i.find("a").findAll("span")[1].text.strip() + if i.find(class_="l r neutral-icon"): + rate = "😐" + elif i.find(class_="l r positive-icon"): + rate = "🥰" + else: + rate = "☹️" + dllink = f"https://subscene.com{i.find('a').get('href')}" + sdata.append({"title": title, "lang": lang, "rate": rate, "link": dllink}) + SUB_DL_DICT[msg.id] = [split_arr(sdata, 10), link] + try: + index = int(CurrentPage - 1) + PageLen = len(SUB_DL_DICT[msg.id][0]) + extractbtn1 = [] + extractbtn2 = [] + subResult = f"#Subscene Results For: {link}\n\n" + for c, i in enumerate(SUB_DL_DICT[msg.id][0][index], start=1): + subResult += f"{c}. {i['title']} [{i['rate']}]\n{i['lang']}\n" + if c < 6: + extractbtn1.append( + InlineButton(c, f"extractsubs#{CurrentPage}#{c}#{msg.id}#{user}") + ) + else: + extractbtn2.append( + InlineButton(c, f"extractsubs#{CurrentPage}#{c}#{msg.id}#{user}") + ) + subResult = "".join(i for i in subResult if i not in "[]") + return subResult, PageLen, extractbtn1, extractbtn2 + except (IndexError, KeyError): + await msg.edit_msg("Sorry could not find any matching results!") + return None, 0, None + + +# Subscene CMD +@app.on_message(filters.command(["subscene"], COMMAND_HANDLER)) +@ratelimiter +async def subscene_cmd(_, ctx: Message): + if not ctx.input: + return await ctx.reply_msg( + f"ℹ️ Please add query after CMD!\nEx: /{ctx.command[0]} Jurassic World" + ) + pesan = await ctx.reply_msg( + "⏳ Please wait, getting data from subscene..", quote=True + ) + CurrentPage = 1 + subres, PageLen, btn1, btn2 = await getTitleSub( + pesan, ctx.input, CurrentPage, ctx.from_user.id + ) + if not subres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "subscenepage#{number}" + f"#{pesan.id}#{ctx.from_user.id}", + ) + keyboard.row(InlineButton("👇 Extract Data ", "Hmmm")) + keyboard.row(*btn1) + if btn2: + keyboard.row(*btn2) + keyboard.row(InlineButton("❌ Close", f"close#{ctx.from_user.id}")) + await pesan.edit_msg(subres, disable_web_page_preview=True, reply_markup=keyboard) + + +# Callback list title +@app.on_callback_query( + filters.create(lambda _, __, query: "subscenepage#" in query.data) +) +@ratelimiter +async def subpage_callback(_, callback_query: CallbackQuery): + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer("Not yours..", True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + kueri = SUB_TITLE_DICT[message_id][1] + except KeyError: + await callback_query.answer("Invalid callback data, please send CMD again..") + await asyncio.sleep(3) + return await callback_query.message.delete_msg() + + try: + subres, PageLen, btn1, btn2 = await getTitleSub( + callback_query.message, kueri, CurrentPage, callback_query.from_user.id + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "subscenepage#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton("👇 Get Subtitle List", "Hmmm")) + keyboard.row(*btn1) + if btn2: + keyboard.row(*btn2) + keyboard.row(InlineButton("❌ Close", f"close#{callback_query.from_user.id}")) + await callback_query.message.edit_msg( + subres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Callback list title +@app.on_callback_query(filters.create(lambda _, __, query: "sublist#" in query.data)) +@ratelimiter +async def subdlpage_callback(_, callback_query: CallbackQuery): + if callback_query.from_user.id != int(callback_query.data.split("#")[4]): + return await callback_query.answer("Not yours..", True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[3]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + link = SUB_TITLE_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except KeyError: + await callback_query.answer("Invalid callback data, please send CMD again..") + await asyncio.sleep(3) + return await callback_query.message.delete_msg() + + try: + subres, PageLen, btn1, btn2 = await getListSub( + callback_query.message, link, CurrentPage, callback_query.from_user.id + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "sublist#{number}" + f"#{idlink}#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton("👇 Download Subtitle", "Hmmm")) + keyboard.row(*btn1) + if btn2: + keyboard.row(*btn2) + keyboard.row(InlineButton("❌ Close", f"close#{callback_query.from_user.id}")) + await callback_query.message.edit_msg( + subres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Callback dl subtitle +@app.on_callback_query( + filters.create(lambda _, __, query: "extractsubs#" in query.data) +) +@ratelimiter +async def dlsub_callback(_, callback_query: CallbackQuery): + if callback_query.from_user.id != int(callback_query.data.split("#")[4]): + return await callback_query.answer("Not yours..", True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[3]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + link = SUB_DL_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + title = SUB_DL_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("title") + except KeyError: + await callback_query.answer("Invalid callback data, please send CMD again..") + await asyncio.sleep(3) + return await callback_query.message.delete_msg() + scraper = cloudscraper.create_scraper() + res = await down_page(link) + dl = scraper.get(res.get("download_url")) + with open(f"{title}.zip", mode="wb") as f: + f.write(dl.content) + await callback_query.message.reply_document( + f"{title}.zip", + caption=f"Title: {res.get('title')}\nIMDb: {res['imdb']}\nAuthor: {res['author_name']}\nRelease Info: ", + ) + os.remove(f"{title}.zip") diff --git a/misskaty/plugins/tes_session.py b/misskaty/plugins/tes_session.py new file mode 100644 index 00000000..de1b9760 --- /dev/null +++ b/misskaty/plugins/tes_session.py @@ -0,0 +1,15 @@ +# This plugin to learn session using pyrogram +from pyrogram.types import Message + +from misskaty import app + + +@app.on_cmd("session") +async def session(_, ctx: Message): + nama = await ctx.chat.ask("Ketik nama kamu:") + umur = await ctx.chat.ask("Ketik umur kamu") + alamat = await ctx.chat.ask("Ketik alamat kamu:") + await app.send_msg( + ctx.chat.id, + f"Nama Kamu Adalah: {nama.text}\nUmur Kamu Adalah: {umur.text}\nAlamat Kamu Adalah: {alamat.text}", + ) diff --git a/misskaty/plugins/ubot_plugin.py b/misskaty/plugins/ubot_plugin.py new file mode 100644 index 00000000..6c169d86 --- /dev/null +++ b/misskaty/plugins/ubot_plugin.py @@ -0,0 +1,189 @@ +""" + * @author yasir + * @date 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +# Code in this plugin to learn basic userbot in pyrogram +import os +from datetime import datetime + +from pyrogram import enums, filters +from pyrogram.raw import functions +from pyrogram.types import ( + ChatEventFilter, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from misskaty import app, user + +f = filters.chat([]) + + +@user.on_message(f) +async def auto_read(_, message: Message): + await user.read_history(message.chat.id) + await message.continue_propagation() + + +@user.on_message(filters.command("autoscroll", "!") & filters.me) +async def add_keep(_, message: Message): + if message.chat.id in f: + f.remove(message.chat.id) + await message.edit("Autoscroll dimatikan") + else: + f.add(message.chat.id) + await message.edit("Autoscroll diaktifkan, semua chat akan otomatis terbaca") + + +@user.on_deleted_messages(filters.chat([-1001455886928, -1001255283935])) +async def del_msg(_, message): + async for a in user.get_chat_event_log( + message[0].chat.id, limit=1, filters=ChatEventFilter(deleted_messages=True) + ): + try: + ustat = ( + await user.get_chat_member( + message[0].chat.id, a.deleted_message.from_user.id + ) + ).status + except: + ustat = enums.ChatMemberStatus.MEMBER + if ( + ustat + in [enums.ChatMemberStatus.ADMINISTRATOR, enums.ChatMemberStatus.OWNER] + or a.deleted_message.from_user.is_bot + ): + return + if a.user.id == a.deleted_message.from_user.id: + if a.deleted_message.text: + await app.send_message( + a.deleted_message.chat.id, + f"#DELETED_MESSAGE\n\n{a.deleted_message.from_user.first_name} menghapus pesannya 🧐.\nPesan: {a.deleted_message.text}", + ) + elif a.deleted_message.video: + await app.send_message( + a.deleted_message.chat.id, + f"#DELETED_MESSAGE\n\n{a.deleted_message.from_user.first_name} menghapus pesannya 🧐.\nNama file: {a.deleted_message.video.file_name}", + ) + + +@user.on_edited_message(filters.text & filters.chat(-1001455886928)) +async def edit_msg(_, message): + try: + ustat = ( + await user.get_chat_member(message.chat.id, message.from_user.id) + ).status + except: + ustat = enums.ChatMemberStatus.MEMBER + if message.from_user.is_bot or ustat in [ + enums.ChatMemberStatus.ADMINISTRATOR, + enums.ChatMemberStatus.OWNER, + ]: + return + async for a in user.get_chat_event_log( + message.chat.id, limit=1, filters=ChatEventFilter(edited_messages=True) + ): + if a.old_message.text.startswith( + ("/mirror", "/leech", "/unzipmirror", "/unzipleech") + ): + await app.send_message( + message.chat.id, + f"#EDITED_MESSAGE\n\n{a.user.first_name} mengedit pesannya 🧐.\nPesan: {a.old_message.text}", + ) + + +@user.on_message(filters.private & ~filters.bot & ~filters.me & filters.text) +async def message_pm(_, message): + await app.send_message( + 617426792, + f"Ada pesan baru dari {message.from_user.mention}\n\nPesan: {message.text}", + ) + + +@user.on_message(~filters.bot & filters.group & filters.mentioned) +async def mentioned(_, message): + if message.sender_chat: + return + cid = message.chat.id + pesan = message.text or message.caption + await app.send_message( + 617426792, + f"{message.from_user.mention} mention kamu di {message.chat.title}\n\nPesan: {pesan}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="💬 Lihat Pesan", + url=f"https://t.me/c/{str(cid)[4:]}/{message.id}", + ) + ] + ] + ), + ) + + +@user.on_message(filters.command("joindate", "!") & filters.me) +async def join_date(self, message: Message): + members = [] + async for m in self.iter_chat_members(message.chat.id): + members.append( + ( + m.user.first_name, + m.joined_date or (await self.get_messages(message.chat.id, 1)).date, + ) + ) + members.sort(key=lambda member: member[1]) + + with open("joined_date.txt", "w", encoding="utf8") as fj: + fj.write("Join Date First Name\n") + for member in members: + fj.write( + str(datetime.fromtimestamp(member[1]).strftime("%y-%m-%d %H:%M")) + + f" {member[0]}\n" + ) + + await user.send_document(message.chat.id, "joined_date.txt") + os.remove("joined_date.txt") + + +@user.on_message(filters.command("memberstats", "!") & filters.me) +async def memberstats(_, message): + people = {} + total = await user.get_chat_members_count(message.chat.id) + async for msg in user.iter_history(message.chat.id, limit=1000): + if msg.from_user and not msg.from_user.is_bot: + people[msg.from_user.id] = msg.from_user.first_name + await message.edit(f"{round(len(people) / total)}%") + + +@user.on_message(filters.command("recent_action", "!") & filters.me) +async def recent_act(_, message): + full_log = await user.invoke( + functions.channels.GetAdminLog( + channel=await user.resolve_peer(message.chat.id), + q="", + max_id=0, + min_id=0, + limit=0, + ) + ) + with open( + f"recent_actions_{message.chat.id}.txt", "w", encoding="utf8" + ) as log_file: + log_file.write(str(full_log)) + await message.reply_document(f"recent_actions_{message.chat.id}.txt") + + +@user.on_message(filters.command(["screenshot"], prefixes="!")) +async def take_a_screenshot(_, message): + await message.delete() + await user.invoke( + functions.messages.SendScreenshotNotification( + peer=await user.resolve_peer(message.chat.id), + reply_to_msg_id=0, + random_id=app.rnd_id(), + ) + ) diff --git a/misskaty/plugins/urban_dict.py b/misskaty/plugins/urban_dict.py new file mode 100644 index 00000000..5442871e --- /dev/null +++ b/misskaty/plugins/urban_dict.py @@ -0,0 +1,78 @@ +from pykeyboard import InlineKeyboard +from pyrogram.types import CallbackQuery, Message + +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.http import http + + +async def getData(chat_id, message_id, GetWord, CurrentPage): + UDJson = ( + await http.get(f"https://api.urbandictionary.com/v0/define?term={GetWord}") + ).json() + + if "list" not in UDJson: + return await app.send_msg( + chat_id=chat_id, + reply_to_message_id=message_id, + text=f"Word: {GetWord}\nResults: Sorry could not find any matching results!", + del_in=5, + ) + try: + index = int(CurrentPage - 1) + PageLen = len(UDJson["list"]) + UDReasult = ( + f"**Definition of {GetWord}**\n" + f"{UDJson['list'][index]['definition']}\n\n" + "**📌 Examples**\n" + f"__{UDJson['list'][index]['example']}__" + ) + UDFReasult = "".join(i for i in UDReasult if i not in "[]") + return (UDFReasult, PageLen) + + except (IndexError, KeyError): + await app.send_msg( + chat_id=chat_id, + reply_to_message_id=message_id, + text=f"Word: {GetWord}\nResults: Sorry could not find any matching results!", + del_in=5, + ) + + +@app.on_cmd("ud", no_channel=True) +@ratelimiter +async def urbanDictionary(_, ctx: Message): + message_id = ctx.id + chat_id = ctx.chat.id + GetWord = " ".join(ctx.command[1:]) + if not GetWord: + message = await ctx.chat.ask("Now give any word for query!") + GetWord = message.text + + CurrentPage = 1 + try: + UDReasult, PageLen = await getData(chat_id, message_id, GetWord, CurrentPage) + except: + return await ctx.reply_msg("😭 Failed getting info from urban dictionary.") + + keyboard = InlineKeyboard() + keyboard.paginate(PageLen, CurrentPage, "pagination_urban#{number}" + f"#{GetWord}") + await ctx.reply_msg(text=f"{UDReasult}", reply_markup=keyboard) + + +@app.on_cb("pagination_urban#") +@ratelimiter +async def ud_callback(_, callback_query: CallbackQuery): + message_id = callback_query.message.id + chat_id = callback_query.message.chat.id + CurrentPage = int(callback_query.data.split("#")[1]) + GetWord = callback_query.data.split("#")[2] + + try: + UDReasult, PageLen = await getData(chat_id, message_id, GetWord, CurrentPage) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate(PageLen, CurrentPage, "pagination_urban#{number}" + f"#{GetWord}") + await callback_query.message.edit_msg(text=UDReasult, reply_markup=keyboard) diff --git a/misskaty/plugins/web_scraper.py b/misskaty/plugins/web_scraper.py new file mode 100644 index 00000000..8684a285 --- /dev/null +++ b/misskaty/plugins/web_scraper.py @@ -0,0 +1,1429 @@ +""" + * @author yasir + * @created 2022-12-01 09:12:27 + * @projectName MissKatyPyro + * Copyright @YasirPedia All rights reserved +""" +import logging +import re +import traceback + +import cloudscraper +from bs4 import BeautifulSoup +from pykeyboard import InlineButton, InlineKeyboard +from pyrogram.errors import QueryIdInvalid +from pyrogram.types import Message + +from database import dbname +from misskaty import app +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper import Cache, http +from misskaty.helper.kuso_utils import Kusonime +from misskaty.helper.localization import use_chat_lang + +__MODULE__ = "WebScraper" +__HELP__ = """ +/melongmovie [query ] - Scrape website data from MelongMovie Web. +/lk21 [query ] - Scrape website data from LayarKaca21. +/pahe [query ] - Scrape website data from Pahe.li. +/terbit21 [query ] - Scrape website data from Terbit21. +/savefilm21 [query ] - Scrape website data from Savefilm21. +/movieku [query ] - Scrape website data from Movieku.cc +/kusonime [query ] - Scrape website data from Kusonime +/lendrive [query ] - Scrape website data from Lendrive +/gomov [query ] - Scrape website data from GoMov. +/samehadaku [query ] - Scrape website data from Samehadaku. +""" + +headers = { + "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582" +} + +LOGGER = logging.getLogger(__name__) +SCRAP_DICT = Cache(filename="scraper_cache.db", path="cache", in_memory=False) +data_kuso = Cache(filename="kuso_cache.db", path="cache", in_memory=False) +webdb = dbname["web"] + +web = { + "yasirapi": "https://yasirapi.eu.org", + "pahe": "https://pahe.li", + "savefilm21": "https://savefilm21.skin", + "melongmovie": "https://melongmovie.site", + "terbit21": "https://terbit21.gold", + "lk21": "https://tv1.lk21official.pro", + "gomov": "https://gomov.bio", + "movieku": "https://107.152.37.223", + "kusonime": "https://kusonime.com", + "lendrive": "https://lendrive.web.id", + "samehadaku": "https://samehadaku.bio", + "oplovers": "https://oploverz.top", +} + + +def split_arr(arr, size: 5): + arrs = [] + while len(arr) > size: + pice = arr[:size] + arrs.append(pice) + arr = arr[size:] + arrs.append(arr) + return arrs + + +# Terbit21 GetData +async def getDataTerbit21(msg, kueri, CurrentPage, strings): + if not SCRAP_DICT.get(msg.id): + try: + terbitjson = ( + (await http.get(f"{web['yasirapi']}/terbit21?q={kueri}")).json() + if kueri + else (await http.get("https://yasirapi.eu.org/terbit21")).json() + ) + except: + await msg.edit_msg(strings("err_getapi")) + return None, None + if not terbitjson.get("result"): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + SCRAP_DICT.add( + msg.id, [split_arr(terbitjson["result"], 6), kueri], timeout=1800 + ) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + + if kueri: + TerbitRes = strings("header_with_query").format(web="Terbit21", kueri=kueri) + else: + TerbitRes = strings("header_no_query").format( + web="Terbit21", cmd="terbit21" + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + TerbitRes += f"{index*6+c}. {i['judul']}\n{strings('cat_text')}: {i['kategori']}\n" + TerbitRes += ( + "\n" + if re.search(r"Complete|Ongoing", i["kategori"]) + else f"{strings('dl_text')}\n\n" + ) + TerbitRes = "".join(i for i in TerbitRes if i not in "[]") + return TerbitRes, PageLen + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + + +# LK21 GetData +async def getDatalk21(msg, kueri, CurrentPage, strings): + if not SCRAP_DICT.get(msg.id): + try: + lk21json = ( + (await http.get(f"{web['yasirapi']}/lk21?q={kueri}")).json() + if kueri + else (await http.get("https://yasirapi.eu.org/lk21")).json() + ) + except: + await msg.edit_msg(strings("err_getapi")) + return None, None + if not lk21json.get("result"): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + SCRAP_DICT.add(msg.id, [split_arr(lk21json["result"], 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + + if kueri: + lkResult = strings("header_with_query").format( + web="Layarkaca21", kueri=kueri + ) + else: + lkResult = strings("header_no_query").format(web="Layarkaca21", cmd="lk21") + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + lkResult += f"{index*6+c}. {i['judul']}\n{strings('cat_text')}: {i['kategori']}\n" + lkResult += ( + "\n" + if re.search(r"Complete|Ongoing", i["kategori"]) + else f"{strings('dl_text')}\n\n" + ) + lkResult = "".join(i for i in lkResult if i not in "[]") + return lkResult, PageLen + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + + +# Pahe GetData +async def getDataPahe(msg, kueri, CurrentPage, strings): + if not SCRAP_DICT.get(msg.id): + try: + pahejson = (await http.get(f"{web['yasirapi']}/pahe?q={kueri}")).json() + except: + await msg.edit_msg(strings("err_getapi")) + return None, None + if not pahejson.get("result"): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + SCRAP_DICT.add(msg.id, [split_arr(pahejson["result"], 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + + paheResult = ( + strings("header_with_query").format(web="Pahe", kueri=kueri) + if kueri + else strings("header_no_query").format(web="Pahe", cmd="pahe") + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + paheResult += ( + f"{index*6+c}. {i['judul']}\n\n" + ) + paheResult = "".join(i for i in paheResult if i not in "[]") + return paheResult, PageLen + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + + +# Kusonime GetData +async def getDataKuso(msg, kueri, CurrentPage, user, strings): + if not SCRAP_DICT.get(msg.id): + kusodata = [] + try: + data = await http.get( + f"{web['kusonime']}/?s={kueri}", headers=headers, follow_redirects=True + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, None + res = BeautifulSoup(data, "lxml").find_all("h2", {"class": "episodeye"}) + for i in res: + ress = i.find_all("a")[0] + title = ress.text + link = ress["href"] + kusodata.append({"title": title, "link": link}) + if not kusodata: + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None, None + SCRAP_DICT.add(msg.id, [split_arr(kusodata, 10), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + extractbtn1 = [] + extractbtn2 = [] + + kusoResult = ( + strings("header_no_query").format(web="Kusonime", cmd="kusonime") + if kueri == "" + else strings("header_with_query").format(web="Kusonime", kueri=kueri) + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + kusoResult += f"{index*6+c}. {i['title']}\n{i['link']}\n\n" + if c < 6: + extractbtn1.append( + InlineButton( + index * 6 + c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + else: + extractbtn2.append( + InlineButton( + index * 6 + c, f"kusoextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + kusoResult = "".join(i for i in kusoResult if i not in "[]") + return kusoResult, PageLen, extractbtn1, extractbtn2 + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None, None + + +# Movieku GetData +async def getDataMovieku(msg, kueri, CurrentPage, strings): + if not SCRAP_DICT.get(msg.id): + moviekudata = [] + try: + data = await http.get( + f"{web['movieku']}/?s={kueri}", headers=headers, follow_redirects=True + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, None + r = BeautifulSoup(data, "lxml") + res = r.find_all(class_="bx") + for i in res: + judul = i.find_all("a")[0]["title"] + link = i.find_all("a")[0]["href"] + typ = i.find(class_="overlay").text + typee = typ.strip() if typ.strip() != "" else "~" + moviekudata.append({"judul": judul, "link": link, "type": typee}) + if not moviekudata: + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + SCRAP_DICT.add(msg.id, [split_arr(moviekudata, 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + + moviekuResult = ( + strings("header_no_query").format(web="Movieku", cmd="movieku") + if kueri == "" + else strings("header_with_query").format(web="Movieku", kueri=kueri) + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + moviekuResult += f"{index*6+c}. {i['judul']}\n{strings('quality')}/Status: {i['type']}\nExtract: /movieku_scrap {i['link']}\n\n" + moviekuResult = "".join(i for i in moviekuResult if i not in "[]") + return moviekuResult, PageLen + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + + +# Savefilm21 GetData +async def getDataSavefilm21(msg, kueri, CurrentPage, user, strings): + if not SCRAP_DICT.get(msg.id): + sfdata = [] + try: + data = await http.get( + f"{web['savefilm21']}/?s={kueri}", + headers=headers, + follow_redirects=True, + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, 0, None + text = BeautifulSoup(data, "lxml") + entry = text.find_all(class_="entry-header") + if "Tidak Ditemukan" in entry[0].text: + if not kueri: + await msg.edit_msg(strings("no_result"), del_in=5) + else: + await msg.edit_msg( + strings("no_result_w_query").format(kueri=kueri), del_in=5 + ) + return None, 0, None + for i in entry: + genre = i.find(class_="gmr-movie-on").text + genre = f"{genre}" if genre != "" else "N/A" + judul = i.find(class_="entry-title").find("a").text + link = i.find(class_="entry-title").find("a").get("href") + sfdata.append({"judul": judul, "link": link, "genre": genre}) + SCRAP_DICT.add(msg.id, [split_arr(sfdata, 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + extractbtn = [] + sfResult = ( + strings("header_no_query").format(web="Savefilm21", cmd="savefilm21") + if kueri == "" + else strings("header_with_query").format(web="Savefilm21", kueri=kueri) + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + sfResult += f"{index*6+c}. {i['judul']}\nGenre: {i['genre']}\n\n" + extractbtn.append( + InlineButton( + index * 6 + c, f"sf21extract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + sfResult = "".join(i for i in sfResult if i not in "[]") + return sfResult, PageLen, extractbtn + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + + +# Lendrive GetData +async def getDataLendrive(msg, kueri, CurrentPage, user, strings): + if not SCRAP_DICT.get(msg.id): + try: + data = await http.get( + f"{web['lendrive']}/?s={kueri}", headers=headers, follow_redirects=True + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, None + soup = BeautifulSoup(data, "lxml") + lenddata = [] + for o in soup.find_all(class_="bsx"): + title = o.find("a")["title"] + link = o.find("a")["href"] + status = o.find(class_="epx").text + kualitas = ( + o.find(class_="typez TV").text + if o.find(class_="typez TV") + else o.find(class_="typez BD") + ) + lenddata.append( + {"judul": title, "link": link, "quality": kualitas, "status": status} + ) + if not lenddata: + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + SCRAP_DICT.add(msg.id, [split_arr(lenddata, 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + extractbtn = [] + + lenddataResult = ( + strings("header_no_query").format(web="Lendrive", cmd="lendrive") + if kueri == "" + else strings("header_with_query").format(web="Lendrive", kueri=kueri) + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + lenddataResult += f"{index*6+c}. {i['judul']}\n{strings('quality')}: {i['quality']}\nStatus: {i['status']}\n\n" + extractbtn.append( + InlineButton( + index * 6 + c, f"lendriveextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + lenddataResult = "".join(i for i in lenddataResult if i not in "[]") + return lenddataResult, PageLen, extractbtn + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + + +# MelongMovie GetData +async def getDataMelong(msg, kueri, CurrentPage, user, strings): + if not SCRAP_DICT.get(msg.id): + try: + data = await http.get( + f"{web['melongmovie']}/?s={kueri}", + headers=headers, + follow_redirects=True, + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, 0, None + bs4 = BeautifulSoup(data, "lxml") + melongdata = [] + for res in bs4.select(".box"): + dd = res.select("a") + url = dd[0]["href"] + title = dd[0]["title"] + try: + quality = dd[0].find(class_="quality").text + except: + quality = "N/A" + melongdata.append({"judul": title, "link": url, "quality": quality}) + if not melongdata: + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + SCRAP_DICT.add(msg.id, [split_arr(melongdata, 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + extractbtn = [] + + melongResult = ( + strings("header_no_query").format(web="Melongmovie", cmd="melongmovie") + if kueri == "" + else strings("header_with_query").format(web="Melongmovie", kueri=kueri) + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + melongResult += f"{index*6+c}. {i['judul']}\n{strings('quality')}: {i['quality']}\n\n" + extractbtn.append( + InlineButton( + index * 6 + c, f"melongextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + melongResult = "".join(i for i in melongResult if i not in "[]") + return melongResult, PageLen, extractbtn + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + + +# GoMov GetData +async def getDataGomov(msg, kueri, CurrentPage, user, strings): + if not SCRAP_DICT.get(msg.id): + try: + gomovv = await http.get( + f"{web['gomov']}/?s={kueri}", headers=headers, follow_redirects=True + ) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, None + text = BeautifulSoup(gomovv, "lxml") + entry = text.find_all(class_="entry-header") + if entry[0].text.strip() == "Nothing Found": + if not kueri: + await msg.edit_msg(strings("no_result"), del_in=5) + else: + await msg.edit_msg( + strings("no_result_w_query").format(kueri=kueri), del_in=5 + ) + return None, 0, None + data = [] + for i in entry: + genre = i.find(class_="gmr-movie-on").text + genre = f"{genre}" if genre != "" else "N/A" + judul = i.find(class_="entry-title").find("a").text + link = i.find(class_="entry-title").find("a").get("href") + data.append({"judul": judul, "link": link, "genre": genre}) + SCRAP_DICT.add(msg.id, [split_arr(data, 6), kueri], timeout=1800) + try: + index = int(CurrentPage - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + extractbtn = [] + + gomovResult = ( + strings("header_with_query").format(web="GoMov", kueri=kueri) + if kueri + else strings("header_no_query").format(web="GoMov", cmd="gomov") + ) + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1): + gomovResult += f"{index*6+c}. {i['judul']}\nGenre: {i['genre']}\n\n" + if not re.search(r"Series", i["genre"]): + extractbtn.append( + InlineButton( + index * 6 + c, f"gomovextract#{CurrentPage}#{c}#{user}#{msg.id}" + ) + ) + gomovResult += strings("unsupport_dl_btn") + gomovResult = "".join(i for i in gomovResult if i not in "[]") + return gomovResult, PageLen, extractbtn + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, 0, None + + +# getData samehada +async def getSame(msg, query, current_page, strings): + if not SCRAP_DICT.get(msg.id): + cfse = cloudscraper.create_scraper() + try: + if query: + data = cfse.get(f"{web['samehadaku']}/?s={query}", headers=headers) + else: + data = cfse.get(web["samehadaku"], headers=headers) + except Exception as err: + await msg.edit_msg(strings("err_getweb").format(err=err)) + return None, None + res = BeautifulSoup(data.text, "lxml").find_all(class_="animposx") + sdata = [] + for i in res: + url = i.find("a")["href"] + title = i.find("a")["title"] + sta = ( + i.find(class_="type TV").text if i.find(class_="type TV") else "Ongoing" + ) + rate = i.find(class_="score") + sdata.append({"url": url, "title": title, "sta": sta, "rate": rate}) + if not sdata: + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + SCRAP_DICT.add(msg.id, [split_arr(sdata, 10), query], timeout=1800) + try: + index = int(current_page - 1) + PageLen = len(SCRAP_DICT[msg.id][0]) + sameresult = "".join( + f"{index * 6 + c}. {i['title']}\nStatus: {i['sta']}\nRating:
    {i['rate']}\n\n" + for c, i in enumerate(SCRAP_DICT[msg.id][0][index], start=1) + ) + sameresult = "".join(i for i in sameresult if i not in "[]") + return sameresult, PageLen + except (IndexError, KeyError): + await msg.edit_msg(strings("no_result"), del_in=5) + return None, None + + +# SameHada CMD +@app.on_cmd("samehadaku", no_channel=True) +@ratelimiter +@use_chat_lang() +async def same_search(_, msg, strings): + query = msg.text.split(" ", 1)[1] if len(msg.command) > 1 else None + bmsg = await msg.reply_msg(strings("get_data"), quote=True) + sameres, PageLen = await getSame(bmsg, query, 1, strings) + if not sameres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, 1, "page_same#{number}" + f"#{bmsg.id}#{msg.from_user.id}" + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{msg.from_user.id}")) + await bmsg.edit_msg(sameres, disable_web_page_preview=True, reply_markup=keyboard) + + +# Terbit21 CMD +@app.on_cmd("terbit21", no_channel=True) +@ratelimiter +@use_chat_lang() +async def terbit21_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = None + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + terbitres, PageLen = await getDataTerbit21(pesan, kueri, CurrentPage, strings) + if not terbitres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_terbit21#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg( + terbitres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# LK21 CMD +@app.on_cmd("lk21", no_channel=True) +@ratelimiter +@use_chat_lang() +async def lk21_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = None + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + lkres, PageLen = await getDatalk21(pesan, kueri, CurrentPage, strings) + if not lkres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_lk21#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg(lkres, disable_web_page_preview=True, reply_markup=keyboard) + + +# Pahe CMD +@app.on_cmd("pahe", no_channel=True) +@ratelimiter +@use_chat_lang() +async def pahe_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = "" + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + paheres, PageLen = await getDataPahe(pesan, kueri, CurrentPage, strings) + if not paheres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_pahe#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg(paheres, disable_web_page_preview=True, reply_markup=keyboard) + + +# Gomov CMD +@app.on_cmd("gomov", no_channel=True) +@ratelimiter +@use_chat_lang() +async def gomov_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = "" + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + gomovres, PageLen, btn = await getDataGomov( + pesan, kueri, CurrentPage, message.from_user.id, strings + ) + if not gomovres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_gomov#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=message.from_user.id)) + keyboard.row(*btn) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg(gomovres, disable_web_page_preview=True, reply_markup=keyboard) + + +# MelongMovie CMD +@app.on_cmd("melongmovie", no_channel=True) +@ratelimiter +@use_chat_lang() +async def melong_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = "" + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + melongres, PageLen, btn = await getDataMelong( + pesan, kueri, CurrentPage, message.from_user.id, strings + ) + if not melongres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_melong#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=message.from_user.id)) + keyboard.row(*btn) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + try: + await pesan.edit_msg( + melongres, disable_web_page_preview=True, reply_markup=keyboard + ) + except Exception as err: + await pesan.edit_msg( + f"ERROR: {err}", disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Savefilm21 CMD +@app.on_cmd("savefilm21", no_channel=True) +@ratelimiter +@use_chat_lang() +async def savefilm_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = "" + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + savefilmres, PageLen, btn = await getDataSavefilm21( + pesan, kueri, CurrentPage, message.from_user.id, strings + ) + if not savefilmres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_sf21#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=message.from_user.id)) + keyboard.row(*btn) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg( + savefilmres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Kusonime CMD +@app.on_cmd("kusonime", no_channel=True) +@ratelimiter +@use_chat_lang() +async def kusonime_s(_, message, strings): + kueri = " ".join(message.command[1:]) + if not kueri: + kueri = "" + pesan = await message.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + kusores, PageLen, btn1, btn2 = await getDataKuso( + pesan, kueri, CurrentPage, message.from_user.id, strings + ) + if not kusores: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_kuso#{number}" + f"#{pesan.id}#{message.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=message.from_user.id)) + keyboard.row(*btn1) + if btn2: + keyboard.row(*btn2) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{message.from_user.id}")) + await pesan.edit_msg(kusores, disable_web_page_preview=True, reply_markup=keyboard) + + +# Lendrive CMD +@app.on_cmd("lendrive", no_channel=True) +@ratelimiter +@use_chat_lang() +async def lendrive_s(_, ctx: Message, strings): + kueri = ctx.input + if not kueri: + kueri = "" + pesan = await ctx.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + lendres, PageLen, btn = await getDataLendrive( + pesan, kueri, CurrentPage, ctx.from_user.id, strings + ) + if not lendres: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_lendrive#{number}" + f"#{pesan.id}#{ctx.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=ctx.from_user.id)) + keyboard.row(*btn) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{ctx.from_user.id}")) + await pesan.edit_msg(lendres, disable_web_page_preview=True, reply_markup=keyboard) + + +# Movieku CMD +@app.on_cmd("movieku", no_channel=True) +@ratelimiter +@use_chat_lang() +async def movieku_s(_, ctx: Message, strings): + kueri = ctx.input + if not kueri: + kueri = "" + pesan = await ctx.reply_msg(strings("get_data"), quote=True) + CurrentPage = 1 + moviekures, PageLen = await getDataMovieku(pesan, kueri, CurrentPage, strings) + if not moviekures: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_movieku#{number}" + f"#{pesan.id}#{ctx.from_user.id}", + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{ctx.from_user.id}")) + await pesan.edit_msg( + moviekures, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Savefillm21 Page Callback +@app.on_cb("page_sf21#") +@ratelimiter +@use_chat_lang() +async def sf21page_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except (IndexError, ValueError): # Gatau napa err ini + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + except QueryIdInvalid: + return + + try: + savefilmres, PageLen, btn = await getDataSavefilm21( + callback_query.message, + kueri, + CurrentPage, + callback_query.from_user.id, + strings, + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_sf21#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=callback_query.from_user.id)) + keyboard.row(*btn) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + savefilmres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Kuso Page Callback +@app.on_cb("page_kuso#") +@ratelimiter +@use_chat_lang() +async def kusopage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + kusores, PageLen, btn1, btn2 = await getDataKuso( + callback_query.message, + kueri, + CurrentPage, + callback_query.from_user.id, + strings, + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_kuso#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=callback_query.from_user.id)) + keyboard.row(*btn1) + if btn2: + keyboard.row(*btn2) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + kusores, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Lendrive Page Callback +@app.on_cb("page_lendrive#") +@ratelimiter +@use_chat_lang() +async def lendrivepage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + lendres, PageLen, btn = await getDataLendrive( + callback_query.message, + kueri, + CurrentPage, + callback_query.from_user.id, + strings, + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_lendrive#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=callback_query.from_user.id)) + keyboard.row(*btn) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + lendres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Movieku Page Callback +@app.on_cb("page_movieku#") +@ratelimiter +@use_chat_lang() +async def moviekupage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb"), True) + + try: + moviekures, PageLen = await getDataMovieku( + callback_query.message, kueri, CurrentPage, strings + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_movieku#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + moviekures, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Samehada Page Callback +@app.on_cb("page_same#") +@ratelimiter +@use_chat_lang() +async def samepg(_, query, strings): + try: + _, current_page, _id, user_id = query.data.split("#") + if int(user_id) != query.from_user.id: + return await query.answer(strings("unauth"), True) + lquery = SCRAP_DICT[int(_id)][1] + except QueryIdInvalid: + return + except KeyError: + return await query.message.edit_msg(strings("invalid_cb")) + try: + sameres, PageLen = await getSame( + query.message, lquery, int(current_page), strings + ) + except TypeError: + return + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + int(current_page), + "page_same#{number}" + f"#{_id}#{query.from_user.id}", + ) + keyboard.row(InlineButton(strings("cl_btn"), f"close#{query.from_user.id}")) + await query.message.edit_msg( + sameres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Terbit21 Page Callback +@app.on_cb("page_terbit21#") +@ratelimiter +@use_chat_lang() +async def terbit21page_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + terbitres, PageLen = await getDataTerbit21( + callback_query.message, kueri, CurrentPage, strings + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_terbit21#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + terbitres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Page Callback Melong +@app.on_cb("page_melong#") +@ratelimiter +@use_chat_lang() +async def melongpage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + terbitres, PageLen, btn = await getDataMelong( + callback_query.message, + kueri, + CurrentPage, + callback_query.from_user.id, + strings, + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_melong#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=callback_query.from_user.id)) + keyboard.row(*btn) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + terbitres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Lk21 Page Callback +@app.on_cb("page_lk21#") +@ratelimiter +@use_chat_lang() +async def lk21page_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + lkres, PageLen = await getDatalk21( + callback_query.message, kueri, CurrentPage, strings + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_lk21#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + lkres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Pahe Page Callback +@app.on_cb("page_pahe#") +@ratelimiter +@use_chat_lang() +async def pahepage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + lkres, PageLen = await getDataPahe( + callback_query.message, kueri, CurrentPage, strings + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_pahe#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + lkres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +# Gomov Page Callback +@app.on_cb("page_gomov#") +@ratelimiter +@use_chat_lang() +async def gomovpage_callback(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + kueri = SCRAP_DICT[message_id][1] + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + try: + gomovres, PageLen, btn = await getDataGomov( + callback_query.message, + kueri, + CurrentPage, + callback_query.from_user.id, + strings, + ) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate( + PageLen, + CurrentPage, + "page_gomov#{number}" + f"#{message_id}#{callback_query.from_user.id}", + ) + keyboard.row(InlineButton(strings("ex_data"), user_id=callback_query.from_user.id)) + keyboard.row(*btn) + keyboard.row( + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}") + ) + await callback_query.message.edit_msg( + gomovres, disable_web_page_preview=True, reply_markup=keyboard + ) + + +### Scrape DDL Link From Web ### +# Kusonime DDL +@app.on_cb("kusoextract#") +@ratelimiter +@use_chat_lang() +async def kusonime_scrap(client, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + link = SCRAP_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + kuso = Kusonime() + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + strings("back_btn"), + f"page_kuso#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}"), + ) + try: + init_url = data_kuso.get(link, None) + if init_url is not None: + ph = init_url.get("ph_url") + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=ph), + reply_markup=keyboard, + disable_web_page_preview=False, + ) + tgh = await kuso.telegraph(link, client.me.username) + if tgh["error"]: + return await callback_query.message.edit_msg( + f"ERROR: {tgh['error_message']}", reply_markup=keyboard + ) + except Exception: + err = traceback.format_exc() + return await callback_query.message.edit_msg( + f"ERROR: {err}", reply_markup=keyboard + ) + data_kuso[link] = {"ph_url": tgh["url"]} + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=tgh["url"]), + reply_markup=keyboard, + disable_web_page_preview=False, + ) + + +# Savefilm21 DDL +@app.on_cb("sf21extract#") +@ratelimiter +@use_chat_lang() +async def savefilm21_scrap(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + link = SCRAP_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + strings("back_btn"), + f"page_sf21#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}"), + ) + try: + html = await http.get(link, headers=headers) + soup = BeautifulSoup(html.text, "lxml") + res = soup.find_all(class_="button button-shadow") + res = "".join(f"{i.text}\n{i['href']}\n\n" for i in res) + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=res), reply_markup=keyboard + ) + except Exception as err: + await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) + + +# Scrape Link Download Movieku.CC +@app.on_cmd("movieku_scrap#") +@ratelimiter +@use_chat_lang() +async def muviku_scrap(_, message, strings): + try: + link = message.text.split(" ", maxsplit=1)[1] + html = await http.get(link, headers=headers) + soup = BeautifulSoup(html.text, "lxml") + res = soup.find_all(class_="smokeurl") + data = [] + for i in res: + for b in range(len(i.find_all("a"))): + link = i.find_all("a")[b]["href"] + kualitas = i.find_all("a")[b].text + # print(f"{kualitas}\n{link + data.append({"link": link, "kualitas": kualitas}) + if not data: + return await message.reply(strings("no_result")) + res = "".join(f"Host: {i['kualitas']}\n{i['link']}\n\n" for i in data) + await message.reply(res) + except IndexError: + return await message.reply( + strings("invalid_cmd_scrape").format(cmd=message.command[0]) + ) + except Exception as e: + await message.reply(f"ERROR: {str(e)}") + + +# Scrape DDL Link Melongmovie +@app.on_cb("melongextract#") +@ratelimiter +@use_chat_lang() +async def melong_scrap(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + link = SCRAP_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + strings("back_btn"), + f"page_melong#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}"), + ) + try: + html = await http.get(link, headers=headers) + soup = BeautifulSoup(html.text, "lxml") + rep = "" + for ep in soup.findAll(text=re.compile(r"(?i)episode\s+\d+|LINK DOWNLOAD")): + hardsub = ep.findPrevious("div") + softsub = ep.findNext("div") + rep += f"{hardsub}\n{softsub}" + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=rep), reply_markup=keyboard + ) + except Exception as err: + await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) + + +# Scrape DDL Link Gomov +@app.on_cb("gomovextract#") +@ratelimiter +@use_chat_lang() +async def gomov_dl(_, callback_query, strings): + try: + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + link = SCRAP_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except QueryIdInvalid: + return + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + strings("back_btn"), + f"page_gomov#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}"), + ) + try: + html = await http.get(link, headers=headers) + soup = BeautifulSoup(html.text, "lxml") + entry = soup.find(class_="gmr-download-wrap clearfix") + hasil = soup.find(class_="title-download").text + for i in entry.find(class_="list-inline gmr-download-list clearfix"): + title = i.find("a").text + ddl = i.find("a")["href"] + hasil += f"\n{title}\n{ddl}\n" + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=hasil), reply_markup=keyboard + ) + except Exception as err: + await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) + + +@app.on_cb("lendriveextract#") +@ratelimiter +@use_chat_lang() +async def lendrive_dl(_, callback_query, strings): + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer(strings("unauth"), True) + idlink = int(callback_query.data.split("#")[2]) + message_id = int(callback_query.data.split("#")[4]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + link = SCRAP_DICT[message_id][0][CurrentPage - 1][idlink - 1].get("link") + except KeyError: + return await callback_query.message.edit_msg(strings("invalid_cb")) + + keyboard = InlineKeyboard() + keyboard.row( + InlineButton( + strings("back_btn"), + f"page_lendrive#{CurrentPage}#{message_id}#{callback_query.from_user.id}", + ), + InlineButton(strings("cl_btn"), f"close#{callback_query.from_user.id}"), + ) + try: + hmm = await http.get(link, headers=headers) + q = BeautifulSoup(hmm.text, "lxml") + j = q.findAll("div", class_="soraurlx") + kl = "" + for i in j: + if not i.find("a"): + continue + kl += f"{i.find('strong')}:\n" + kl += "".join( + f"[ {a.text} ]\n" for a in i.findAll("a") + ) + await callback_query.message.edit_msg( + strings("res_scrape").format(link=link, kl=kl), reply_markup=keyboard + ) + except Exception as err: + await callback_query.message.edit_msg(f"ERROR: {err}", reply_markup=keyboard) diff --git a/misskaty/plugins/webss.py b/misskaty/plugins/webss.py new file mode 100644 index 00000000..7c05eb9a --- /dev/null +++ b/misskaty/plugins/webss.py @@ -0,0 +1,50 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import os +from asyncio import gather + +from pyrogram.types import Message +from pySmartDL import SmartDL + +from misskaty import app +from misskaty.core.decorator import new_task +from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.helper.localization import use_chat_lang + +__MODULE__ = "WebSS" +__HELP__ = """ +/webss [URL] - Take A Screenshot Of A Webpage. +""" + + +@app.on_cmd("webss") +@ratelimiter +@new_task +@use_chat_lang() +async def take_ss(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg(strings("no_url"), del_in=6) + url = ( + ctx.command[1] + if ctx.command[1].startswith("http") + else f"https://{ctx.command[1]}" + ) + download_file_path = os.path.join("downloads/", f"webSS_{ctx.from_user.id}.png") + msg = await ctx.reply_msg(strings("wait_str")) + try: + url = f"https://webss.yasirapi.eu.org/api?url={url}&width=1280&height=720" + downloader = SmartDL(url, download_file_path, progress_bar=False, timeout=10) + downloader.start(blocking=True) + await gather( + *[ + ctx.reply_document(download_file_path), + ctx.reply_photo(download_file_path, caption=strings("str_credit")), + ] + ) + await msg.delete_msg() + if os.path.exists(download_file_path): + os.remove(download_file_path) + except Exception as e: + await msg.edit_msg(strings("ss_failed_str").format(err=str(e))) diff --git a/misskaty/plugins/ytdl_plugins.py b/misskaty/plugins/ytdl_plugins.py new file mode 100644 index 00000000..d2970f55 --- /dev/null +++ b/misskaty/plugins/ytdl_plugins.py @@ -0,0 +1,323 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +from logging import getLogger +from uuid import uuid4 + +from iytdl import Process, iYTDL, main +from iytdl.constants import YT_VID_URL +from iytdl.exceptions import DownloadFailedError +from pyrogram import Client, filters +from pyrogram.enums import ParseMode +from pyrogram.errors import ( + MessageEmpty, + MessageIdInvalid, + QueryIdInvalid, + WebpageMediaEmpty, +) +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + InputMediaPhoto, + Message, +) + +from misskaty import app +from misskaty.core import pyro_cooldown +from misskaty.core.decorator import capture_err, ratelimiter +from misskaty.helper.http import http +from misskaty.helper.localization import use_chat_lang +from misskaty.vars import COMMAND_HANDLER, LOG_CHANNEL, SUDO + +LOGGER = getLogger(__name__) +YT_REGEX = r"^(https?://)?(www\.)?(youtube|youtu|youtube-nocookie)\.(com|be)/(watch\?v=|embed/|v/|.+\?v=)?(?P[A-Za-z0-9\-=_]{11})" +YT_DB = {} + + +def rand_key(): + return str(uuid4())[:8] + + +@app.on_cmd("ytsearch", no_channel=True) +@ratelimiter +@use_chat_lang() +async def ytsearch(_, ctx: Message, strings): + if len(ctx.command) == 1: + return await ctx.reply_msg(strings("no_query")) + query = ctx.text.split(" ", maxsplit=1)[1] + search_key = rand_key() + YT_DB[search_key] = query + search = await main.VideosSearch(query).next() + if search["result"] == []: + return await ctx.reply_msg(strings("no_res").format(kweri=query)) + i = search["result"][0] + out = f"{i['title']}\n" + out = strings("yts_msg").format( + pub=i["publishedTime"], + dur=i["duration"], + vi=i["viewCount"]["short"], + clink=i["channel"]["link"], + cname=i["channel"]["name"], + ) + btn = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + f"1/{len(search['result'])}", + callback_data=f"ytdl_scroll|{search_key}|1", + ) + ], + [ + InlineKeyboardButton( + strings("dl_btn"), callback_data=f"yt_gen|{i['id']}" + ) + ], + ] + ) + img = await get_ytthumb(i["id"]) + caption = out + markup = btn + await ctx.reply_photo( + img, caption=caption, reply_markup=markup, parse_mode=ParseMode.HTML, quote=True + ) + + +@app.on_message( + filters.command(["ytdown"], COMMAND_HANDLER) + | filters.regex(YT_REGEX) + & ~filters.channel + & ~filters.via_bot + & pyro_cooldown.wait(60) +) +@capture_err +@ratelimiter +@use_chat_lang() +async def ytdownv2(_, ctx: Message, strings): + if not ctx.from_user: + return await ctx.reply_msg(strings("no_channel")) + if ctx.command and len(ctx.command) == 1: + return await ctx.reply_msg(strings("invalid_link")) + url = ctx.input if ctx.command and len(ctx.command) > 1 else ctx.text + async with iYTDL(log_group_id=0, cache_path="cache", silent=True) as ytdl: + try: + x = await ytdl.parse(url, extract=True) + if x is None: + return await ctx.reply_msg( + strings("err_parse"), parse_mode=ParseMode.HTML + ) + caption = x.caption + markup = x.buttons + photo = x.image_url + try: + await ctx.reply_photo( + photo, + caption=caption, + reply_markup=markup, + parse_mode=ParseMode.HTML, + quote=True, + ) + except WebpageMediaEmpty: + await ctx.reply_photo( + "assets/thumb.jpg", + caption=caption, + reply_markup=markup, + parse_mode=ParseMode.HTML, + quote=True, + ) + except Exception as err: + try: + await ctx.reply_msg(str(err), parse_mode=ParseMode.HTML) + except MessageEmpty: + await ctx.reply("Invalid link.") + + +@app.on_cb(filters.regex(r"^yt_listall")) +@ratelimiter +@use_chat_lang() +async def ytdl_listall_callback(_, cq: CallbackQuery, strings): + if cq.from_user.id != cq.message.reply_to_message.from_user.id: + return await cq.answer(strings("unauth"), True) + callback = cq.data.split("|") + async with iYTDL( + log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/ffmpeg" + ) as ytdl: + media, buttons = await ytdl.listview(callback[1]) + await cq.edit_message_media( + media=media, reply_markup=buttons.add(cq.from_user.id) + ) + + +@app.on_callback_query(filters.regex(r"^yt_extract_info")) +@ratelimiter +@use_chat_lang() +async def ytdl_extractinfo_callback(_, cq: CallbackQuery, strings): + if cq.from_user.id != cq.message.reply_to_message.from_user.id: + try: + return await cq.answer(strings("unauth"), True) + except QueryIdInvalid: + return + try: + await cq.answer(strings("wait")) + except QueryIdInvalid: + pass + callback = cq.data.split("|") + async with iYTDL( + log_group_id=0, cache_path="cache", ffmpeg_location="/usr/bin/ffmpeg" + ) as ytdl: + try: + if data := await ytdl.extract_info_from_key(callback[1]): + if len(callback[1]) == 11: + await cq.edit_message_text( + text=data.caption, + reply_markup=data.buttons.add(cq.from_user.id), + ) + else: + await cq.edit_message_media( + media=( + InputMediaPhoto( + media=data.image_url, + caption=data.caption, + ) + ), + reply_markup=data.buttons.add(cq.from_user.id), + ) + except Exception as e: + await cq.edit_message_text(f"Extract Info Failed -> {e}") + + +@app.on_callback_query(filters.regex(r"^yt_(gen|dl)")) +@ratelimiter +@use_chat_lang() +async def ytdl_gendl_callback(self: Client, cq: CallbackQuery, strings): + if not (cq.message.reply_to_message and cq.message.reply_to_message.from_user): + return + match = cq.data.split("|") + if cq.from_user.id != cq.message.reply_to_message.from_user.id: + try: + return await cq.answer(strings("unauth"), True) + except QueryIdInvalid: + return + if match[2] in ["mkv", "mp4"] and cq.from_user.id not in SUDO: + try: + return await cq.answer(strings("vip-btn"), True) + except QueryIdInvalid: + return + async with iYTDL( + log_group_id=LOG_CHANNEL, + cache_path="cache", + ffmpeg_location="/usr/bin/ffmpeg", + delete_media=True, + ) as ytdl: + try: + if match[0] == "yt_gen": + yt_url = False + video_link = await ytdl.cache.get_url(match[1]) + else: + yt_url = True + video_link = f"{YT_VID_URL}{match[1]}" + + media_type = "video" if match[3] == "v" else "audio" + uid, _ = ytdl.get_choice_by_id(match[2], media_type, yt_url=yt_url) + key = await ytdl.download( + url=video_link, + uid=uid, + downtype=media_type, + update=cq, + ) + await ytdl.upload( + client=self, + key=key[0], + downtype=media_type, + update=cq, + ) + except DownloadFailedError as e: + await cq.edit_message_caption(f"Download Failed - {e}") + except Exception as err: + try: + await cq.edit_message_caption( + f"Download Failed for url -> {video_link}\n\nERROR: {err}" + ) + except MessageIdInvalid: + pass + + +@app.on_callback_query(filters.regex(r"^yt_cancel")) +@ratelimiter +@use_chat_lang() +async def ytdl_cancel_callback(_, cq: CallbackQuery, strings): + if cq.from_user.id != cq.message.reply_to_message.from_user.id: + return await cq.answer(strings("unauth"), True) + callback = cq.data.split("|") + try: + await cq.answer("Trying to Cancel Process..") + except QueryIdInvalid: + pass + process_id = callback[1] + try: + Process.cancel_id(process_id) + await cq.edit_message_caption("✔️ `Stopped Successfully`") + except: + return + + +@app.on_callback_query(filters.regex(r"^ytdl_scroll")) +@ratelimiter +@use_chat_lang() +async def ytdl_scroll_callback(_, cq: CallbackQuery, strings): + if cq.from_user.id != cq.message.reply_to_message.from_user.id: + return await cq.answer(strings("unauth"), True) + callback = cq.data.split("|") + search_key = callback[1] + page = int(callback[2]) + query = YT_DB[search_key] + search = await main.VideosSearch(query).next() + i = search["result"][page] + out = f"{i['title']}" + out = strings("yts_msg").format( + pub=i["publishedTime"], + dur=i["duration"], + vi=i["viewCount"]["short"], + clink=i["channel"]["link"], + cname=i["channel"]["name"], + ) + scroll_btn = [ + [ + InlineKeyboardButton( + strings("back"), callback_data=f"ytdl_scroll|{search_key}|{page-1}" + ), + InlineKeyboardButton( + f"{page+1}/{len(search['result'])}", + callback_data=f"ytdl_scroll|{search_key}|{page+1}", + ), + ] + ] + if page == 0: + if len(search["result"]) == 1: + return await cq.answer(strings("endlist"), show_alert=True) + scroll_btn = [[scroll_btn.pop().pop()]] + elif page == (len(search["result"]) - 1): + scroll_btn = [[scroll_btn.pop().pop(0)]] + btn = [[InlineKeyboardButton(strings("dl_btn"), callback_data=f"yt_gen|{i['id']}")]] + btn = InlineKeyboardMarkup(scroll_btn + btn) + await cq.edit_message_media( + InputMediaPhoto(await get_ytthumb(i["id"]), caption=out), reply_markup=btn + ) + + +async def get_ytthumb(videoid: str): + thumb_quality = [ + "maxresdefault.jpg", # Best quality + "hqdefault.jpg", + "sddefault.jpg", + "mqdefault.jpg", + "default.jpg", # Worst quality + ] + thumb_link = "https://i.imgur.com/4LwPLai.png" + for qualiy in thumb_quality: + link = f"https://i.ytimg.com/vi/{videoid}/{qualiy}" + if (await http.get(link)).status_code == 200: + thumb_link = link + break + return thumb_link diff --git a/misskaty/vars.py b/misskaty/vars.py new file mode 100644 index 00000000..24d8825b --- /dev/null +++ b/misskaty/vars.py @@ -0,0 +1,75 @@ +# * @author Yasir Aris M +# * @date 2023-06-21 22:12:27 +# * @projectName MissKatyPyro +# * Copyright ©YasirPedia All rights reserved +import sys +from logging import getLogger +from os import environ + +LOGGER = getLogger(__name__) + + +def getConfig(name: str): + try: + return environ[name] + except: + return "" + + +# Required ENV +try: + BOT_TOKEN = getConfig("BOT_TOKEN") + API_ID = getConfig("API_ID") + API_HASH = getConfig("API_HASH") + # MongoDB information + DATABASE_URI = getConfig("DATABASE_URI") + LOG_CHANNEL = int(environ.get("LOG_CHANNEL")) +except Exception as e: + LOGGER.error(f"One or more env variables missing! Exiting now.\n{e}") + sys.exit(1) + +USER_SESSION = environ.get("USER_SESSION") +DATABASE_NAME = environ.get("DATABASE_NAME", "MissKatyDB") +TZ = environ.get("TZ", "Asia/Jakarta") +COMMAND_HANDLER = environ.get("COMMAND_HANDLER", "! /").split() +SUDO = list( + { + int(x) + for x in environ.get( + "SUDO", + "617426792 2024984460", + ).split() + } +) +SUPPORT_CHAT = environ.get("SUPPORT_CHAT", "YasirPediaChannel") +OPENAI_API = getConfig("OPENAI_API") + +## Config For AUtoForwarder +# Forward From Chat ID +FORWARD_FROM_CHAT_ID = list( + { + int(x) + for x in environ.get( + "FORWARD_FROM_CHAT_ID", + "-1001128045651 -1001455886928 -1001686184174", + ).split() + } +) +# Forward To Chat ID +FORWARD_TO_CHAT_ID = list( + {int(x) for x in environ.get("FORWARD_TO_CHAT_ID", "-1001210537567").split()} +) +FORWARD_FILTERS = list(set(environ.get("FORWARD_FILTERS", "video document").split())) +BLOCK_FILES_WITHOUT_EXTENSIONS = bool( + environ.get("BLOCK_FILES_WITHOUT_EXTENSIONS", True) +) +BLOCKED_EXTENSIONS = list( + set( + environ.get( + "BLOCKED_EXTENSIONS", + "html htm json txt php gif png ink torrent url nfo xml xhtml jpg", + ).split() + ) +) +MINIMUM_FILE_SIZE = environ.get("MINIMUM_FILE_SIZE") +CURRENCY_API = environ.get("CURRENCY_API") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..db79a155 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,31 @@ +emoji +git+https://github.com/yasirarism/pyrofork +tgcrypto +async_pymongo +pymongo +python-dotenv +requests +beautifulsoup4 +aiohttp +chevron +gTTS +regex +apscheduler +pytz +pykeyboard +pySmartDL +psutil +python-dateutil +telegraph +hachoir +Pillow==10.0.0 +httpx[http2] +git+https://github.com/yasirarism/vcsi +git+https://github.com/yasirarism/iytdl +deep-translator +telethon +pyrate_limiter +cachetools +cloudscraper +openai +GitPython \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..1d9128b9 --- /dev/null +++ b/start.sh @@ -0,0 +1 @@ +python3 update.py && python3 -m misskaty diff --git a/update.py b/update.py new file mode 100644 index 00000000..8b87ac74 --- /dev/null +++ b/update.py @@ -0,0 +1,68 @@ +import os +import subprocess +from logging import INFO, StreamHandler, basicConfig, getLogger, handlers + +import dotenv +import requests +from git import Repo + +if os.path.exists("MissKatyLogs.txt"): + with open("MissKatyLogs.txt", "r+") as f: + f.truncate(0) + +basicConfig( + level=INFO, + format="[%(asctime)s - %(levelname)s] - %(name)s.%(funcName)s - %(message)s", + datefmt="%d-%b-%y %H:%M:%S", + handlers=[ + handlers.RotatingFileHandler("MissKatyLogs.txt", mode="w+", maxBytes=1000000), + StreamHandler(), + ], +) + +LOGGER = getLogger(__name__) + +ENV_URL = os.environ.get("ENV_URL") +try: + if len(ENV_URL) == 0: + raise TypeError + try: + res = requests.get(ENV_URL) + if res.status_code == 200: + with open("config.env", "wb+") as f: + f.write(res.content) + else: + LOGGER.error(f"config.env err: {res.status_code}") + except Exception as e: + LOGGER.error(f"ENV_URL: {e}") +except: + pass + +dotenv.load_dotenv("config.env", override=True) + +UPSTREAM_REPO_URL = os.environ.get("UPSTREAM_REPO_URL") +UPSTREAM_REPO_BRANCH = os.environ.get("UPSTREAM_REPO_BRANCH") + +if all([UPSTREAM_REPO_URL, UPSTREAM_REPO_BRANCH]): + if os.path.exists(".git"): + subprocess.run(["rm", "-rf", ".git"], check=True) + + try: + repo = Repo.init() + origin = repo.create_remote("upstream", UPSTREAM_REPO_URL) + origin.fetch() + repo.create_head(UPSTREAM_REPO_BRANCH, origin.refs[UPSTREAM_REPO_BRANCH]) + repo.heads[UPSTREAM_REPO_BRANCH].set_tracking_branch( + origin.refs[UPSTREAM_REPO_BRANCH] + ) + repo.heads[UPSTREAM_REPO_BRANCH].checkout(True) + ups_rem = repo.remote("upstream") + ups_rem.fetch(UPSTREAM_REPO_BRANCH) + LOGGER.info(f"Successfully update with latest branch > {UPSTREAM_REPO_BRANCH}") + except Exception as e: + LOGGER.error(e) + pass +else: + LOGGER.warning( + "UPSTREAM_REPO_URL or UPSTREAM_REPO_BRANCH is not defined, Skipping auto update" + ) diff --git a/utils.py b/utils.py new file mode 100644 index 00000000..a2d6690c --- /dev/null +++ b/utils.py @@ -0,0 +1,146 @@ +import asyncio +import os +from datetime import datetime, timedelta +from logging import getLogger +from typing import Union + +import emoji +from pyrogram.errors import ( + FloodWait, + InputUserDeactivated, + PeerIdInvalid, + UserIsBlocked, +) +from pyrogram.types import Message + +from database.afk_db import is_cleanmode_on +from database.users_chats_db import db +from misskaty import app, cleanmode + +LOGGER = getLogger(__name__) +BANNED = {} + +loop = asyncio.get_event_loop() + + +async def put_cleanmode(chat_id, message_id): + if chat_id not in cleanmode: + cleanmode[chat_id] = [] + time_now = datetime.now() + put = { + "msg_id": message_id, + "timer_after": time_now + timedelta(minutes=1), + } + cleanmode[chat_id].append(put) + + +async def auto_clean(): + while not await asyncio.sleep(30): + try: + for chat_id in cleanmode: + if not await is_cleanmode_on(chat_id): + continue + for x in cleanmode[chat_id]: + if datetime.now() <= x["timer_after"]: + continue + try: + await app.delete_messages(chat_id, x["msg_id"]) + except FloodWait as e: + await asyncio.sleep(e.value) + except: + continue + except: + continue + + +# temp db for banned +class temp: + ME = None + CURRENT = int(os.environ.get("SKIP", 2)) + CANCEL = False + MELCOW = {} + U_NAME = None + B_NAME = None + + +def demoji(teks): + return emoji.emojize(f":{teks.replace(' ', '_').replace('-', '_')}:") + + +async def broadcast_messages(user_id, message): + try: + await message.copy(chat_id=user_id) + return True, "Succes" + except FloodWait as e: + await asyncio.sleep(e.x) + return await broadcast_messages(user_id, message) + except InputUserDeactivated: + await db.delete_user(int(user_id)) + LOGGER.info(f"{user_id}-Removed from Database, since deleted account.") + return False, "Deleted" + except UserIsBlocked: + LOGGER.info(f"{user_id} -Blocked the bot.") + return False, "Blocked" + except PeerIdInvalid: + await db.delete_user(int(user_id)) + LOGGER.info(f"{user_id} - PeerIdInvalid") + return False, "Error" + except Exception: + return False, "Error" + + +def get_size(size): + """Get size in readable format""" + + units = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB"] + size = float(size) + i = 0 + while size >= 1024.0 and i < len(units): + i += 1 + size /= 1024.0 + return "%.2f %s" % (size, units[i]) + + +def get_file_id(msg: Message): + if msg.media: + for message_type in ( + "photo", + "animation", + "audio", + "document", + "video", + "video_note", + "voice", + "sticker", + ): + if obj := getattr(msg, message_type): + setattr(obj, "message_type", message_type) + return obj + + +def extract_user(message: Message) -> Union[int, str]: + """extracts the user from a message""" + # https://github.com/SpEcHiDe/PyroGramBot/blob/f30e2cca12002121bad1982f68cd0ff9814ce027/pyrobot/helper_functions/extract_user.py#L7 + user_id = None + user_first_name = None + if message.reply_to_message: + user_id = message.reply_to_message.from_user.id + user_first_name = message.reply_to_message.from_user.first_name + + elif len(message.command) > 1: + if len(message.entities) > 1 and message.entities[1].type == "text_mention": + required_entity = message.entities[1] + user_id = required_entity.user.id + user_first_name = required_entity.user.first_name + else: + user_id = message.command[1] + # don't want to make a request -_- + user_first_name = user_id + try: + user_id = int(user_id) + except ValueError: + pass + else: + user_id = message.from_user.id + user_first_name = message.from_user.first_name + return (user_id, user_first_name)

    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 Xl=pu-@=WGNOZXmnE5N~keA52~1ZQ zmpb>Hcm2KZIT4s32qF9>3)$J(Z5s~ndh8NG_)!q8^>eFcX4!E;5rpTS$9Z;c)5fg_ z%zeKUgy&xp1SvbWb^Fv`Wv`Cm`k!$9PaC&(bU%K{eFx4v-1%_VHw8hD z;C^-Am6vDP3+z5Y@HgUm=)%Jn9Z+|^zaj`$J)Svw(RoJ?3$9?`eRxI)UUca-7mnv1 z_%N!g1mVfQzW9Rk&i4i0tKr^OT<^aa4f=PKb8&t?&KoX1aQW5ajkB|YAnJmk`Yt`R z@4Sby|1f~x8^Q1E2hO|tu=FwU$GHD?+@C#o-hm5V`|^FS2*S5;s(knGp`({SRC)`p zf9Lyxp#A>vkqZuQx$gJ)ZQotE;a-8p3gt^b{=o;&35>iVWTaoCMfmn6TL5WXl# zIG4mCy9;w6i+?R1!$Ws^NA_c(TX>D%S9{+F1@V6iLUzsa>knUZQh%c6TgZN{aM~F|}SirAiyvzzJXh7vWM11s@MStU* zE}u(NkPRrD--yrOScnH#mT@5o-cFuwBmVsF$_hGJNi%;@zY5=tLcC3d=5o0ZkN>x2 zxj$_qz@n-YeXf8&iu$fiLqJ0Ksqj9dem z2>E%sfd9lQc#vcr$vH=G#rNX44sw@x7;=;IDBi>0MYKob_(9OfUL3!GVxW**tKj&5 za-HNS$<8;*M0)oB;hF$-RV(!Z^b-F2FRp`N6TnXR8P0p5Gh_i;UGNJxvKF?6-6+80Y5S-rk`UG>1v|L%pc7lvOLdZF?{ z?+f`C5 zoUmG0BditH3G0Oo!o09i*d%Ngwg_8=ZNhe8LD(TILL=-F&JuPDXA66TbA)q+^Mt+l zs<#Sn6W%V|A-qSpUwByfu<(fR5#dqcqr%68j|-m=9v40-d`kGV@Pu$&_>Ay5;q$^@ z311LSz*_lh;iT{-;c2|#h;Y7efp7`iDO@dlNH{FKiJc={DeT9U+l2@4_ffVFmfJKeA4Eu#Jw;ZEUJ;T^&;;a$RA!n=ic3h#wACkXcl?-w2t9u$7ZroeZX zu^BeY=7ek6TDF=^3-}nJb=?WU*tGZ=#@@N}1Y5f8gs>|0B<52(XHVM+n4#J1%q6Ri zvvYAGwxXdqhnm!yojooUXSXaCc4m)dkF7cXSavph@pse$%SD z;}ffP*5z{9nd4vCw0Qh0tLkz)cj7MfbWhRa8!n00`mCYPYBR3u-dnaV9-pW?F6=yZ zjNZ9*v5-4{)3IZ9$M7As^Ao~X-q65=H#SVv8ZZ)g2S#G%1iNVyUWP*k z?p%f6Hd@zhU7SHrb35B;%v&(`uy+Nqg*^o!!z*7#r49U$0^it}Ilbk};I2G)CWaPx z47^1JH-*7rR;@+&GG5flAB&%UOa!}hpzTbH1lC&lYW%*22elS-#v3iXKO$TKzPLfS z4jk}1oWJqE3x%(U5$RI-Ddk1AS-o8owA*!4zgT}*|FzL>yk_pPZ0lv;-TpoH5&J8F zXM)cMe;Itq>2&ULUJm^_@inYxyKrvd;lgVTdm8R;_;$k&8h+C7tA-aF{@740sztjPE2fL3 zVtcW_I98l3&KDPodx{qp4;HU1-dKEV@twtciw~EsFMXl>{>IM6`x zA$DBdd8{ka^+ea7x`pmvcE8wjymwFU#l1&*kN2MFo9)}w_i*21{rfBFN_So_fplmg!y77fv6U zzH$24^u5!MOg}OG)bumc|2X}_>7P%(IQ`lxbya9pdR6mG!%XYUz|5+dO*6Y^E}pr3 z=BAlDXYQZ*$jtGXzn*<`_KDf2W}lh;$Jw9E?V8&=cX007xwp>UJ@@e3<8xn_``X;M z=6*2u^SKx2UR$lM4y{hFZeIP!>c>}qVfEKme|z;0SO04D?^jpXm}_Ed@@v}H46T`6 zE3P%y#@6Q7wyzypJG*wv+C6Lcuf1~ZE$hCy?%8!eTKDU9FRvHY`_{+TKePVZ>wmcZ zSL=VjzPiEO5ZjR7(7s`4!|Z%|zBJ!GKQ_O1eqny^{K5Ha=ifSi_x!{2kI#Q${%iB! zp8w(e&o}mNylLaHjX&EI*>vxw-)!Eq`RUEy+WdpfKi~Y~=GV5UTSm6bZkgY*uw~Dd z3%4BHa`l#5w%ontfh~`0`Q+9wY<*_yx3~Ua>(91r+xD~V^9zw3`i@%`>lg3Zxq9cz zJO68!yvw&Mva5bq!>-m{y}RDO>z8NMpLO`G6T63YKf3#g-Cx-K^zLVNe|z^2cK-w{ z+P?HWlVHoFz`Yfrd=ea{K=H|7p^o4Qq48Oi4ls8^$4M}o1pOtqbauJN(a#LYZLoZPUr5s`mgtk^2A%mN z|1oCd4CZ61JZy<#NmYY^X-(88V?Lknc5|mFt2@nos=8BAxUpgigG(=nx4@q>(BA=Q z`z_Gr7YT>p>3;zl8FFl9@q}ThVYQHQY%JC!xb7 z;YN(YNoaBj(vZgECXB;XKRO}Yh~w?gddItPyb9;{;&>m*6{z2j<6#^>P&``dGGERR-tKk_v5A)pG-3Rjm(ibt79; zQQho!&b1?|%I;2uH!Dor6bS88b+%Ds+L)?8t!g;irfQnX1YOjpG*L^MM~ru<$`SQC zQBjqvuG6fm%p=-6H07vzg{~+^uaFe{ecL+#$$?HE6wB~sE!eePutcvEzA4;%5=Na2 zlaNU3>yR6da?<)bNFfMPpkp(Rx8S&d<3a~WE%+qNMD^t-VZbRb)ALe@gvs z%uO>l8u4gO%8#<%p6(QjxWw}Orb1rT)N-jZ#(KKlSO#+k;U%f1N`GH(yGU+v3XU0Q-H3-iAc zIyVr@l>&vi%w(!-szKkO_pPs&w6jURIUQL&5qIjFTBD*WOFmK2MCO~1J1NBpI;FTN zt8Hl~q?CP*s!FC-ui?)hbvxi<)bO1D52J64?!Hr3Ovb zgZXgVnxtC}Dn2J>J27F&E_9BR-3`T6W_Bqrbe>Z|?x1rpL@&L;FQ9cM=cmpW$aenhHsC|Lg zK7!g&)J_ODfQ(6s-b+uS{t)U9@%oeSx}=voyOw2_25Ku6@}OT%h)|ZOh6~WIm9Pyd zNqTmf21&j4S0pY+)ncAV6xx?ai`u~lYWd9D`XLSZ%b?A`Al{qC@P@RgphP3KxZEan z$25s(xl{@F_bA=oOQ6qVY(-rZA;LZ^n&Q*!h^gqe?>8M&mJintX4*Cl zgSvg7!TiA5rrg@Xn-$02uQArr(%3s=_{^z}hUQ2qtV?P+sRncnkIS|%5HV%F`oHRv z$yKHDbWbYPy{gA37iiX3~aM&{dh(zz?lpGoEEh#Mi1gS{LO_j{TKwcCsy$gm(kG($;H}xA(7FVVK^o0054YqputMnhUAU) zu)W#g%Sx4WLH8*>OEN{%r`T3G-5cuat0b~(r)}MSSY^t?5SiMT?zka4>G~jwlt3yO zbAy(~78gl`?t~QG13fA%DYE)eMNEt=WT!i$4R(iN81>PlJ2ZHxbA5d>psVtgie5@4 z;{{z7WuxvB@->Pcw0|3@vyX|Er8kzFQq3a=`*!4gal6=3%Hh{irRJQSbQ*SaUD_9| z3n)zy%ctvR1N)rolma1>grh&{G+K`DPupd5XFJM+T2fV$TJ=}5B^SDadMwbrFV__b z=K|TO;?~9%H|o~gS;rFBNQzp_WgW+eSoMjIl>0QcUXqog&07jVU44sa24em^3}O-S zgAUHI!Xv7g5pAphF6-wYM}xP*qgahf6qZX23GLH#&J^^*^mh< zS0P(h1ZQ=Gob9kY7UI6Q`?ed#f}(=H@w-b8vh&23fs$1O-$^+7GK>at89nO%Ah+mF820lQmAz3)KpCwT8Gkg<2{1_|=d>fsDt{;rqnbAl&3aW@SN5*r(sBGAlqYg@jJS>~K z#_&U;tc$~#TT2_8Zb-$7N>r7H)LS#Txix$DW}73HV=}|1hg22$P$gZ3+ksPO>LFAOIxMk z&n}aF0B!j5E6X1&y1`AVy2%Q3TZXQx8#Gnbvf84yO4nE6Fk=|#e|YK5!oR{O$^xa1 zo&=PwKvlsSdJ6b9FaYxZ@dfQ{oDogGPIYLir!gdMVnBG4AOX$OZTC$Rz}}X0=XA~43HRl!^qQ^cayH+ z^x50P*8SQW(_gD1?B175lc~$YrfP3h#6=B5g}0@ao)`WdKkv#@BQr|Gci?u;R`DV9WEytP0pY9@!a;Q59F&7#ifv#HGOhhM`f=Qb zwg~Fy;8?)1K=;C4StH1B`L>~U32KF56X%R)9QVc@ z<&K1|#yguz?RAEc>}cxg?!InleQ73RM06D*TXMof>(`GT>FDUPOz=zWIVEVeY_6ZG z@3Uoyxv=eoRlW-$9>-zhcvcrj)df2c-exITH;uX4n#2Aw; zmT?_+zo{#t6tmA!lygiQoF`|hYoQfY@l!H0PQBSM*srE!Sv@R@%#+o_z|Q=juLvS- zL%_@$(N}IA&ywvs>)F2hK_ZL%>t^wF6Q1pxejkvZ1oC(hqym!FGACoX1L?CE|awAbkd<~l>#-6R->$qV!17w;5UQd>o7`7CBgWc8HAiiuE)$3$AUzsfinlfh4YH&lTsHMx7i(+wj zUHRH}`CK;bJ zlj(d&KWeDbW$mknJEBG+*XTOYK(Y`HDT*}1B(-U>EnXQs`&y(`5&yE6F}^P3+c;v5 z_YppPE*SeNKAz`-M$Q6_5M+2eVKzrF)E97WEP5^^4JfA)F6BTEG*YMa1z86w=SL33 za6_q|8&o9;(vd)%v{YkVn|T^VBW@)I1rNiL;x~94>IrX%E;$b7T(UC?6C~DC z*S29W+Zm6iEAyS>7v*Gi81R<_F^67R<))ytFHB}}aH=TGU z;f$;5xIfrfAF~ymMQ0?x--ctM>4t8Kt3dufe<%^q72q-fCg$Q!P&2FLSkqtuqBYlF zifWcKx@E@~9QV79>knE#30e!yP7`GBYe}c) z3hiyWtVcVobX};Utw9UMLGG4PXoC+>@XMyX?@dywvaxI3MM+6MAIONTm-EfpmiEHt zf~m1d!}xk2#r`DWKUF>T<8o|O0aC7EED{Ym67UrLp8}2Pyl!YQhfSzz^($5oP)lpJ zF{q&nOd zZ*q!`ZiYn__M78`vbnalimI_<$kF3=Dg-(Z;V0#zQCBh7tx_dXnO3wBC6q||33d)< zQwe~*KCuHRUm@UYsZ8b7i?7WNZRyd{Q^OFN>SY?{HdknAR-)bEa3LA!ZE3FbHU{-% zu+SOrPruUB3d2Sg+d5tuZ0|~^Ljm9O;Z%LtH0al10GqLRHV=o44pQ5Ru?9iqzx2HMVkqI6>^h(=?O2*D~HR$4yq($sRcblSBpA6O&B29z+t<3|V z6VKjx8vI)a<0b(~R>DLQs@4h|H;4H`Zj|TK0RQAt>a>S~O;#f`J61mApf+68?A!_%d1{!=1`hO{JydE_G z*SP!+)E-0)G|2TRXavON;cjEVEGSfqfGwdb5)tGIEz1#(GuAPYBNS;#@}v$`IU#Z) z1wrF!GP4Ot=AxO$JV2-r#|R#NFQlgGvkMeB*&Z9O?27el49!?!n-oa((j6r z9#s6c#+*R+_-sBqSP%7^8wrLSCzT1Sy5cr~K7E#gaDz`*0VBh(cKl($$nPqa0-1&8 zzTWL4xnd!m=~-0*T*=NoKr1(Ks<{fackGjn~pnN<^Gy-TE4n0&Bzk)+%Pip zRs$pXA4qxAgQT(-S7w6hJ#_9Kw-ymhD)0AA;SoUAX^ke^(CD` z)UZgdsCK<=Cu~j9fY$~K3DuBf<87*9>Df|qlj3$ITQ=p#bHiJE)csdwhPL%*Cx<&= z^M9{tpr^HQsIMs;iVik_D5sm8unDV7vaH`Z(~Vty@nlyVz-~)#yuYP+Bq&*5)f0Ao zI20ng&gVk17NUyzoB{VmhT9@DQ3?2fb46t>9Ef+dsakz{hyKv9ejpvp zb>(#F*-CTcV1G;FpdcWdG6&4zCH82rB!pxkr~%cG(Yz#NfZ6;G?Patm!ctHbf)Fs2 zGPRFgAjXlwm=_`^0gB)PruKx820gg2%PKUDG~T3KU@_yY2E7L`qi9#lTM~ZfKM+j$ zxvIP-8`47$;)}lLPwd8M?hfmRG34)H`qirVFu~9o+chc5N1-Sn-z5D0Q@~@ML3TqE zK(sCrxGGFg>Ol@YXaz-qH%;G+s?I2eu35^0FMznX&$rz) zxBG507Jy|_Y8vnVPIkWN!Urk?HQF^WdFAz&*wGRO095# zcO!Cyl^^8GDWpsAEf;cXpm4wmf&9Adn3wGxn3JE`JsUTjUhs`0)-)Kw`TR!AQ(~`o)sMCMh(;p*Hks!bA-TjxZIU~ zGHnpxCz|amjfpQ4ghm2bwF5BT{R}32A{h>urV*?!#dKQ**yZ2I#KV?fRh`QekzHzm z`2pc1$pp^&!PI^@VV$M!?ovZf&)VYpi57&u{mH(3$uJb-T3ykSu0LO>*X&|r33(>U zWs001*}$`v!bMv%6gdLCE~toFBonN+d_g;V8m$Aze}oMvVShkX1CBl@DRRZ~sU~EG zs$~L2pVFi<+L}S2=CF%o(uEAnLk;Or# zH_r7Ux~Ox^?PG|0m*LoLhXZn_@O~z;nDF+K!Ve)T{yeeNy;aLB>U@k;U;H z)J_P0i~0XL=Kt$7|1W?iU*tEOLhYY;?eD>zAEg@B4vEMkrpJ*+%e=I)kK*x0JWdwY z3#h*r_4lHF0`;$gT@>!utib9xvcj2~4CB)de;I7W8HO6)A*-h5oKgk{brnAb@_=BH8;(K zQxE}w72(DD0dfH^aze$4>#}_@po(s#K9i^mCUhXgDyS-IC2dVya7XK-6J>a=veYmZ z&Gd(%-wKRLjQ99bK7eQ00G z>CM+SI(Arb%DH4AX4a*;0_7mUI%AEF_nN_Apv#@?h%PjBxvtw2NVh`Fj>)o=NX^t8 z9hyeOJRZuOzpj*Qi6qoh8DvDU95A*XkxWVVM?!ignS3 z_V~fB4C2c8(5PWpL#rkN`Di?K*VaNH(AsswIZfk{2z(J)U88D7z%eIgAKlqJnW}FM zWsy*!1gbA0&r6YfZX{?WqIM<#(HaCk8G_&8KdrUwBdgfUx_@M)ZOt?;zZj?Th z0hA$>QFta}khlHdEpQA44ndK_1O!0u0ei&qz8ZXwbF~l#6_fs!2s&`XF%Tr4;Ms2# zR@T^k{)n8rP-FVxycpCG0xjzAcb7!v zs3o%cmc|SV_^$NbsQY{@9TxX!vU2K!cErbKGK#EaFw%$M=-*(eciyR5Ou7$CMOEM? zFR)kf{ZXubn1wz%uUV{!g&xAX^4z8hJmcxvk7~m z)G>}b1qgQvtVna%L=BrfAZiar>>yruLf8cJ_d*W!A}|ZYgQFxEnwqLARJaV_*dvCD z^E5f$KpA`CszzY{8#UD?kRkfH-1r3P-XV-vg`3=WWWZebV z)a@9Z+!c2bD!;`r!|u90;bbygJz_-j@rLdv$i6{16S*jLunY2_xAnrCg`Sg?gMvjR z+`GIEBf7vR=$zAIyMRgA2#}9LGZ%YsI`=X$EX$SvAgPs3CGrbMD6f>gB+fCu$PeZM zyC3IVFnf_svH+0ygcnk}60Tv?=?yqw3UHn#$OF^IDy6j(JptJL5FD0f>i(Ybxm;l~ zg~)MsX3lYoF*gY}Q8pT4=_Uu1uD#3D{D!Xh`v4DKewduaD-ZW=8_pU>jlQCd zA{+2^#Uf4qba$zBl4Qz8|&IM#I!@_#=15RLb?Q-8&Y;D@l3ACHB$9md>+6nNUkDY zX$6`!Lm1;Mh<*eZV;A@1W-;so;EMsY0JD7=T){aaNDL5M!4ZAb(C2YP8)j{sb3`9z zYw~pB&tI}cna=}Pr;szip)krIeTfh$hbKDXnI47a0H`cR{@m9%rN5T!;Rtze)G>ph z;v~L&vLzbH1L(f6r|p9CUIQjF+TFKnSKH9*$r$2Tf5yr>|4?*7zG$@hAKDVK!G1r` zy}SCKXYD7F{bgsRdSQR3N2er9{s!X{fF+*62+g0Qm^{dq*u4*9L!Lw)AK3-;dU0eJ8$XS5dWe-G1we!=CL5X}Pbwl(P)Llu@q?U5;m`als^8#~OSz?^DEO%ApH_U1 z!T#j)o%&yA#1j9a->vwV>Z`SHS(Yz#n6u45G`3Ufq+D|;&VrKI#%JOz%;2S%!Lu+U zz`cN5yp=q{Tk&Ok_@rHg+LgSv1GO#up^I=cGTJeH3jfM8;>WYAcqFeTd^ly3Eaw`M zBUdDV)PmNJgbR{S+)+awhKEd$yuo#nOaCXb2!YNS0`7#i`x>`Bilg8e9kg zFVFZ=ez+#Vye}X2D-c9F)81*yYxpoPh;Ra|e#7|J(-Nt7JC{hkB`%SIiEPl<-r98S zl@Lb#QD~NEH-yp1LZwdkpO!>^BdYuSh&l&tqu%mE7X88>bDi^5^?bxTU_C188p0nR zS{6tLAegv7^0yaG3#6e=%pAo$UO=YQJ;=--Sm>B*yJNFR8=n4f0MSRZDLH&A4c7Z<{4!=&a@BGJe%N0AG)XtFmOJ?wnH zzsg5#2h!2LK*ch_E0hHsrL2k9^&1OCYK8zhS`z^~ zRCNda^y_#%!(WddBi@#l{ty8yl4@y2lzdRnj#7c{{ENZ%y2tm=`eal#{8`VlZ8a7 z2-LLHtidy&Tt3PFF{8e7s+1TXaGPuiad|L&AexGVUB7HJ)^&{Lk0(z z#XTN9JtQeBMY!#IIRNarQ2o!aPyC#r{Bw1W3<#-Z_U9fwedqf!zMIn&`x^i5jL>)z ziyUPhZot=4IEriV1Zk-RX{jf1{lC>lm}F1a$5YDE3MO~!02Z-lL9*weRR1#= zM~HV3Ml}2EVh|pnwWzXJfZMTgTppKZRCuL^aX?fLN(vUcTx1;5v^zENn%gw-FdWG0 z53m}c`d}<5UIG*PJ}cmh1;3*x-$6xHevK5-UxT7CU^fE1VMnTWz=XcO`ZhjxYV}R* zy_C}G$wTBq+=E=&H1zF+a0n4{3_=-Fua!%^GUT9_G2_L~DLZfwS3%>DmY#(4BI4t? zGER9lMAJ0F<0zDmOW<1@3VDX)5%!|=qYPrCq2T~@k(0+M8_6d%A>f^dx%$fYRnCac z*AHr#U1vp=y^>Gbt0QSwrMwi3D@4|N{QeA#UksagH<9|4vUF$0XZ=J`)t>|*F_&Er zpZG3S{iLdXgNsgut*M^mqoh>7gz;I{^I5LvFA%1^X!sU%pRh&BB-ns@0LLv*+Y@|L zHlPMigL1m|LPpF&98gk%gjlW@y+ZJTgxwj%z7im+aP);c13y0eKjsfMq8WUc{vdME+?pBPM5UtM?9 z#nM6ifZzCjr16<{SbwCY1JRymVmS*D@BbX>+*f_|!j3fli?8Wr+TQL={Y$x~xIWnR z&0Mo<48scMe9Zn0G-&bcdBw-(jIZ|vS@^XPeTO57W#wT4nw2dHH-zA!)+f`n7Zi1Kr*x-GvDOT__ysj zd;2y6wxO`(OO%tTRJ2$h{3HT1LEmvsH+Y16R#Ek_WaAVbo61E$xO?%&&3hl^l=F|t zbWr}0;-r(rV~Wtc^d2z`Uo;CESdIM*jtWP;Op9|tIh13u8`QHKJhh)wkA^c1S9aq{ z2z6qi{ixTWUWYp2*wd&_*XpyVlTURnsBYe)I$968om1T!)V$m!rJLMMScIHx&X8VO z%#elB6Xtm;H5jqxl`eydgvoIG5!A*Lmf$*hdT04{e?fzNY_F6k%v1d~4SYC$AUE|ct zAX4O9|_Y{q|@I(uyDpO8=mL`xC-MD$SqmrWXpSCud8YZ zJ@UH>%Y+Ql=XaIQ&~xQWpvN6t>al&Ac5cE#B9^pD^6Teau)3}8&atowMZahoVB z*D2zB4^j8C+x8gOTJdsyDitp#Z5Cch+dlVRFv-0-kXc`%X)>DCfjH{X=wvSXhqmyO zil#j7(K^UJ+4*=f6O?}}1+powQxeFpdlB^Bh+RLOkNo?+=@bqy=M2hEok^Q?+ zdw@&CA}u61z^uC4FecO=s1=gU|h7*LEE&13mlOqx(s6+>9LhS46Z|`^mIow zdKhaKxVuwJuJaO)APQ=~Sqty;=oUI~Iw`hal7sQ2*|a(vPM8ivDP9xO6Hf10zEr|N zI$T|8b*2@Ds42;TcrKR4T7^DDV|BMO5y2uFM-MqxOofA_rwuD&nvU*A67)pi~IX+0hb)|Hz-rkI-H z*p?hDrh*OOGL{@-RamePYAzy2vaO&1MfZo%wZ9KJ$fv_fF)N+T_^_%5zy!b?_Rr{2 zKt)teL2iKt+b(2)_0B{WQF*IPpeF6;rcKE;zoKM;zm&jUp5;z4g3`)$EY5+$bEYt?k&bU{v77$j0 zOn;q`<>lb6$W#H})T}BZcglRbZ>QrPa$KKdT_3b|DzCu*L6H2NQ2xvQJp13L6IK** zlX$+$n~YPxhrFiUJ0xKMcwrX(&!CfQg$2;1-!wtRlH;a5Vi-|dQ=VS^nx=0{2Z)0afrslHA83FI|sw# zf~VH|*hs3^jW;{RP{{8f_bA)h-aps@OEumf3HU>b37a0ScAw{DI}n+^j+Q1x)1rY) zTl+ZsIP9Yx!)>vmowO|*h^wkS7b>&2!{e-8)$9V>f|Xw#IdFcgd($BMI_kR#%k$)+ zB*b8ENBA7O7^O14l~T;elPRN6dd9M?ok5*!ZOX1*wxuEB$`XQ7*j0g>df|Q&X6QU5 z94_F*4YNzosf{QVe^mY$j*p4~;|f(BlI0`FJ^GZSTo12Cw2sR1LGdyy8mRsZh<)|0 zpe-KMCGFH*!12XTArN%x24p4OYN^$|5IlvY7o=A7+kgh{go$=Ogt%wsl8>+hnMdE55%1x0nW^j`jD5BTSRl!WURueG#!Pu`d{;1UFp^I{hLmZ?hwE zC$4rP@Ucy){%GEg${)q~N5z0Sud){~T%Q!RgQ~P@x2RyH>L)O2ig;*iJJvm4uZp`5 ziYi+a6&AwM(CU9ES@^+^j10MqQNW40qoW^{s~->gK7$ms;}}&MVK~s<2!GBS;8Rsa z72jg2)x|$Q2CKSyF}ojL1=2S_CkDpb!FV@m#$N%G0?o5Wilf^xh}Wd{!eKsbWn^ZRdxqkK8Si<>r!N~R%# zEyXP8#Oh1c&)Nx}Wj%?dJ5L3C;@yzHJ5*V}N>{4?Qhgk%@i)Jb5ktpTP(?+T#Ls?K zfh34RKK>IQlLQ1s>LjIsU~o7-LL5YE(n#ENVhkvy7#<|?iYNUL|KeGb4T~-YfeK<70Nfp=M2N7~#?C-&DU( z!tmW#FuEQ#!X@anT>W(QyO5t9Y$Gxa9wYlz6h_haKcMef#QILJMJSPXU-B^Mete*p zJ5quiMCu_ymzXzLk^Rf5hh(yCoiZS`0 zKF{r%zkfk?EQUB=3?k`9M1Ozx@95)gh?4#epL0kyGyU>y&ssM ztQ-PCvjqn4I-fgC-vJ(m4968-cUa389hh%H>x&4EX<9)=bmSlTpB@r^h@==7g zv{Osur%EnRKK;~Bm&g2htao|{5s(ymd1l?BfgX_xqD0?Vt!FDF3zmG5V?-?^N7&yS zP~+Om2(P~)2h;;l>E;z!XpSVC%QUf34~g$Vmd2?A7JAW&HCXRKLJr1fbm?9;!N;eF zJSU7#6LdN7JlMQV7@uyg`P!iu`)Q0ywO-Kt(dT25F+PMMf{a%*IuVZPp?7E;X1Gch zS?Aw*BlUOcJ!-|Pu6idQss*Gg?RT9^HSJOwt1oKo*RJy>Reh5ctYXo?-Nt|Y8cC;y zm;*G)b@(v5n8#%u?2j`7$muE2Cn81Yb{jg|OLhjj1Ytr;y15pLl4Ne@nPJ@c^ZFj{ zrkFE2dRnj${lOCk*9>cMO1NO zCuH?ep_SgQ+Z9IJ^cok zt`*lJ7sUZ7`e84n&=&P936H6~aR#?wx`E^8Xe9gTR2-@{g(#=p&z@6FY$cR8Rhj+7 zc&qEotLi*ugEcC$u^_3m9&%W06rRMsLSb-r7&A#Y4LO)3i?WziS{DnPVi}!5(AZN? z7#*Uq#}f%F6h@M$DRpb1gd}apr%xi=m6;hu5*yuYLkO;kqV5jJqIRvU8(U4J@GULp z4}?_A6P*Lcqj|%5iJ#Xn7o3-uuTu;W=Z(wf6f?tl(;Lp4-|##ZhI#KN%pdo+E}s(~ zj`KD;U&gL+-oAXD@*8m8v3yQgC(hv**4_u)5$A|;*7^?&4d+;%j`K79?>T)P_y(?H zDI>1e@Bp0moxTn~6X*T>yyidQ96M3t{+ex#bL4&Fyk@K7+{>M;*=0B%;@4~T4$g=9 zc}*YV9J@~A`I;`m`6xfH$#~V8=Dh<2{d&Pdy5oL(&iu7go*h7C>ZGwY~Euy zzMHszH)!R}%MudO9*&&n!2w`E3ISnMypn$}WmzPrOJh93Z9QStB z0{$-{e#b(U zgkXUr!sNnVs8S1aP0O;FuFJ7)+*O6uCrXLG?i^gDgFq4G&CA+jJX|gGo&lXipBCj z#ZvX4;kLVOQ+U!feYT;ObGfO;NGw-rjH#OVWf9rm=%_W;j@VhQA&a$z$P}ut(qHZp=1yW!tb!B@qL-b}7qnW4)=Hs(SS|zQT!H$Y4bnw`$AjJdQ<#G@H_SF~1zh|MF# zWnI+W&*{{ABS`0TJEi8ucuw3&tjZ#VzL1H*46a+nkaeaSNaaF)Kd8xU^e#7o24Hch zl8kiC6rgvgT>bONqt6&R@*%M~Tz3{~tucvx3WC|JADEO8vhmbHw%ft3SF&L^*SXGa zRo#uHL(tpCx1g-8s2OcbR$AJ6Ls@Le71Z42TTFjY4JLh|OfcRR@9d7ZMXi`c*`A;u zO-{_l2L~&$V9JU`^s9`ghrmEL@KA9v0s8Jx4`!SmYp<;?aiy*Km?9r z$c|1lhngH9(pY}wvpUR>=_@s~_Strj=?4tiAF*t`G}PK-`yEv}fL(P%-}eRVU`&lP zHAIJ!*gzxM8_hIorX92$d&1ByaBieGuIqN4t`*8r)F}bU!wZ5-lfrLA0h+TN9;Jhk zBG98!GlVJ12{&epT*DO$Ly_VQf0v95BrJ4C!#w|_)EDmUsemu}>RN9Hqv23oOh9!i zF;|8yFXiK~(-SOY-40nK8uhC55k;=kdrLibJR1&WT-$atUyg^^U)lILrzh!9u5Q52 zbp(-kk?!w|>J;cvVow|Co+8%PV+nqi*4X2N6zG(HgS~kZqPGi(SscI)x*zg( zLHjWH_#`%`m9a4`)$T^^4$j-RV47u2GchgI^Qh-hzZdm()XBx8`WnWo`a`IH9CdpB)08nmYd7AYQ%ceqVWNg90#i$&<;fMEXdsCLa>WmM z$PC_%NyRCl;$%5;n0kk#iaI`>>wE8q$Ku<5YFa zP!Luzu#1N(`x2HLu(9(^NYWL_I)r^2RQW+28`fB00Nq{_@EhkCO)0C027ff+w@MAh zS;pu(MP86qi1bvz&aX8WjP;3lutzp@BWfqcT5j$sL24b!) z%|)$zWJ6sptaX&*hS9xxYhXPojP+VwqO|7bVt=IFTw@w*`CgGK)_A-irjXm6gFQ8h zy-D_Bx8(;;3YWv{xQ9>qHK4h7ahkgZ^l%V#LF*OYM_S{9AQm2Nt|x!Ap8U~TLz)`W zD;n;ghC4iul>#K*YHwQQJ%cwA)N=8F*ysD0tBKB9GR)OjxOF|6( zTZI+~RJ11Gz#_IQK^V}AVB5YF)_!RrY%8T|$c6ynss2bRrloU>G>MB_u|ufgGY%WA z{WpJ8R`S%Cua76E8WP#j-bSCKVh#Tf6V3uweJuEc|AyUsEZif;*pup9v?(IfLZODH zIrWP&R>7*;fR%>0lU2$rM2>=OT5jC02g1I9FDvUlH)Qn;WBaMgkhb7=>|!Eg7!&7V zg{SnIqFg2`=N2cE$)ug`$jd;V`1)DF7I%y1!EbIy#Pw1v0r)FnE4J~(41Wma^O(o$ zF`w6?zPx7kdbB0bmY{n;1(0`8aMz>u3Dh8ej)Pzhabi4%+Q+#3!OBAtDiyBMdT6#Y zSSbQ}K-k8GpGk%=?PEvIrVGF$4->Vw2hm;Fsw6-lfoOd!2nDkSOM}Y~wM&KW=wJYV zDMyAtVqC)ZvuG%lu~8`eS8Py&9|l;+&7Taw!fuyuQx?E4@wa%P49TM+$fO#8e87+G zbV_hnVTl6hYx9{A(JK3_Av9sjPe~rZ1`ew9vV=?#F#x-^-k+p28`!N(jHLVp#}N%v z6mQ1Q&$TGZL(Cjj zEOZR^5jKuenDsIVop3=e2E#V&bRa+IWhfpiF*%YkW%i0Dw`08wa(aTjs^~jAWEdkN z`la@_%#Uwq>(`W2ohqwCjx&S~Dq6ogQXVgjxcwS+lhskkcc5K~;81~6h=i#ce%A^g zZVah>kDNrZo{I1m>BI%xK$*pq1K{bq1so|ifb#$L;YfSGTtxDUav~@uco5|>6fV1D zl1%anQFR7ftKG3kcPx6cYa`73ZT#03L7($nUTwqsDT+Lg<6a#1y+Ka#b!LPv*C_PN zYO`8$8qjRor;LEO<$Vf>DuJM$tLyFs zz@qmDe6&z4XcZ_$878R-SkjWNim7T$&CBv34E0q>!{~>f)30BlRdl_AlD-~Tr6TRf z#DaTWX8~BNZ+lAri6+YbE(MM43U(4R)dkBrXa<2^VpGD+NO!5O28^kSB|t9K-x%BV z6qdSSZaya1Ii5-$1m-cg@`Z?II z`LVMENZ{tANVXj?2k}u9|)dc!jE8`!+qjA zzd=-yFe7iu^V7*`;zksVBeIk<2p{}UVv1W<6uaVghG}5|MQ&-cPcD%lj1Y76(gpZ? z-w>CDbX2h3-$Mqtj^v<#64PKl;jvhR+hHW`@c0O9=>FP|;-`7gm)dFV2v&CT@6m2#2a`bVL$686u@ez1JRdK@XPTBTWYXmprP$)Q*jaDaoAZct)+P%W0sL@WTn9ox8Jy{O^( zupNllr*mi=1a~Rv= zB1b}o2rH+uyT0o{3#Ai*gVF4=m}Fu}Pw=gcX0#F%+yxFkeu8itd9%g|T4RFktah zNH$bqZU*YHIU(e;zb;@!E-!RjEs6R@ziu0$vD7Nf^tb1clQE8Qld+ySs%cuRE)uZe zt)+rith=teA@8`^{7@tkDS>bDShFnlsiq#pjxZ7AH<^0G$(Ak)1^kJy6|tkX>?Xnq zj$;jqCDw|6XDSQaZ-8RDgAlm1ENKvIkOQAnh;limn}aOHZjR9Uov8JDS|9(W6+9vm z4U`t#hDRE3?16A4vyJ>!ZsU_JSEEf1E61X-0-RjfZlGk)F%&wiGw<}zp*l;?IQe)S z9x0Y;r?8QcWgz;deKHk|)YV0zsYm#szFsWZmKli0a|R5ux|m^wurf)Mw9S$F`bdP5 zsv=&E{5Sk-L#^TryzR)TWm4 z`DC#W&wHkim#~iUaVa1~5{8z=qRMlA`PxM6{Zh*+;#*L069zdOKnmy=@M?M`4&=Vk zD3dLQF?PLG9lcmR3)F#aFUC9ESfdk4nx@6m;VjLtjD(YKYH2TaH6xj=r4I(FWS|og z7Q867X4|MT*_4~-M+&*&`L<%q{76H7cw^gR(NcGPqOPm##){oo-qcl!y)W*@5?V5* zS0rs_pnqm+aBK|7;eY{v(W)CTEHmjiCD-jtj-w|quOjX4c)UFpDLHVzL$FaIuR?@i z*$piBn{fY&Vm9weAh#J>ha zv+DzW6Lu5BaU0P&S7~7$;3^k1I*ub@?99qNnh3PMZsA^};F%hb^8elAE*5x?NjsE5 zDY7Ok4XNV!kyuH^1_wPD^Z`dUS|#a6rcc_8Jr6fy4FOKqLQo+rt(N}sN%6OmRDD{J zW@jbkmUZjy1Hw0~j+-hAAdHE5tv(BD;ltR1Q4YxL#Ov;b0XHa|CGHU8$PGv%PTj-z zr%0T{U=bM4qqBrZ(l&k>*aEB%ggOoz$lDl|+y5LrKu82OI#1N*;S!wGVzw292$OUe z$aHz@0od?o8lkRg8xpXVK1j`3UyE!?uV68qq5Tm;QT#1znv;kt|Fwwi^TN1e2gss& zy`uaHIXsU&hQAV27>>F(Kk zc4;*GuF*cD)mkje+P#jXu{7F7j7E}WV;eBGF`F?4OfVROjd?a}z^n?8hZFNba0uYU zkdP3_0t7Hi2*D;Ez2CXFx@WYR$M@d%k@tPi<5pGOzFpfr_ndRj@;|tZH*Ny^fL8db z*a*L^KBPWMtp5VhpK9PJ;ys0qDp?!lH62yLC8$#2af!k*RllpkVp-rRc_&a5FT?W& zzGgU4{$vS}(Xp?kFo@tb-R^U~9}a&zn`+4=7h!r`6pQyo2~mGG{66H~>d$*rQrXzzk9B3O){ zw(fxZPYPGu#`BWINw?+fnWWC6JS8p>W{bE(Zf2G=Nm`%qKcs*$FnjuuGf1R}@F_GS zSqciPa&eB*qV?*QIYvLp#~IW<5m9nX-kMgcNar@E;8k$~CfpL$tD%+#Iyv70)i0t& zRdrptv>_5^VdS$*8-_QvwSs4?0%$!X8M78A79kk?Tp-{cuI^vkI)80{O-&!$HT|_C zE!ozJ%C6E>NlU7;a(;b9^(S&A$%fHjurZV>wZ&&>50LO2NXLILZ)970c@Ih~JhP*- z{fZ@xNeo%4ePLYA{6EyPez>u2;razF>xLWZhSv8)dOOo) zxzf_^^2ktY3VFR`b8=pJeJULyxoklP+j6%17-1t~M2?AwK~oi$$I&8I+^!g=8PU1&FH;Ea66kup+}EP2 zkasJR^P=Zc4SikhgZ4mId!KJKTA@4=drv{lsd#$}^Xm)gB<{8`vCjZC8$x4j!5U*0+ z|7Ny3*{)-It&GDcGs{fL4aC^Wl)Qo#iIpeXicV|kyo2p^GSiHp_ZSIg5pTV!{ei4T zg|8M(a?P`#?VhcjZ<#)2P5i5uxnf|GIXP!t+uW~~{X;4jOGW+xkpsFFwkiMT>uE_w zJAv46+%E@wKleM~p9g1V!YjhNgQJ*cM}xb=EBwxMF0mLUwK$T9eHlwFE4>8^a>>P5 z6(Y&ufcmN{AQ|q=lj2p|5e$AMJQ@m(hIiP`XgEA7h$h0zRv@Pr*#DkPAeS4}BYD$y zkE+#eS*uCfV_;%LB+EsD#U(~WeEDL`szz!F_?HMEmPI11jZl^&VZDP# z!s&`YjMaL~R~kWV22~LFW1p++c{L@=X%)}bj5=9&^E^bI=&eW;twpNic)HA+k0 zt-A-ysi$M#CyR7qss4k&w}|Z9H)ENUyXPZ<6(b*(funr2mcxi=4eTGz=fW(nHyub`Tr4%C_(O*XR(gar#O^&27glmF7 zBw=5M({Lh28Or`#swol-ba(fJ6HX?V2$WWWy%Sy=3MF{tx=gyWJG>72E-OA#`zks@ zp+-Z0Rq8F)TkYqdzcOxBXzl;=+&?_e#nz*B)d~ni;#e1xhOir(bi0YqTCYiDKC@~C zvr3|tw}`z_Y9k2bge-MCg%=nC5&kJbPMCFIi3M)Te5*%?EwE71Xk14$d9kXX_zohn zq-*oV5udWg-^FR^BgRC|Gx+5jBe7WOloL3dDo3lsl0Y2Pa|CN=DO%z9w)YUM8*Qu{ z!Gd>HG&<~i!5?wn|9;$2FDU!I4+2B|UxC1Xu?A491_No0=&>Ue9PmYcfMJjmY>y*r5iqF=_o^PGOm z?RU!g6hGyB**WKXpXmn+C_h_{X7gQQzKkOC_KxqPD7eoe9cB^eMNE^%Yux6{6Q%`JwA=Guqf;)HeO85X$#!GMKW z)K8d{% zje`(HLHa>kHVCl|#HR}TX`w0#C{}bqe-jP^v7L+ZW6mi`cNvBsb2>Aa0F_9i609CZ_uag=>A~ry>{pXAhGv> z1vDM8-xrMbbT1e_P#TJ+0%f6Cs%8GXnjD~I_T`D@vU1c%-0h%emNq6{eB1`gGg>_z zy#=74z2F2@VGvcXbpi^UHnMpzxi-aKd{0oI$6}>3y>Fw~ zuWPL#FQFctDUI;&L<3%huX56Qn=Cqw-H!Y+__(ZLB)9JhZL5>)zazrgwdd$+@e5r& z$8)qt8urX-*e4D9jOR#FQbbOi;W9pL8N^$}nOO*-kxg=D(a*0$N86-ZWD&HDmhC9s zCZ5}9+YEyaKE<5wIg1!vvZci%P=J=jKnnk7;1C8V?Os1`#cvQs3Qi>x!D?WgI1Acb zma2s_Gha^TSU;X7^n1|h7XT9H#piaGWrNmPg~ok0kc{tiz9SwIM{RxBbsu(1gTZG> zOMCQLECVwi3cYKQ?Hp(6s)$bTtvPrQeeR&+oYdZxB)TlI{EcaQA6XTF7atHDTeZUH zn_#6p;rxv_limqzwufMXCHw9-2)ga7ZQq?|8J?b*-+(XlUO4Rz-tH6D%?AGo7ZY#y zb<8iU3haH1uKU>|zJPbx#=Ddt|NZQrX8$z%A7lSE_T~HcvVE`U!xB;>8PoUhxsN&b zL59m%WKXj9PJO};GH{@r!rkTN%e%(BDk4~`&}hio@`_fB^p*@y5#riAEi=+gQdt=A z!y<-=4j<6AC_QUku{ww_*XCK#Gn-K{MRr^m^&+d{qDCqw8j~dkG z?qs>&4pA3mXh(?~Od+^a@se$WtT@8}{ij3SnGEwPn0p7|h}g(M8KE!)0Bm?U$X{cY z-xrVJgANaCaHIJtfi~(|K=#x1*9H@f@vyJIqni>t(P({XX(hGJ=B?-`_wbNrev?bA zb?`A)MiRB*=<0#8F67nH1uSglFPVA1f8N0Ih$_YTkWK_6fwdI=gMF|jelVL%dTt~Ro&})W}%aeJ|S_?Pii?qT(g!Fw`l%u+C@&7_LCM74afu2E^wEhA#69cthl=gL_R0B8`$-fI`k#HC`&r{X9PFse3$)URjf?liF zhSIu=*2`%zInmf_JdRf({H$UQgWDht8w`UJR2Jj#*oBnB1i{4H#mU4aE@p=VY&YnW zYOP3o;C(7i;3Jv7h-9kG^I&-rcwd$;EW=z_}gBi0va*KzEcUWjAY z^zw+N7t=2EV%nueK$lRRlp)tlZl}QIvtn#7M%o=`zU_c(doL&2zKef zl;gN(qRZm>NJWmt3i^fL_2(NX-i4h+>RD9lQ~2%hzjQjz@_^GRRc|o?b#%M#a@U*! zZ~>S1^&m1tpo6Iz=_ldx@0faZmD*h)J0TyO7Alz#*e8j^t$sQ5QUyvY(?} zk}*%SU(3EEV4j4~Nwnry()tRSL3?Q~<^>3@Zrdzp3_9~k=;=q#f&BHU#A0Aig&Y|v)eaumV z)$x|xHO8Js{;{5G%g*WSVX54non@xY=&8GiBVnSqY z>YNXK9&$c7|4Cr?pFmAn&)hFyZ*-8eyu~^o8la@T7BaoAgnE`i3d?92*7PLtlEbvF zFLLF@!h{zaCcF_MS_l!D6li0YSPw0ZYMpX1dmFUc($t`n)U=x7GU%u*UN}w0Ni+Nq z900eT&qVygLO$Xio&$zZ4fqL4349jMuMU@E4n2Li4;1>kT3N5OV>l-7fet+B@1;D_+IiL zWM=9$9@-uYdy|PFtA9znAz-y22Sr|*Kz4D4O(%0Y3Ke{#z=u+;s8OyH4QJ<3i&-Y; z{MLY7pN&@#e(EpD=9>s40c8S`tRKt+tnK%m463@u`Gn>) zWGgy@P8~&PZhdU@MzK>Ey>TT(>gkQ>rT@+KPoCG)KY5-v>*x9JrPny15>W`9upEu2epin1>?^tgdeQ($s!D7m0UutoeEQur5al?a3%$h&Ud>8LHs*49!x zy0BeO{Q}4Tb31TXcSAHA%qAB(&Y}n~@VV**geWLNyTe4Fvly%>354G2;(q&DCZErg zB2$Wc$Hf(G8<(ZC--u5urqT;)C<()VHHugGO1e-AQlGPewG z*h0Ip4W_Ks>Z#w^e!9?Kt%8dFyx9M|b_gqpokH*lLt4vRhya?lEjV4yiv7s+ zV-2wJ8(NptH6j6E*mYG4Tb-HRfPg;=hkq0h@I&-^r3V83Q=H{-Ux;9>()uWFuRvF4 zpF|zjleJQS1t$pfL&^bWq;kQ$<0^71xi&Mut*Kw0ic|IeQGpA8 z(_FalnVi}QNxuuHV>F1D{GyZ4pF{+DVWFZLhB)-}7%yRcn+!g=2~ z>&SU}9XX1kC;czgem=jx$T4z9=7y0+DQiH_4I`&6)h=^D_h)Vl>bYV1U#eZ6+w@<} z+DG1p>3?3k*f(Z=qrS*o!m{qg&%NCG)EV(-#mU`kVL@_U@ zl%*iwh;~=nbOFe6(bl1-GlAA-K8w;W>pkZ4QgXbR%>8QegyWoWTDJxQTLW)xT~?ne z!RO<%YiovEU3GV}M#gLosQCLF=Y4^h&j!UW|E+nw%61=H(SIh`UJ31EIp;D* zyw;cL)=yhgGY2*mL;C{qMG>p40QcX0XC1en?{%UU&8xJqIq)jwShfDzEvt zu@|S#J|%qo;_YBbpPl)Q^?hh4f~LG)(yE8iRz~ztQ(+55MtH5Hp)W8Tvw<#a;D10f ziZ8NYNI)Tx5fw#3tF;VAMpnhMFx;k|=p05>)I1EMT1COCK-&;k{$8m$_};^Xjv|Ey$;fwhvJ^^i9NM z(O={*s|+(s_K9I{TvU`a*v-ip>6q^na;#{l4`1 z)oSbMv#o{x=eM)Ia(JE`bXkqKUoHW`2EhyQ3Ipkak%;`)m`J@aJ1xf>MQk^U*!~Rg z7{Y*Rq@OSwp-f`bBsLtULK#L8sMB~>od)eEHGa{8xwHuI4Gm)}E&FUTcLS-lB*otC zBx1*t5jBj>zmkZ~na3rSfYez3YlA03B;`!GKKr$BhVclc1i$to6gu988?RK6^ zm}EP#-D3)@!$Q~u4i{su({WOzWTVUa%4zU<+q4m4Mcq!@4Ft4}lMVF3UcFo#RolC* zrlFdYVWPjQ@>QF=)t^F*Gw)uUstDo_DV?`2_Bk3J@jlb6$`CrwN)eG~0d;G>>d+0> z-*$D!;6UfqwKX;QtJ+nlw-pmYX){x9{opg^Y*y-l5-Qk$!)y=@*T~wssi?wT zUjc4IGSjme4IC}DVUG$54j?fjvzn0q#b7)K&R6J88IN6!0z zf$fDbT}Y4XykuyBcI!zW?FG09rmtj*7D0V4>rUkY;5ONIS!1eYAWlMZ_1eaH0U`pU z(QrwmJCcEiN^ref9?PfN*HyQaghMzCNux+5o2ys1r|RQ1)NEdp373?HgXvJD9GG2y zur`uSM>6SPJh-}MWS}8l(Y-5_VCf(9_vv7Shy){)hlBp=h2726Y}*UKZmcgKt;!@a z`Q}99n%WifS8i*&Yt-*hhb)eHJXD@dRn2dk`E@3_PO1WzMyZq-4p0zfcpevAJFkSi z=0ql#B48=BE*2y41Ba%qo^Xk|494ALOL^_QbZgmyTA*Z7_33#{_4!;2kT9Xr(o_^@ zMmUvA2T))D1NKud)G4cosJOub&TecPiRP#wN~CbAuidfNhWw!jk;3_kI)7=t9e3MC zHA9%;bCp^>w=|a8`Rz=KS^VMz3g#j_)Z|aDf_Y1ZzeMMJ zM$D_M-A6QcmS`Qx@4uSuR<^S6xJp(f%V5a@4=x(1jr~J@yus_VhV5=TuVj0*o?2oz zBM4X9&oG~v`~{sUrged43D7CvD9(*gpd#J{>+eGNyDUJwb@u0W!)AB8c6SF`KEF7Y z%BV;(a!c$LyOP<_R3@5?Y)(ix&5H&yd2f))UdKaYq0rbH0Z*32^bg57i9Wol2(NjC zt7iIGWVqSXQWS}$fHD3=TxC*v=1}OC(5~Rjw^>cJ1b1;@D0XtRIZ; zavk!}*onked#QGj=f9)NK)73Gzv@&0k#<~+#AB{AX z5`gKxS%)kPbUDeBJ(FV@XXJRYCy~aWAvo_TF?R55ihi*{9W0 z(&egBY7z?2wT!zNFL;$X)_96~odlkuUMD@H= z8MS@@F5?{i;HBGTy{P-Mo_V=mFPi?BY8SoQ^dDulE%VUyzp%Z0=03sor@zrxlGa_? zc66zB7oPoXy^b3CjnSV@Xr6tE_Om}f`z`fe`h&x%bBdPOHEI%UiwL=S9mL?D!5*O4 zlPS^x4{d>mYL5fTh!A+MI1035L5^B<(i3~)Xutv~Q9up%b(O~m{SKzPD7({_jh2w) zoen1ZT=g6Q;yeBJL0@3R_Bop!yRo03znUBg+sRldEC^c}WxhYfOv8gjM;;2%+#G(G_N(Xxcopw)86`X)iF{zxR@-vk~v z;0pF8>c4Id1P{YLdbrcHv?=9l(Vklf+-lWLyX5-Q2JmFE`Jm4-G4BhersGX#3i zU+g#o%_RUqkqi=0?t|g-1+^uqd}{^Reeq}{h~(UE@3fw^zs)#t<`u?GyaSVq7S_3FtIpskq`z0f>#(E6Dl>tJSi}yj3wL&>)1X5&!kRmTadS=b&cTN`qT}VjxsWmv z4gy$5(bOX$SI~np6WrMf?xXWN5|3m?3EGkAmm&Wek;uy))U!~B5ebUNpbl2yRwb{X zUc}#A>RxJpyt*q{0qlrh#UsfDxr$~$8{#dF(-Nhcbn^yoG#(m30}m!kvWaY6HWFR| z9YcdTySlurp&KH%%jPFC>B@LCO|)1zQSxBArX?K?Vlhl0*_v5K_)9^fK1CG^#>&Gf57W zsSQlp^>NS&!_iuwvm+GU<)3f^yRc~P2q8a=Ts(@L(DKq+sr=TT{?7J^V*it>XHNf1 zwcl9mf6)4w_4VTU&ubUDQFZF$>QTIQH5yMlNm~X=L366p;Y?^b#vD>KyJ@R&uexXE z8#tp>GORirz~?coeM)#7=PUC96{2@Y?19g}(~msh9u}&+eVKYc`Rb!gtw(j+BD>Ri z)c!PfUFeuT=O3rf-e&!a^?u}@u~RIwo2}>V57Xb#{VzB^`=a%{bqCkr`xl?peJ;o` zn?bv>$UZBv{$A@5CF&FUHw&%3YTV9ooxFFvOYO6>9M|jPEb%HI_HE!g z>9c=Nw4mUGE+odS-hR-^VbyHIne!Iw_D@@HMM)jw^HzwmP!Vnnws5uf>`3KnamMVU z#}ZmeWWY`}O^bXZNPM!2dKKFxZ14FiaNFmLJs)nfo!Ma0C${S!ih-+)j%A!mR#UHM z|Mgk}7CQsez_VoOWCYl1X)%R?FW|N^862OsI%o@)z(-}=E)af6lfa+>Z;*LJI0FAm zp)1%GX9a}HoE|%ewtz8@j1x#QBsiyN$>v8Qj#79!)y!!^#mXAM&vS!Lx+XTS(nkW) z(ZIdYSTYbyk7EcMcL7uB&dpD)3+afk*Ze!7!aLjAa*E_`eQfNE#9skX-Y&gU^uy{iX=(P(HEk1=-*CR z3*k50C@=b*gp*4wrPgY)DV0u>iJ8eaBxas}*`mrs+zGliz<$Wdp#7zE+q!{t7%Zqj zeP-E$tb4>C=81 zekyy0uE1{DtzHjZfz1J34xjxdShH{EIIWK_pk1LeYmxf6eH-(&n#h>NtfU1AenW3^I7VWOZ)ovcWLe^GIAHymcsIH#JGNklua7mk%k!rynDq@?i`ncgpE}D84 zY}|iJloOmUb3Jh5FvYJII?mh4=6V58m3Ka1lYuhxoSyy&EAW99Mar+|^7DS z8d!==>5JP@w)wbjXs6@s6wGV_a2)?}+g-lfm6ARW0wZ#>qh{v36o|&ukde5h6#8F3 zHXn(V73eMrh?D9(QfWvc*c%y%)Rod;PJLfEeCtN2VOre@~@* zJYs*y4!qo5P}x+QjJ{(v1hV;YYUSih?5l!y@WqFT44NNyp1f`!X@IY0b^65KH%czO z_LuN%3GBB6Ec7*gi3$DPCXWMClSkSH%R>)^(!5)6&|g(a zRmI9g&EUq4&j*9|O2qEJMr*3ljk)UET{m4G1w?&KL* zgmI(=IP2TNoRcP%Eb6NvFe_RSab0R;4OCb4_7Bx{E^SFlk>Zk;rEhjhGF7Sa+|2#S zx_osMe7)Y6!+YQ};F(wwOdZ-mf;PFeIXu>OshQIGmL4 zj$_x6nJ>}>$+Xm_g`c#{f=TJ+54x&OqmY1W;d%YdVtZ$}<|gX#yM8rz)9U~fi~54$ zJEj{(E2#@sw{mSVtC};>cy)keiBN4iTC+eUA})p!H~bhfh*5LDk^sQt-k}KF~@uKVi-x+zdaFy5EDQ6xHup z_glNtNK7#xV4`K~3Pucom$`uJEUm@TIVEfRQ<&9?6R0dTs9uxGjyXEEV<)A&@APWc zs=&iBGE9gsI39erDbM_F+_ujQVWn90W4yIVuj-`F=eya|uyk~JRuz&E%-s~T-W{CzHLp%>=T$#W zmC%R%8mC3Q@8MABz8NaV!zBEEbake^@aDhsc=Hg(e%{Y0kG>Sn3lJo{coaU+&&=l5kfXj8VN33X4!=)bCE z^t!c+Yu}(BaOQtRsv25zd5P)aIa|-ZU)Q9S3Qt=p*0G*IDV|g0&je4ng(uv?ehFKV zLxk4w>{8+QT0yRt(i3U z7Yoaxy+9Lk4#V3ns4Y9F_LoJ=)Vl8Gfw~0XnNdKgRT6{8|megj1&Zt{JKAPj{en9H|j1;44&4xI)* zNI|_3BAlG`nqcx8#}0n1MhMpqM9TB^{?J$F4IW1MJ>}S!_Xy>Fv1z2c>V;HGU8YFB zCe;dz=QsFBV-5dNGO8Y{$(L3|n=|Prh@!zwo`t0gew8kKvIVPZW-2{&Rd#AA9qJ<3q*o8Apx} zGmm_QT2`K(Dq8AXtyD6*B=%OcQ{kwy8Z5J97DLlB3S*3ztE4uVSod@BFx36AQhyz# z@Pfzcsr-1DGJbvMMY}IVC#6=VR#RKv+-wKXQ)^WsdNO(|%IP_A>ryN8#akj0nJy+a z)*SNwsKtfdwF5yRcVD2PLI|*@#x!Wv5Kblw-=b_2=4Pnl$%-X4EMfD@D?S{GfRtKW zy{YxdVDO>&o2nZsgmc}@rSFKOuwcjR2$WOZldjycWX0}WHZBY~oX)N{_hVE0i~GTM zD2jbSwm`hzo%q0gMvMs0;LBch{R>)byin0whR%`ctG=PPeVknC;JH_&9&XV7_)yQ) zIyIUr>gU%nJm`aYiTTiRGv{(KV_sR$uM<2@ng=1}&YQw{xIAXX3SYUp1pRzaUr`TSR@7n8^)kt-$AgZ)DOSiCq!r3xpY17 zuQM`-G})_DsFkxdzz<)f>bKUC3S(KU^sRCi7WU?`u-DA;*b_w_sO$BqlZ9iMqwvI2 z`q-O89N$>@UTBr$)B3nr|4!Xh{9f0;Q#T7SSvl2=SHk=^#G16;XCG4+w`>xgPTk7oxt*Gy{-hRl6`vfyz{tH_}{sC`4 zYNh@6L*dFV9O4)sv#+owf56+f;Z%R;?fa}7t$+0P{Z?KTejBjfqQ304J64VTxVP_G zd+fjU_JdZ=C#7lRS|O{-SNLt%I_CQ`uRUrt`zM)WlibT`-p<(gS35iT!9VmQ&F$ zy0E|XvA2gF5<@*fMW-WreHPYMBS%i>SB@W_*nhMmzvA%WyzX;6KQ(@QeCp)*K7KjE zt)Adi(`=7om6+1EzJZ%K%E_&f$rDr4lSfxhO&;4Yadg~ju8|SgOQ$1TSMK@-{ljVQ zsDmGju|3V+q2g0@@SJlm(ZL;?i?s7><}w{%E8L)eGtK+y(9boc--O&$2XAXNTG@6k zJb9$!$mtsMV#gkHmmT}K&Gy6GXUC}<4oyt=betTYIzBOZw4-nJ z#_e+Nzvt6(NqNmOByuBp2CjqQlfOlOxR6fDV0?Flt=JG;x`HAECvHbMZ*uL>2V^fFn zlQ*18+14fJkTrJ(oZC&No!rnVZfKHQ^t!H}m^yT7a+2f!hvx7pp5oLwlTKdwEF&?~ z)jD#?Xdq6$ey(FZaPit94UBvLEUe`wu_UGQ}j&3nvxMENM6`nOmH z@3Ves{k!!B;>BNMJ!$=e^$Y7k>v8KptY2Bbrn()o$`9H@D`8U=x)?dT@e{B7f9R7n4+#%+{VHn9nklf3V z5W-qcFiTD{eE)`Ix(VKSGZ|SgM<;m?QDwJUuK;uACuE#_R!QM^N3pa}A?rnpVkN}? zMODl?t1Mzw5-JJWbV`+|v?^6)Dx4H1GPPc9P#e`Ib-CJX{nq*~>z}QEQCFxf>Pod$ZKLe^4z*M5 z!sB$6x>{YMu2t8m>(!XrqxPzOYMgc98MU8E(G#rj{?+<{I;0M(BkHJ{BtrUo>KJnT zJNQZe(fYRaUG*|GrH-p!Koo7BDP z&FVhzp5Ln8rtbG|+O}bXd*bLsSJ#S_?usL0d#5Ikx?^VRtk^R(esbIy(;IiiZavyF`IotWBt;>Zn$$8U`6o!t+Q?wgz*+q-xC=yZ5*ao1V7cZ^dz`^;t~*BP63 zS9uqN2g-$=Rpx@@dJ|q%{B?M|xa+R+Ze!eRomJ+H<9ZWWGkYVE{j>YwHN_Kz_ZN5d zgLn7zc-!8{+Sy-34$SWR*X|jc@*m(IXWjI~;eF%IgxbBy9y_{kVz0AdZ10Kbap$n!cwI)k?WnWCJoI6` z@o(UX{D=9+*<^lobk48(`pvKU2AoaiS4YjOIy!c2^7u3Y>A<*qx%U8*-auS#24Yfg zVwWE{adiLK)QKa9$4*SgCg&bGTg(-w=3KGgd!+tBXN$Swl-XQq`X1Mt$d$9NB656o z-`wqhHz)(W&Q|l|X}$4pm7$oHq1a}I;)EHBZQc`{@Sb3sd4dyq6WBI2addy+g!~)Z zHuwHxC*~fx+q?lhVYZPSv-cG_HD`a`!a7k zWwy?Wj_HZ%!_J7=tTda;&1SRNTwyj_%x27N_L$8+vzauTV`lR*vzgKxE!%y_a2vU; zSVOX=p-lpua{4=4%llXHub*Sl59IqW(iwD}zrjJV0ll12drq8)Yw!B6w ze*Ab>H+q4bL(U=}vh}!{IpPj<>lRv@t)$3+f&`f5{_0qP+tWL#bqLWNWE~~?g6IUI z3tZvJ|Nnbul6woIoh&`)xhsm#E#DWOT0h63@u{P{S@WFo{>+=nG-A)8Y^ME;!n-}xnEPJBpF+#p46R(rUw}8gmHs>UbI`VS(qHr~g~ml-5n9(Z z?7syp7d?cP zK03u_{ym6JU?cOVxUQ`=NqV45ws1Z34088AefLV=y`%45qEeP{m#g>#*Oxy@?UQGa zyZ7n4SNiT9efPG$dj~wPyXb#6fBp-e#6cr`Ki@vapZ|iVa`aO<))&zjU9`lnS^hcC z=F`un^s_no*|3kRah~>wIzoSmCT!wQpvSv-H=-5G$P96%;o_5o^=L$Rj;(0nqVdLg zhHID|a^I!;jw|%Luhs89ukW}{-)oB=fi^t??cD2^(7|N{`t@BdVg#C~b0P2ka(#bW o_5JPEBXE_z%d7P`T*EyI)mvYh`RI3L`%Liux9RPb*Zuqd0{<;-bpQYW literal 0 HcmV?d00001 diff --git a/assets/assfont.ttf b/assets/assfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1070aacda9489240308493094defb23ce0d1bedc GIT binary patch literal 55300 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 M9rKE)`oH@B3kx#np#T5? literal 0 HcmV?d00001 diff --git a/assets/profilepic.png b/assets/profilepic.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6674f63cebc5915e2c5fb819e2cdd0d6af97fe GIT binary patch literal 10264 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¥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%0Dm&v@4taQGLT-zh3S`AeK1 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,GZiO*k^1+ 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

  • -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�Z*cgcU+xX-B5Y!_4h(vT0YYnh^1 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