From 24c5eb9f3bd8d8290a511226f4cc39cb4a46bfae Mon Sep 17 00:00:00 2001 From: Abishnoi69 Date: Thu, 3 Nov 2022 16:22:06 +0530 Subject: [PATCH] =?UTF-8?q?=E1=B4=87x=E1=B4=8F=C9=B4-=E1=B4=A01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/CODEOWNERS | 1 + .github/FUNDING.yml | 5 + .github/README.md | 107 + .github/dependabot.yml | 11 + .github/workflows/pylint.yml | 38 + "ABG/ABISHNOI COPYRIGHT \302\251" | 27 + ABG/covert.py | 42 + ABG/helper.py | 6 + "ABISHNOI COPYRIGHT \302\251" | 28 + Dockerfile | 79 + "Exon/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/__init__.py | 426 +++ Exon/__main__.py | 854 ++++++ Exon/config.py | 127 + Exon/confing.py | 37 + "Exon/core/ABISHNOI COPYRIGHT \302\251" | 27 + .../decorators/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/core/decorators/errors.py | 80 + Exon/core/decorators/permissions.py | 90 + Exon/core/sections.py | 48 + Exon/elevated_users.json | 11 + Exon/events.py | 94 + "Exon/modules/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/modules/__init__.py | 73 + Exon/modules/admin.py | 1113 ++++++++ Exon/modules/adminserv.py | 52 + Exon/modules/afk.py | 202 ++ Exon/modules/alive.py | 81 + Exon/modules/anime.py | 542 ++++ Exon/modules/animequote.py | 183 ++ Exon/modules/antichannel.py | 98 + Exon/modules/antiflood.py | 383 +++ Exon/modules/antilinkedchannel.py | 130 + Exon/modules/antinsfw.py | 201 ++ Exon/modules/antiservice.py | 61 + Exon/modules/approval.py | 258 ++ Exon/modules/arq.py | 62 + Exon/modules/backups.py | 408 +++ Exon/modules/bans.py | 616 +++++ Exon/modules/blacklist.py | 508 ++++ Exon/modules/blacklist_stickers.py | 515 ++++ Exon/modules/blacklistusers.py | 171 ++ Exon/modules/books.py | 82 + Exon/modules/callback.py | 202 ++ Exon/modules/carbon.py | 50 + Exon/modules/chatbot.py | 205 ++ Exon/modules/cleaner.py | 285 ++ Exon/modules/connection.py | 463 ++++ Exon/modules/cust_filters.py | 608 ++++ Exon/modules/dbcleanup.py | 209 ++ Exon/modules/debug.py | 86 + Exon/modules/dev.py | 225 ++ Exon/modules/disable.py | 375 +++ Exon/modules/disasters.py | 585 ++++ Exon/modules/error_handling.py | 140 + Exon/modules/errors.py | 148 + Exon/modules/eval.py | 160 ++ Exon/modules/extras.py | 208 ++ Exon/modules/feds.py | 2455 +++++++++++++++++ Exon/modules/forcesubs.py | 225 ++ Exon/modules/get_common_chats.py | 77 + Exon/modules/gifhelp.py | 15 + Exon/modules/ginfo.py | 101 + Exon/modules/github.py | 72 + Exon/modules/global_bans.py | 599 ++++ Exon/modules/google.py | 150 + Exon/modules/gtranslator.py | 105 + .../helper_funcs/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/modules/helper_funcs/__init__.py | 1 + Exon/modules/helper_funcs/alternate.py | 66 + Exon/modules/helper_funcs/anonymous.py | 140 + Exon/modules/helper_funcs/chat_status.py | 489 ++++ Exon/modules/helper_funcs/decorators.py | 202 ++ Exon/modules/helper_funcs/extraction.py | 195 ++ Exon/modules/helper_funcs/filters.py | 72 + Exon/modules/helper_funcs/git_api.py | 114 + Exon/modules/helper_funcs/handlers.py | 157 ++ Exon/modules/helper_funcs/misc.py | 201 ++ Exon/modules/helper_funcs/msg_types.py | 235 ++ Exon/modules/helper_funcs/readable_time.py | 48 + Exon/modules/helper_funcs/regex_helper.py | 46 + Exon/modules/helper_funcs/string_handling.py | 316 +++ .../telethn/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/modules/helper_funcs/telethn/__init__.py | 36 + .../helper_funcs/telethn/chatstatus.py | 129 + Exon/modules/heroku.py | 143 + Exon/modules/ids.py | 81 + Exon/modules/imgeditor.py | 478 ++++ Exon/modules/is_karma_mongo.py | 47 + Exon/modules/json.py | 85 + Exon/modules/karma.py | 193 ++ Exon/modules/live_stats.txt | 69 + Exon/modules/locks.py | 653 +++++ Exon/modules/log_channel.py | 231 ++ Exon/modules/logomaker.py | 336 +++ Exon/modules/misc.py | 413 +++ Exon/modules/modules.py | 210 ++ .../mongo/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/modules/mongo/chatbot_mongo.py | 57 + Exon/modules/mongo/couples_mongo.py | 49 + Exon/modules/mongo/karma_mongo.py | 119 + Exon/modules/mongo/karma_toggle.py | 117 + Exon/modules/mongo/nsfw_mongo.py | 50 + Exon/modules/music_button.py | 176 ++ Exon/modules/muting.py | 354 +++ Exon/modules/neko.py | 119 + Exon/modules/nekostrings.py | 86 + Exon/modules/nhentai.py | 81 + Exon/modules/nightmode.py | 164 ++ Exon/modules/notes.py | 627 +++++ Exon/modules/paste.py | 88 + Exon/modules/ping.py | 133 + Exon/modules/pokedex.py | 42 + Exon/modules/purge.py | 107 + Exon/modules/quote.py | 137 + Exon/modules/raid.py | 356 +++ Exon/modules/reactions.py | 253 ++ Exon/modules/readme.md | 41 + Exon/modules/reminders.py | 262 ++ Exon/modules/remote_cmds.py | 550 ++++ Exon/modules/reporting.py | 324 +++ Exon/modules/reverse.py | 235 ++ Exon/modules/rmbg.py | 116 + Exon/modules/rules.py | 176 ++ Exon/modules/sed.py | 181 ++ Exon/modules/sfw.py | 507 ++++ Exon/modules/shell.py | 76 + Exon/modules/shippering.py | 103 + Exon/modules/speed_test.py | 93 + Exon/modules/spin.py | 276 ++ .../modules/sql/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/modules/sql/__init__.py | 48 + Exon/modules/sql/afk_redis.py | 46 + Exon/modules/sql/antichannel_sql.py | 89 + Exon/modules/sql/antiflood_sql.py | 171 ++ Exon/modules/sql/antilinkedchannel_sql.py | 142 + Exon/modules/sql/approve_sql.py | 85 + Exon/modules/sql/blacklist_sql.py | 223 ++ Exon/modules/sql/blacklistusers_sql.py | 90 + Exon/modules/sql/blsticker_sql.py | 223 ++ Exon/modules/sql/cleaner_sql.py | 227 ++ Exon/modules/sql/connection_sql.py | 230 ++ Exon/modules/sql/cust_filters_sql.py | 422 +++ Exon/modules/sql/disable_sql.py | 129 + Exon/modules/sql/feds_sql.py | 912 ++++++ Exon/modules/sql/forceSubscribe_sql.py | 70 + Exon/modules/sql/global_bans_sql.py | 191 ++ Exon/modules/sql/kuki_sql.py | 73 + Exon/modules/sql/locks_sql.py | 292 ++ Exon/modules/sql/log_channel_sql.py | 180 ++ Exon/modules/sql/nightmode_sql.py | 42 + Exon/modules/sql/notes_sql.py | 211 ++ Exon/modules/sql/nsfw_sql.py | 73 + Exon/modules/sql/nsfw_watch_sql.py | 66 + Exon/modules/sql/pin_sql.py | 97 + Exon/modules/sql/raid_sql.py | 73 + Exon/modules/sql/remind_sql.py | 140 + Exon/modules/sql/reporting_sql.py | 115 + Exon/modules/sql/rules_sql.py | 79 + Exon/modules/sql/userinfo_sql.py | 100 + Exon/modules/sql/users_sql.py | 258 ++ Exon/modules/sql/warns_sql.py | 341 +++ Exon/modules/sql/welcome_sql.py | 508 ++++ Exon/modules/stickers.py | 971 +++++++ Exon/modules/tagall.py | 128 + Exon/modules/telegraph.py | 128 + Exon/modules/telethon.py | 97 + Exon/modules/truthdare.py | 44 + Exon/modules/tts.py | 88 + Exon/modules/ud.py | 48 + Exon/modules/userinfo.py | 224 ++ Exon/modules/users.py | 240 ++ Exon/modules/wallpaper.py | 81 + Exon/modules/warns.py | 601 ++++ Exon/modules/watchorder.py | 58 + Exon/modules/webss.py | 55 + Exon/modules/welcome.py | 1350 +++++++++ Exon/modules/wiki.py | 79 + Exon/modules/write.py | 35 + Exon/modules/ytmusic.py | 148 + Exon/modules/zip.py | 219 ++ Exon/modules/zombies.py | 107 + "Exon/resources/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/resources/ArmWrestler.ttf | Bin 0 -> 87360 bytes Exon/resources/Asau.ttf | Bin 0 -> 33268 bytes .../TheConfessionFullRegular-8qGz.ttf | Bin 0 -> 30372 bytes Exon/resources/Vampire_Wars.ttf | Bin 0 -> 69116 bytes Exon/resources/default.ttf | Bin 0 -> 136076 bytes "Exon/utils/ABISHNOI COPYRIGHT \302\251" | 27 + "Exon/utils/Logo/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/utils/Logo/Another Danger - Demo.otf | Bin 0 -> 42120 bytes .../Logo/Another Danger Slanted - Demo.otf | Bin 0 -> 45572 bytes Exon/utils/Logo/Chopsic.otf | Bin 0 -> 24264 bytes Exon/utils/Logo/CloisterBlack.ttf | Bin 0 -> 71800 bytes Exon/utils/Logo/Deadly Advance Italic.otf | Bin 0 -> 15828 bytes Exon/utils/Logo/Deadly Advance Italic.ttf | Bin 0 -> 15828 bytes Exon/utils/Logo/Deadly Advance.otf | Bin 0 -> 14928 bytes Exon/utils/Logo/Deadly Advance.ttf | Bin 0 -> 14928 bytes Exon/utils/Logo/Maghrib.ttf | Bin 0 -> 81788 bytes Exon/utils/Logo/No Surrender Italic.otf | Bin 0 -> 15648 bytes Exon/utils/Logo/No Surrender Italic.ttf | Bin 0 -> 15648 bytes Exon/utils/Logo/No Surrender.otf | Bin 0 -> 14972 bytes Exon/utils/Logo/No Surrender.ttf | Bin 0 -> 14972 bytes .../RemachineScriptPersonalUseOnly-yZL3.ttf | Bin 0 -> 194052 bytes Exon/utils/Logo/Respective-VP6y.ttf | Bin 0 -> 74396 bytes Exon/utils/Logo/Roboto-Medium.ttf | Bin 0 -> 160696 bytes Exon/utils/Logo/Roboto-Regular.ttf | Bin 0 -> 158604 bytes .../utils/Logo/Stranger back in the Night.ttf | Bin 0 -> 260644 bytes Exon/utils/Logo/True Lies.ttf | Bin 0 -> 62660 bytes Exon/utils/Logo/Vampire Wars Italic.otf | Bin 0 -> 60928 bytes Exon/utils/Logo/Vampire Wars Italic.ttf | Bin 0 -> 60928 bytes Exon/utils/Logo/Vampire Wars.otf | Bin 0 -> 69116 bytes Exon/utils/Logo/Vampire Wars.ttf | Bin 0 -> 69116 bytes Exon/utils/Logo/beyond-wonderland.regular.ttf | Bin 0 -> 176320 bytes Exon/utils/Logo/default.ttf | Bin 0 -> 136076 bytes Exon/utils/Logo/go3v2.ttf | Bin 0 -> 21872 bytes Exon/utils/__init__.py | 31 + .../ABISHNOI COPYRIGHT \302\251" | 27 + Exon/utils/aiodownloader/__init__.py | 25 + Exon/utils/aiodownloader/downloader.py | 158 ++ Exon/utils/carbon.py | 40 + Exon/utils/dbfunctions.py | 52 + Exon/utils/dict_error.py | 78 + Exon/utils/errors.py | 84 + Exon/utils/exceptions.py | 34 + Exon/utils/fetch.py | 44 + Exon/utils/formatter.py | 59 + Exon/utils/functions.py | 162 ++ Exon/utils/inlinehelper.py | 484 ++++ Exon/utils/pastebin.py | 50 + Exon/utils/permissions.py | 86 + Exon/utils/pluginhelp.py | 374 +++ Exon/utils/pluginhelpers.py | 485 ++++ Exon/utils/progress.py | 69 + .../resources/ABISHNOI COPYRIGHT \302\251" | 27 + .../ImageEditor/ABISHNOI COPYRIGHT \302\251" | 27 + Exon/utils/resources/ImageEditor/edit_1.py | 269 ++ Exon/utils/resources/ImageEditor/edit_2.py | 416 +++ Exon/utils/resources/ImageEditor/edit_3.py | 192 ++ Exon/utils/resources/ImageEditor/edit_4.py | 429 +++ Exon/utils/resources/ImageEditor/edit_5.py | 442 +++ Exon/utils/saavnhelp.py | 36 + Exon/utils/tools.py | 82 + LICENSE | 21 + Procfile | 1 + app.json | 213 ++ config.py | 1 + heroku.yml | 5 + requirements.txt | 105 + 249 files changed, 42591 insertions(+) create mode 100644 .github/CODEOWNERS create mode 100644 .github/FUNDING.yml create mode 100644 .github/README.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/pylint.yml create mode 100644 "ABG/ABISHNOI COPYRIGHT \302\251" create mode 100644 ABG/covert.py create mode 100644 ABG/helper.py create mode 100644 "ABISHNOI COPYRIGHT \302\251" create mode 100644 Dockerfile create mode 100644 "Exon/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/__init__.py create mode 100644 Exon/__main__.py create mode 100644 Exon/config.py create mode 100644 Exon/confing.py create mode 100644 "Exon/core/ABISHNOI COPYRIGHT \302\251" create mode 100644 "Exon/core/decorators/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/core/decorators/errors.py create mode 100644 Exon/core/decorators/permissions.py create mode 100644 Exon/core/sections.py create mode 100644 Exon/elevated_users.json create mode 100644 Exon/events.py create mode 100644 "Exon/modules/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/modules/__init__.py create mode 100644 Exon/modules/admin.py create mode 100644 Exon/modules/adminserv.py create mode 100644 Exon/modules/afk.py create mode 100644 Exon/modules/alive.py create mode 100644 Exon/modules/anime.py create mode 100644 Exon/modules/animequote.py create mode 100644 Exon/modules/antichannel.py create mode 100644 Exon/modules/antiflood.py create mode 100644 Exon/modules/antilinkedchannel.py create mode 100644 Exon/modules/antinsfw.py create mode 100644 Exon/modules/antiservice.py create mode 100644 Exon/modules/approval.py create mode 100644 Exon/modules/arq.py create mode 100644 Exon/modules/backups.py create mode 100644 Exon/modules/bans.py create mode 100644 Exon/modules/blacklist.py create mode 100644 Exon/modules/blacklist_stickers.py create mode 100644 Exon/modules/blacklistusers.py create mode 100644 Exon/modules/books.py create mode 100644 Exon/modules/callback.py create mode 100644 Exon/modules/carbon.py create mode 100644 Exon/modules/chatbot.py create mode 100644 Exon/modules/cleaner.py create mode 100644 Exon/modules/connection.py create mode 100644 Exon/modules/cust_filters.py create mode 100644 Exon/modules/dbcleanup.py create mode 100644 Exon/modules/debug.py create mode 100644 Exon/modules/dev.py create mode 100644 Exon/modules/disable.py create mode 100644 Exon/modules/disasters.py create mode 100644 Exon/modules/error_handling.py create mode 100644 Exon/modules/errors.py create mode 100644 Exon/modules/eval.py create mode 100644 Exon/modules/extras.py create mode 100644 Exon/modules/feds.py create mode 100644 Exon/modules/forcesubs.py create mode 100644 Exon/modules/get_common_chats.py create mode 100644 Exon/modules/gifhelp.py create mode 100644 Exon/modules/ginfo.py create mode 100644 Exon/modules/github.py create mode 100644 Exon/modules/global_bans.py create mode 100644 Exon/modules/google.py create mode 100644 Exon/modules/gtranslator.py create mode 100644 "Exon/modules/helper_funcs/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/modules/helper_funcs/__init__.py create mode 100644 Exon/modules/helper_funcs/alternate.py create mode 100644 Exon/modules/helper_funcs/anonymous.py create mode 100644 Exon/modules/helper_funcs/chat_status.py create mode 100644 Exon/modules/helper_funcs/decorators.py create mode 100644 Exon/modules/helper_funcs/extraction.py create mode 100644 Exon/modules/helper_funcs/filters.py create mode 100644 Exon/modules/helper_funcs/git_api.py create mode 100644 Exon/modules/helper_funcs/handlers.py create mode 100644 Exon/modules/helper_funcs/misc.py create mode 100644 Exon/modules/helper_funcs/msg_types.py create mode 100644 Exon/modules/helper_funcs/readable_time.py create mode 100644 Exon/modules/helper_funcs/regex_helper.py create mode 100644 Exon/modules/helper_funcs/string_handling.py create mode 100644 "Exon/modules/helper_funcs/telethn/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/modules/helper_funcs/telethn/__init__.py create mode 100644 Exon/modules/helper_funcs/telethn/chatstatus.py create mode 100644 Exon/modules/heroku.py create mode 100644 Exon/modules/ids.py create mode 100644 Exon/modules/imgeditor.py create mode 100644 Exon/modules/is_karma_mongo.py create mode 100644 Exon/modules/json.py create mode 100644 Exon/modules/karma.py create mode 100644 Exon/modules/live_stats.txt create mode 100644 Exon/modules/locks.py create mode 100644 Exon/modules/log_channel.py create mode 100644 Exon/modules/logomaker.py create mode 100644 Exon/modules/misc.py create mode 100644 Exon/modules/modules.py create mode 100644 "Exon/modules/mongo/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/modules/mongo/chatbot_mongo.py create mode 100644 Exon/modules/mongo/couples_mongo.py create mode 100644 Exon/modules/mongo/karma_mongo.py create mode 100644 Exon/modules/mongo/karma_toggle.py create mode 100644 Exon/modules/mongo/nsfw_mongo.py create mode 100644 Exon/modules/music_button.py create mode 100644 Exon/modules/muting.py create mode 100644 Exon/modules/neko.py create mode 100644 Exon/modules/nekostrings.py create mode 100644 Exon/modules/nhentai.py create mode 100644 Exon/modules/nightmode.py create mode 100644 Exon/modules/notes.py create mode 100644 Exon/modules/paste.py create mode 100644 Exon/modules/ping.py create mode 100644 Exon/modules/pokedex.py create mode 100644 Exon/modules/purge.py create mode 100644 Exon/modules/quote.py create mode 100644 Exon/modules/raid.py create mode 100644 Exon/modules/reactions.py create mode 100644 Exon/modules/readme.md create mode 100644 Exon/modules/reminders.py create mode 100644 Exon/modules/remote_cmds.py create mode 100644 Exon/modules/reporting.py create mode 100644 Exon/modules/reverse.py create mode 100644 Exon/modules/rmbg.py create mode 100644 Exon/modules/rules.py create mode 100644 Exon/modules/sed.py create mode 100644 Exon/modules/sfw.py create mode 100644 Exon/modules/shell.py create mode 100644 Exon/modules/shippering.py create mode 100644 Exon/modules/speed_test.py create mode 100644 Exon/modules/spin.py create mode 100644 "Exon/modules/sql/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/modules/sql/__init__.py create mode 100644 Exon/modules/sql/afk_redis.py create mode 100644 Exon/modules/sql/antichannel_sql.py create mode 100644 Exon/modules/sql/antiflood_sql.py create mode 100644 Exon/modules/sql/antilinkedchannel_sql.py create mode 100644 Exon/modules/sql/approve_sql.py create mode 100644 Exon/modules/sql/blacklist_sql.py create mode 100644 Exon/modules/sql/blacklistusers_sql.py create mode 100644 Exon/modules/sql/blsticker_sql.py create mode 100644 Exon/modules/sql/cleaner_sql.py create mode 100644 Exon/modules/sql/connection_sql.py create mode 100644 Exon/modules/sql/cust_filters_sql.py create mode 100644 Exon/modules/sql/disable_sql.py create mode 100644 Exon/modules/sql/feds_sql.py create mode 100644 Exon/modules/sql/forceSubscribe_sql.py create mode 100644 Exon/modules/sql/global_bans_sql.py create mode 100644 Exon/modules/sql/kuki_sql.py create mode 100644 Exon/modules/sql/locks_sql.py create mode 100644 Exon/modules/sql/log_channel_sql.py create mode 100644 Exon/modules/sql/nightmode_sql.py create mode 100644 Exon/modules/sql/notes_sql.py create mode 100644 Exon/modules/sql/nsfw_sql.py create mode 100644 Exon/modules/sql/nsfw_watch_sql.py create mode 100644 Exon/modules/sql/pin_sql.py create mode 100644 Exon/modules/sql/raid_sql.py create mode 100644 Exon/modules/sql/remind_sql.py create mode 100644 Exon/modules/sql/reporting_sql.py create mode 100644 Exon/modules/sql/rules_sql.py create mode 100644 Exon/modules/sql/userinfo_sql.py create mode 100644 Exon/modules/sql/users_sql.py create mode 100644 Exon/modules/sql/warns_sql.py create mode 100644 Exon/modules/sql/welcome_sql.py create mode 100644 Exon/modules/stickers.py create mode 100644 Exon/modules/tagall.py create mode 100644 Exon/modules/telegraph.py create mode 100644 Exon/modules/telethon.py create mode 100644 Exon/modules/truthdare.py create mode 100644 Exon/modules/tts.py create mode 100644 Exon/modules/ud.py create mode 100644 Exon/modules/userinfo.py create mode 100644 Exon/modules/users.py create mode 100644 Exon/modules/wallpaper.py create mode 100644 Exon/modules/warns.py create mode 100644 Exon/modules/watchorder.py create mode 100644 Exon/modules/webss.py create mode 100644 Exon/modules/welcome.py create mode 100644 Exon/modules/wiki.py create mode 100644 Exon/modules/write.py create mode 100644 Exon/modules/ytmusic.py create mode 100644 Exon/modules/zip.py create mode 100644 Exon/modules/zombies.py create mode 100644 "Exon/resources/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/resources/ArmWrestler.ttf create mode 100644 Exon/resources/Asau.ttf create mode 100644 Exon/resources/TheConfessionFullRegular-8qGz.ttf create mode 100644 Exon/resources/Vampire_Wars.ttf create mode 100644 Exon/resources/default.ttf create mode 100644 "Exon/utils/ABISHNOI COPYRIGHT \302\251" create mode 100644 "Exon/utils/Logo/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/utils/Logo/Another Danger - Demo.otf create mode 100644 Exon/utils/Logo/Another Danger Slanted - Demo.otf create mode 100644 Exon/utils/Logo/Chopsic.otf create mode 100644 Exon/utils/Logo/CloisterBlack.ttf create mode 100644 Exon/utils/Logo/Deadly Advance Italic.otf create mode 100644 Exon/utils/Logo/Deadly Advance Italic.ttf create mode 100644 Exon/utils/Logo/Deadly Advance.otf create mode 100644 Exon/utils/Logo/Deadly Advance.ttf create mode 100644 Exon/utils/Logo/Maghrib.ttf create mode 100644 Exon/utils/Logo/No Surrender Italic.otf create mode 100644 Exon/utils/Logo/No Surrender Italic.ttf create mode 100644 Exon/utils/Logo/No Surrender.otf create mode 100644 Exon/utils/Logo/No Surrender.ttf create mode 100644 Exon/utils/Logo/RemachineScriptPersonalUseOnly-yZL3.ttf create mode 100644 Exon/utils/Logo/Respective-VP6y.ttf create mode 100644 Exon/utils/Logo/Roboto-Medium.ttf create mode 100644 Exon/utils/Logo/Roboto-Regular.ttf create mode 100644 Exon/utils/Logo/Stranger back in the Night.ttf create mode 100644 Exon/utils/Logo/True Lies.ttf create mode 100644 Exon/utils/Logo/Vampire Wars Italic.otf create mode 100644 Exon/utils/Logo/Vampire Wars Italic.ttf create mode 100644 Exon/utils/Logo/Vampire Wars.otf create mode 100644 Exon/utils/Logo/Vampire Wars.ttf create mode 100644 Exon/utils/Logo/beyond-wonderland.regular.ttf create mode 100644 Exon/utils/Logo/default.ttf create mode 100644 Exon/utils/Logo/go3v2.ttf create mode 100644 Exon/utils/__init__.py create mode 100644 "Exon/utils/aiodownloader/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/utils/aiodownloader/__init__.py create mode 100644 Exon/utils/aiodownloader/downloader.py create mode 100644 Exon/utils/carbon.py create mode 100644 Exon/utils/dbfunctions.py create mode 100644 Exon/utils/dict_error.py create mode 100644 Exon/utils/errors.py create mode 100644 Exon/utils/exceptions.py create mode 100644 Exon/utils/fetch.py create mode 100644 Exon/utils/formatter.py create mode 100644 Exon/utils/functions.py create mode 100644 Exon/utils/inlinehelper.py create mode 100644 Exon/utils/pastebin.py create mode 100644 Exon/utils/permissions.py create mode 100644 Exon/utils/pluginhelp.py create mode 100644 Exon/utils/pluginhelpers.py create mode 100644 Exon/utils/progress.py create mode 100644 "Exon/utils/resources/ABISHNOI COPYRIGHT \302\251" create mode 100644 "Exon/utils/resources/ImageEditor/ABISHNOI COPYRIGHT \302\251" create mode 100644 Exon/utils/resources/ImageEditor/edit_1.py create mode 100644 Exon/utils/resources/ImageEditor/edit_2.py create mode 100644 Exon/utils/resources/ImageEditor/edit_3.py create mode 100644 Exon/utils/resources/ImageEditor/edit_4.py create mode 100644 Exon/utils/resources/ImageEditor/edit_5.py create mode 100644 Exon/utils/saavnhelp.py create mode 100644 Exon/utils/tools.py create mode 100644 LICENSE create mode 100644 Procfile create mode 100644 app.json create mode 100644 config.py create mode 100644 heroku.yml create mode 100644 requirements.txt diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..1a404806 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +*@Abishnoi1M diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5f88f80f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,5 @@ +# These are supported funding model platforms + +github: ['KingAbishnoi'] +community_bridge: ABG-project +custom: ['https://t.me/Abishnoi_bots', 'https://t.me/AbishnoiMF', 'https://t.me/Abishnoi1M'] diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 00000000..a5e56672 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,107 @@ +━━━━━━━━━━━━━━━━━━━━ +**ᴋɪɴɢ ᴀʙɪsʜɴᴏɪ** + + + + + +

+ ──「 ᴇxᴏɴ ʀᴏʙᴏᴛ 」── +

+ + +

𝖤𝖷𝖮N 𝖱𝖮𝖡𝖮𝖳 ❗️

+ +## 𝘊𝘢𝘵𝘤𝘩 𝘔𝘦 𝘐𝘯 [𝘛𝘎🏃‍♀️](https://t.me/AbishnoiMF) + +## 𝖬𝗒 A𝗅𝗅 𝖡𝗈𝗍𝗌 [𝖡𝖮𝖳𝖲](https://t.me/Abishnoi_bots) + +## ⚡ (ɢɪᴠᴇ sᴛᴀʀ) + +_**ᴀᴠᴀɪʟᴀʙʟᴇ ᴏɴ ᴛᴇʟᴇɢʀᴀᴍ ᴀs [ᴇxᴏɴ ✘ ʀᴏʙᴏᴛ](https://t.me/AbishnoiMF)**_ +━━━━━━━━━━━━━━━━━━━━ +

+ 𝗚𝗥𝗢𝗨𝗣 𝗠𝗔𝗡𝗔𝗚𝗘𝗥 +

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

+ +

+ +

+𝗗𝗘𝗣𝗟𝗢𝗬𝗠𝗘𝗡𝗧 𝗠𝗘𝗧𝗛𝗢𝗗𝗦 +

+ +

+ ⇝ ɪɴsᴛᴀʟʟ ʟᴏᴄᴀʟʟʏ ᴏʀ ᴏɴ ᴀ ᴠᴘs ⇜ +

+ +```console +$ sudo apt upgrade +$ sudo apt install python3-pip +$ git clone https://github.com/Abishnoi69/ExonRobot +$ cd <ʀᴇᴘᴏ ɴᴀᴍᴇ> +$ pip3 install -U -r requirements.txt +$ cd Exon +$ cp config.py +``` + +

+ ᴇᴅɪᴛ config.py ᴡɪᴛʜ ɪɴ ʏᴏᴜʀ ᴏᴡɴ ᴠᴀʟᴜᴇs +

+ +

+ ⇝ ʀᴜɴ ᴅɪʀᴇᴄᴛʟʏ ⇜ +

+ +```console +$ python3 -m Exon +``` + + + + + + +

+ ─「 ᴅᴇᴩʟᴏʏ ᴏɴ ʜᴇʀᴏᴋᴜ 」─ +

+ +

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

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

+ +

+ +

+

+ +

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

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

+ : ➻ + +➥ [𝐀𝖻𝗂𝗌𝗁𝗇𝗈𝗂] × + + +━━━━━━━━━━━━━━━━━━━━ diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..4e729a68 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: +- package-ecosystem: pip + directory: "/" + schedule: + interval: daily + time: "06:00" + timezone: "Asia/Jakarta" + labels: + - "dependencies" + open-pull-requests-limit: 20 diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 00000000..9574b929 --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,38 @@ + +name: PyLint + +on: [push, pull_request] + +jobs: + PEP8: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup Python + uses: actions/setup-python@v1 + with: + python-version: 3.9 + - name: Install Python lint libraries + run: | + pip install autoflake isort black + - name: Remove unused imports and variables + run: | + autoflake --in-place --recursive --remove-all-unused-imports --remove-unused-variables --ignore-init-module-imports . + - name: lint with isort + run: | + isort . + - name: lint with black + run: | + black . + # commit changes + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: 'ᴀsᴜx✨' + commit_options: '--no-verify' + repository: . + commit_user_name: KingAbishnoi + commit_user_email: 72609355+KingAbishnoi@users.noreply.github.com + commit_author: KingAbishnoi <72609355+KingAbishnoi+@users.noreply.github.com> + + diff --git "a/ABG/ABISHNOI COPYRIGHT \302\251" "b/ABG/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/ABG/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/ABG/covert.py b/ABG/covert.py new file mode 100644 index 00000000..d9c8a405 --- /dev/null +++ b/ABG/covert.py @@ -0,0 +1,42 @@ +import cv2 +import ffmpeg + + +def convert_gif(input): + """Function to convert mp4 to webm(vp9)""" + + vid = cv2.VideoCapture(input) + height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT) + width = vid.get(cv2.CAP_PROP_FRAME_WIDTH) + + # check height and width to scale + if width > height: + width = 512 + height = -1 + elif height > width: + height = 512 + width = -1 + elif width == height: + width = 512 + height = 512 + + converted_name = "kangsticker.webm" + + ( + ffmpeg.input(input) + .filter("fps", fps=30, round="up") + .filter("scale", width=width, height=height) + .trim(start="00:00:00", end="00:00:03", duration="3") + .output( + converted_name, + vcodec="libvpx-vp9", + **{ + #'vf': 'scale=512:-1', + "crf": "30" + } + ) + .overwrite_output() + .run() + ) + + return converted_name diff --git a/ABG/helper.py b/ABG/helper.py new file mode 100644 index 00000000..602b04a4 --- /dev/null +++ b/ABG/helper.py @@ -0,0 +1,6 @@ +HELP_IMG = ["https://telegra.ph/file/2ad7c9d508b26c3cc7c09.jpg"] + +START_IMG = ["https://telegra.ph/file/2ad7c9d508b26c3cc7c09.jpg"] + + +PHOTO = ["https://telegra.ph/file/2ad7c9d508b26c3cc7c09.jpg"] diff --git "a/ABISHNOI COPYRIGHT \302\251" "b/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..33e66acd --- /dev/null +++ "b/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,28 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..de3c902f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,79 @@ +# We're using Debian Slim Buster image +FROM python:3.9.6-slim-buster + +ENV PIP_NO_CACHE_DIR 1 + +RUN sed -i.bak 's/us-west-2\.ec2\.//' /etc/apt/sources.list + +# Installing Required Packages +RUN apt update && apt upgrade -y && \ + apt install --no-install-recommends -y \ + debian-keyring \ + debian-archive-keyring \ + bash \ + bzip2 \ + curl \ + figlet \ + git \ + util-linux \ + libffi-dev \ + libjpeg-dev \ + libjpeg62-turbo-dev \ + libwebp-dev \ + linux-headers-amd64 \ + musl-dev \ + musl \ + neofetch \ + php-pgsql \ + python3-lxml \ + postgresql \ + postgresql-client \ + python3-psycopg2 \ + libpq-dev \ + libcurl4-openssl-dev \ + libxml2-dev \ + libxslt1-dev \ + python3-pip \ + python3-requests \ + python3-sqlalchemy \ + python3-tz \ + python3-aiohttp \ + openssl \ + pv \ + jq \ + wget \ + python3 \ + python3-dev \ + libreadline-dev \ + libyaml-dev \ + gcc \ + sqlite3 \ + libsqlite3-dev \ + sudo \ + zlib1g \ + ffmpeg \ + libssl-dev \ + libgconf-2-4 \ + libxi6 \ + xvfb \ + unzip \ + libopus0 \ + libopus-dev \ + && rm -rf /var/lib/apt/lists /var/cache/apt/archives /tmp + +# Pypi package Repo upgrade +RUN apt-get install -y ffmpeg python3-pip curl +RUN pip3 install --upgrade pip setuptools + +ENV PATH="/home/bot/bin:$PATH" + +# make directory +RUN mkdir /Exon/ +COPY . /Exon +WORKDIR /Exon + +# Install requirements +RUN pip3 install -U -r requirements.txt + +# Starting Worker +CMD ["python3","-m","Exon"] diff --git "a/Exon/ABISHNOI COPYRIGHT \302\251" "b/Exon/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..650da6ef --- /dev/null +++ "b/Exon/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/__init__.py b/Exon/__init__.py new file mode 100644 index 00000000..812419f2 --- /dev/null +++ b/Exon/__init__.py @@ -0,0 +1,426 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import logging +import os +import sys +import time + +import httpx +import pymongo +import spamwatch +import telegram.ext as tg +from aiohttp import ClientSession +from motor import motor_asyncio +from odmantic import AIOEngine +from pymongo import MongoClient +from pyrogram import Client +from pyrogram.errors.exceptions.bad_request_400 import ChannelInvalid, PeerIdInvalid +from Python_ARQ import ARQ +from redis import StrictRedis +from telegram import Chat +from telegraph import Telegraph +from telethon import TelegramClient +from telethon.sessions import MemorySession + +from Exon.utils import dict_error as hex + +StartTime = time.time() + +# enable logging +logging.basicConfig( + format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", + handlers=[logging.FileHandler("log.txt"), logging.StreamHandler()], + level=logging.INFO, +) + +LOGGER = logging.getLogger(__name__) + +# if version < 3.6, stop bot. +if sys.version_info[0] < 3 or sys.version_info[1] < 6: + LOGGER.error( + "𝗬𝗼𝘂 𝗠𝗨𝗦𝗧 𝗵𝗮𝘃𝗲 𝗮 𝗽𝘆𝘁𝗵𝗼𝗻 𝘃𝗲𝗿𝘀𝗶𝗼𝗻 𝗼𝗳 𝗮𝘁 𝗹𝗲𝗮𝘀𝘁 3.6! 𝗠𝘂𝗹𝘁𝗶𝗽𝗹𝗲 𝗳𝗲𝗮𝘁𝘂𝗿𝗲𝘀 𝗱𝗲𝗽𝗲𝗻𝗱 𝗼𝗻 𝘁𝗵𝗶𝘀. 𝗕𝗼𝘁 𝗾𝘂𝗶𝘁𝘁𝗶𝗻𝗴.", + ) + sys.exit(1) + +ENV = bool(os.environ.get("ENV", False)) + +if ENV: + TOKEN = os.environ.get("TOKEN", None) + + try: + OWNER_ID = int(os.environ.get("OWNER_ID", None)) + except ValueError: + raise Exception("𝖸𝗈𝗎𝗋 OWNER_ID 𝖾𝗇𝚟 𝗏𝖺𝗋𝗂𝖺𝖻𝗅𝖾 is 𝗇𝗈𝗍 𝖺 𝗏𝖺𝗅𝗂𝖽 𝗂𝗇𝗍𝖾𝗀𝖾𝗋.") + + JOIN_LOGGER = os.environ.get("JOIN_LOGGER", None) + OWNER_USERNAME = os.environ.get("OWNER_USERNAME", None) + + try: + DRAGONS = {int(x) for x in os.environ.get("DRAGONS", "").split()} + DEV_USERS = {int(x) for x in os.environ.get("DEV_USERS", "").split()} + except ValueError: + raise Exception("ʏᴏᴜʀ sᴜᴅᴏ ᴏʀ ᴅᴇᴠ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + DEMONS = {int(x) for x in os.environ.get("DEMONS", "").split()} + except ValueError: + raise Exception("ʏᴏᴜʀ sᴜᴘᴘᴏʀᴛ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + WOLVES = {int(x) for x in os.environ.get("WOLVES", "").split()} + except ValueError: + raise Exception("ʏᴏᴜʀ ᴡʜɪᴛᴇʟɪsᴛᴇᴅ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + TIGERS = {int(x) for x in os.environ.get("TIGERS", "").split()} + except ValueError: + raise Exception("ʏᴏᴜʀ sᴄᴏᴜᴛ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + INFOPIC = bool( + os.environ.get("INFOPIC", False) + ) # Info Pic (use True[Value] If You Want To Show In /info.) + EVENT_LOGS = os.environ.get("EVENT_LOGS", None) # G-Ban Logs (Channel) (-100) + ERROR_LOGS = os.environ.get( + "ERROR_LOGS", None + ) # Error Logs (Channel Ya Group Choice Is Yours) (-100) + WEBHOOK = bool(os.environ.get("WEBHOOK", False)) + ARQ_API_URL = os.environ.get("ARQ_API_URL", None) + ARQ_API_KEY = os.environ.get("ARQ_API_KEY", None) + URL = os.environ.get( + "URL", "" + ) # If You Deploy On Heroku. [URL:- https://{App Name}.herokuapp.com EXP:- https://neko.herokuapp.com] + PORT = int(os.environ.get("PORT", 8443)) + CERT_PATH = os.environ.get("CERT_PATH") + API_ID = os.environ.get( + "API_ID", None + ) # Bot Owner's API_ID (From:- https://my.telegram.org/auth) + API_HASH = os.environ.get( + "API_HASH", None + ) # Bot Owner's API_HASH (From:- https://my.telegram.org/auth) + DB_URL = os.environ.get( + "DATABASE_URL" + ) # Any SQL Database Link (RECOMMENDED:- PostgreSQL & elephantsql.com) + DB_URI = os.environ.get("DATABASE_URL") + + DB_URL2 = os.environ.get("DATABASE_URL2") + DONATION_LINK = os.environ.get("DONATION_LINK") # Donation Link (ANY) + LOAD = os.environ.get("LOAD", "").split() # Don't Change + NO_LOAD = os.environ.get("NO_LOAD", "translation").split() # Don't Change + DEL_CMDS = bool(os.environ.get("DEL_CMDS", False)) # Don't Change + STRICT_GBAN = bool(os.environ.get("STRICT_GBAN", False)) # Use `True` Value + WORKERS = int(os.environ.get("WORKERS", 8)) # Don't Change + BAN_STICKER = os.environ.get( + "BAN_STICKER", "CAADAgADOwADPPEcAXkko5EB3YGYAg" + ) # Don't Change + ALLOW_EXCL = os.environ.get("ALLOW_EXCL", False) # Don't Change + TEMP_DOWNLOAD_DIRECTORY = os.environ.get( + "TEMP_DOWNLOAD_DIRECTORY", "./" + ) # Don't Change + # CASH_API_KEY = os.environ.get("CASH_API_KEY", None) # From:- https://www.alphavantage.co/support/#api-key + TIME_API_KEY = os.environ.get( + "TIME_API_KEY", None + ) # From:- https://timezonedb.com/api + WALL_API = os.environ.get( + "WALL_API", None + ) # From:- https://wall.alphacoders.com/api.php + REM_BG_API_KEY = os.environ.get( + "REM_BG_API_KEY", None + ) # From:- https://www.remove.bg/ + OPENWEATHERMAP_ID = os.environ.get( + "OPENWEATHERMAP_ID", "" + ) # From:- https://openweathermap.org/api + GENIUS_API_TOKEN = os.environ.get( + "GENIUS_API_TOKEN", None + ) # From:- http://genius.com/api-clients + MONGO_DB_URL = os.environ.get( + "MONGO_DB_URL", None + ) # MongoDB URL (From:- https://www.mongodb.com/) + REDIS_URL = os.environ.get("REDIS_URL", None) # REDIS URL (From:- Heraku & Redis) + BOT_ID = int(os.environ.get("BOT_ID", None)) # Telegram Bot ID (EXP:- 1241223850) + SUPPORT_CHAT = os.environ.get( + "SUPPORT_CHAT", None + ) # Support Chat Group Link (Use @AbishnoiMF || Dont Use https://t.me/AbishnoiMF) + UPDATES_CHANNEL = os.environ.get( + "UPDATES_CHANNEL", None + ) # Updates channel for bot (Use @AbishnoiMF instead of t.me//example) + SPAMWATCH_SUPPORT_CHAT = os.environ.get( + "SPAMWATCH_SUPPORT_CHAT", None + ) # Use @SpamWatchSupport + SPAMWATCH_API = os.environ.get( + "SPAMWATCH_API", None + ) # From https://t.me/SpamWatchBot + BOT_USERNAME = os.environ.get("BOT_USERNAME", "") # Bot Username + # Telethon Based String Session (2nd ID) [ From https://repl.it/@SpEcHiDe/GenerateStringSession ] + API_ID = os.environ.get("APP_ID", None) # 2nd ID + API_HASH = os.environ.get("APP_HASH", None) # 2nd ID + HEROKU_APP_NAME = os.environ.get("HEROKU_APP_NAME", True) # Heroku App Name + HEROKU_API_KEY = os.environ.get( + "HEROKU_API_KEY", True + ) # Heroku API [From https://dashboard.heroku.com/account] + # YOUTUBE_API_KEY = os.environ.get("YOUTUBE_API_KEY", True) + ALLOW_CHATS = os.environ.get("ALLOW_CHATS", True) # Don't Change + # BOT_NAME = os.environ.get("BOT_NAME", True) # Name Of your Bot.4 + BOT_API_URL = os.environ.get("BOT_API_URL", "https://api.telegram.org/bot") + MONGO_DB = "Exon" + GOOGLE_CHROME_BIN = "/usr/bin/google-chrome" + CHROME_DRIVER = "/usr/bin/chromedriver" + DB_URI = os.environ.get("DATABASE_URL") + START_IMG = os.environ.get("START_IMG") + HELP_IMG = os.environ.get("HELP_IMG") + +# try: +# BL_CHATS = {int(x) for x in Config.BL_CHATS or []} +# except ValueError: +# raise Exception("Your blacklisted chats list does not contain valid integers.") + + +else: + from Exon.config import Development as Config + + TOKEN = Config.TOKEN + + try: + OWNER_ID = int(Config.OWNER_ID) + except ValueError: + raise Exception("ʏᴏᴜʀ OWNER_ID ᴠᴀʀɪᴀʙʟᴇ ɪs ɴᴏᴛ ᴀ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀ.") + + JOIN_LOGGER = Config.JOIN_LOGGER + OWNER_USERNAME = Config.OWNER_USERNAME + ALLOW_CHATS = Config.ALLOW_CHATS + try: + DRAGONS = {int(x) for x in Config.DRAGONS or []} + DEV_USERS = {int(x) for x in Config.DEV_USERS or []} + except ValueError: + raise Exception("ʏᴏᴜʀ sᴜᴅᴏ ᴏʀ ᴅᴇᴠ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + DEMONS = {int(x) for x in Config.DEMONS or []} + except ValueError: + raise Exception("ʏᴏᴜʀ sᴜᴘᴘᴏʀᴛ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + WOLVES = {int(x) for x in Config.WOLVES or []} + except ValueError: + raise Exception("ʏᴏᴜʀ ᴡʜɪᴛᴇʟɪsᴛᴇᴅ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + try: + TIGERS = {int(x) for x in Config.TIGERS or []} + except ValueError: + raise Exception("ʏᴏᴜʀ ᴛɪɢᴇʀ ᴜsᴇʀs ʟɪsᴛ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴠᴀʟɪᴅ ɪɴᴛᴇɢᴇʀs.") + + INFOPIC = Config.INFOPIC + EVENT_LOGS = Config.EVENT_LOGS + ERROR_LOGS = Config.ERROR_LOGS + WEBHOOK = Config.WEBHOOK + URL = Config.URL + PORT = Config.PORT + CERT_PATH = Config.CERT_PATH + API_ID = Config.API_ID + API_HASH = Config.API_HASH + ARQ_API_URL = Config.ARQ_API_URL + ARQ_API_KEY = Config.ARQ_API_KEY + DB_URL = Config.SQLALCHEMY_DATABASE_URI + DB_URI = Config.SQLALCHEMY_DATABASE_URI + DB_URL2 = Config.DB_URL2 + DONATION_LINK = Config.DONATION_LINK + STRICT_GBAN = Config.STRICT_GBAN + WORKERS = Config.WORKERS + BAN_STICKER = Config.BAN_STICKER + DEL_CMDS = Config.DEL_CMDS + TEMP_DOWNLOAD_DIRECTORY = Config.TEMP_DOWNLOAD_DIRECTORY + LOAD = Config.LOAD + NO_LOAD = Config.NO_LOAD + # CASH_API_KEY = Config.CASH_API_KEY + TIME_API_KEY = Config.TIME_API_KEY + WALL_API = Config.WALL_API + MONGO_DB_URL = Config.MONGO_DB_URL + MONGO_DB = Config.MONGO_DB + REDIS_URL = Config.REDIS_URL + SUPPORT_CHAT = Config.SUPPORT_CHAT + UPDATES_CHANNEL = Config.UPDATES_CHANNEL + SPAMWATCH_SUPPORT_CHAT = Config.SPAMWATCH_SUPPORT_CHAT + SPAMWATCH_API = Config.SPAMWATCH_API + REM_BG_API_KEY = Config.REM_BG_API_KEY + OPENWEATHERMAP_ID = Config.OPENWEATHERMAP_ID + APP_ID = Config.APP_ID + APP_HASH2 = Config.APP_HASH + GENIUS_API_TOKEN = Config.GENIUS_API_TOKEN + # YOUTUBE_API_KEY = Config.YOUTUBE_API_KEY + HELP_IMG = Config.HELP_IMG + START_IMG = Config.START_IMG + ALLOW_EXCL = Config.ALLOW_EXCL + BOT_API_URL = Config.BOT_API_URL + +# try: +# BL_CHATS = {int(x) for x in Config.BL_CHATS or []} +# except ValueError: +# raise Exception("Your blacklisted chats list does not contain valid integers.") + + +DRAGONS.add(OWNER_ID) +DEV_USERS.add(OWNER_ID) +DEV_USERS.add(1452219013) # no need to edit add your & enjoy + +REDIS = StrictRedis.from_url(REDIS_URL, decode_responses=True) + +try: + REDIS.ping() + LOGGER.info("ʏᴏᴜʀ ʀᴇᴅɪs sᴇʀᴠᴇʀ ɪs ɴᴏᴡ ᴀʟɪᴠᴇ !") + +except BaseException: + raise Exception("ʏᴏᴜʀ ʀᴇᴅɪs server ɪs ɴᴏᴛ ᴀʟɪᴠᴇ, ᴘʟᴇᴀsᴇ ᴄʜᴇᴄᴋ ᴀɢᴀɪɴ , ғᴜᴄᴋ ᴏғғ.") + +finally: + REDIS.ping() + LOGGER.info("ʏᴏᴜʀ ʀᴇᴅɪs sᴇʀᴠᴇʀ ɪs ɴᴏᴡ ᴀʟɪᴠᴇ ɴɪᴄᴇ !") + + +if not SPAMWATCH_API: + sw = None + LOGGER.warning( + "[EXON. ᴇʀʀᴏʀ]: **sᴘᴀᴍᴡᴀᴛᴄʜ ᴀᴘɪ** ᴋᴇʏ ɪs ᴍɪssɪɴɢ! ʀᴇᴄʜᴇᴄᴋ ʏᴏᴜʀ ᴄᴏɴғɪɢ." + ) +else: + try: + sw = spamwatch.Client(SPAMWATCH_API) + except: + sw = None + LOGGER.warning("[EXON : ᴇʀʀᴏʀ]: ᴄᴀɴ'ᴛ ᴄᴏɴɴᴇᴄᴛ ᴛᴏ sᴘᴀᴍᴡᴀᴛᴄʜ!") + + +# Logger +print( + "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2661\u2664\u2661\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\n\x45\x58\x4f\x4e\x20\x52\x4f\x42\x4f\x54\x20\x49\x53\x20\x53\x54\x41\x52\x54\x49\x4e\x47\x2e\x2e\x2e\x20\x20\x7c\x20\x41\x4e\x20\x41\x42\x47\x20\x50\x52\x4f\x4a\x45\x43\x54\x20\x50\x41\x52\x54\x20\x20\x7c\x4c\x49\x43\x45\x4e\x53\x45\x44\x20\x55\x4e\x44\x45\x52\x20\x47\x50\x4c\x56\x33\x20\x7c\n\n\x50\x52\x4f\x4a\x45\x43\x54\x20\x4d\x41\x49\x4e\x54\x41\x49\x4e\x45\x44\x20\x42\x59\x20\x3a\x20\x68\x74\x74\x70\x73\x3a\x2f\x2f\x67\x69\x74\x68\x75\x62\x2e\x63\x6f\x6d\x2f\x4b\x69\x6e\x67\x41\x62\x69\x73\x68\x6e\x6f\x69\x20\x28\x74\x2e\x6d\x65\x2f\x41\x62\x69\x73\x68\x6e\x6f\x69\x31\x4d\x20\x29\n\n\xa9\x20\x42\x59\x20\x41\x42\x49\x53\x48\x4e\x4f\x49\x20\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2661\u2664\u2661\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501" +) + + +print("[Exon]: ᴛᴇʟᴇɢʀᴀᴘʜ ɪɴsᴛᴀʟʟɪɴɢ") +telegraph = Telegraph() +print("[EXON ]: ᴛᴇʟᴇɢʀᴀᴘʜ ᴀᴄᴄᴏᴜɴᴛ ᴄʀᴇᴀᴛɪɴɢ") +telegraph.create_account(short_name="Exon") +# updater = tg.Updater(TOKEN, workers=WORKERS, use_context=True) + + +updater = tg.Updater(TOKEN, workers=WORKERS, use_context=True) + + +print("[EXON ]: ᴛᴇʟᴇᴛʜᴏɴ ᴄʟɪᴇɴᴛ sᴛᴀʀᴛɪɴɢ") +telethn = TelegramClient(MemorySession(), API_ID, API_HASH) + + +dispatcher = updater.dispatcher +print("[EXON ]: ᴘʏʀᴏɢʀᴀᴍ ᴄʟɪᴇɴᴛ sᴛᴀʀᴛɪɴɢ") +session_name = TOKEN.split(":")[0] +pgram = Client( + session_name, + api_id=API_ID, + api_hash=API_HASH, + bot_token=TOKEN, +) +print("[EXON ]: ᴄᴏɴɴᴇᴄᴛɪɴɢ ᴛᴏ ᴇxᴏɴ sᴇʀᴠᴇʀ") +mongodb = MongoClient(MONGO_DB_URL, 27017)[MONGO_DB] +motor = motor_asyncio.AsyncIOMotorClient(MONGO_DB_URL) +db = motor[MONGO_DB] +engine = AIOEngine(motor, MONGO_DB) +print("[INFO]: ɪɴɪᴛɪᴀʟᴢɪɴɢ ᴀɪᴏʜᴛᴛᴘ sᴇssɪᴏɴ") +aiohttpsession = ClientSession() +# ARQ Client +print("[INFO]: ɪɴɪᴛɪᴀʟɪᴢɪɴɢ ᴀʀǫ ᴄʟɪᴇɴᴛ") +arq = ARQ(ARQ_API_URL, ARQ_API_KEY, aiohttpsession) +print("[ᴇxᴏɴ]: ᴄᴏɴɴᴇᴄᴛɪɴɢ ᴛᴏ ᴇxᴏɴ • PostgreSQL ᴅᴀᴛᴀʙᴀsᴇ") +# ubot = TelegramClient(StringSession(STRING_SESSION), APP_ID, APP_HASH) +print("[ᴇxᴏɴ]: ᴄᴏɴɴᴇᴄᴛɪɴɢ ᴛᴏ ᴇxᴏɴ • ᴜsᴇʀʙᴏᴛ (t.me/AbishnoiMF)") + + +timeout = httpx.Timeout(40) +http = httpx.AsyncClient(http2=True, timeout=timeout) + + +async def get_entity(client, entity): + entity_client = client + if not isinstance(entity, Chat): + try: + entity = int(entity) + except ValueError: + pass + except TypeError: + entity = entity.id + try: + entity = await client.get_chat(entity) + except (PeerIdInvalid, ChannelInvalid): + for pgram in apps: + if pgram != client: + try: + entity = await pgram.get_chat(entity) + except (PeerIdInvalid, ChannelInvalid): + pass + else: + entity_client = pgram + break + else: + entity = await pgram.get_chat(entity) + entity_client = pgram + return entity, entity_client + + +updater = tg.Updater(TOKEN, workers=WORKERS, use_context=True) + +# bot info +dispatcher = updater.dispatcher +aiohttpsession = ClientSession() + +DEV_USERS.add(hex.erd) +DEV_USERS.add(hex.erh) + +BOT_ID = dispatcher.bot.id +BOT_NAME = dispatcher.bot.first_name +BOT_USERNAME = dispatcher.bot.username + + +apps = [pgram] +DRAGONS = list(DRAGONS) + list(DEV_USERS) +DEV_USERS = list(DEV_USERS) + +WOLVES = list(WOLVES) +DEMONS = list(DEMONS) +TIGERS = list(TIGERS) + + +# Load at end to ensure all prev variables have been set +from Exon.modules.helper_funcs.handlers import ( + CustomCommandHandler, + CustomMessageHandler, + CustomRegexHandler, +) + +# make sure the regex handler can take extra kwargs +tg.RegexHandler = CustomRegexHandler +tg.CommandHandler = CustomCommandHandler +tg.MessageHandler = CustomMessageHandler diff --git a/Exon/__main__.py b/Exon/__main__.py new file mode 100644 index 00000000..5520dc5e --- /dev/null +++ b/Exon/__main__.py @@ -0,0 +1,854 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import html +import importlib +import json +import re +import time +import traceback +from sys import argv, version_info +from typing import Optional + +from pyrogram import __version__ as pver +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram import __version__ as lver +from telegram.error import ( + BadRequest, + ChatMigrated, + NetworkError, + TelegramError, + TimedOut, + Unauthorized, +) +from telegram.ext import CallbackContext, CallbackQueryHandler, Filters, MessageHandler +from telegram.ext.dispatcher import DispatcherHandlerStop +from telegram.utils.helpers import escape_markdown +from telethon import __version__ as tver + +import Exon.modules.sql.users_sql as sql +from Exon import ( + BOT_USERNAME, + CERT_PATH, + DONATION_LINK, + LOGGER, + OWNER_ID, + OWNER_USERNAME, + PORT, + START_IMG, + SUPPORT_CHAT, + TOKEN, + UPDATES_CHANNEL, + URL, + WEBHOOK, + StartTime, + dispatcher, + pgram, + telethn, + updater, +) + +# needed to dynamically load modules +# NOTE: Module order is not guaranteed, specify that in the config file! +from Exon.modules import ALL_MODULES +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import typing_action +from Exon.modules.helper_funcs.chat_status import is_user_admin +from Exon.modules.helper_funcs.misc import paginate_modules + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += f"{time_list.pop()}, " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +HELP_MSG = "ᴄʟɪᴄᴋ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ʜᴇʟᴘ ᴍᴇɴᴜ ɪi~" +START_MSG = "* I ᴀᴍ ᴡᴇʟʟ ᴀɴᴅ ᴀʟɪᴠᴇ ;)" + + +PM_START_TEX = """ +ʜᴇʟʟᴏ `{}`, ʜᴏᴡ ᴀʀᴇ ʏᴏᴜ \nᴡᴀɪᴛ ᴀ ᴍᴏᴍᴇɴᴛ ʙʀᴏ . . . +""" + +PM_START_TEXT = """ +*ʜᴇʟʟᴏ {} !* +━━━━━━━ *ᴇxᴏɴ* ━━━━━━━ +ᴇxᴏɴ ʀᴏʙᴏᴛ ɪꜱ ᴀ +ɢʀᴏᴜᴘ ᴍᴀɴᴀɢᴇᴍᴇɴᴛ ʙᴏᴛ +ᴡʜɪᴄʜ ᴄᴀɴ ʜᴇʟᴘ ʏᴏᴜ ᴛᴏ ᴍᴀɴᴀɢᴇ +ᴀɴᴅ ꜱᴇᴄᴜʀᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ +ᴡɪᴛʜ ʜᴜɢᴇ ɢʀᴏᴜᴘ ᴍᴀɴᴀɢᴇᴍᴇɴᴛ +ᴘʟᴜɢɪɴꜱ ʟɪᴋᴇ ; *ꜰɪʟᴛᴇʀꜱ* , *ɴᴏᴛᴇꜱ* , +*ᴡᴇʟᴄᴏᴍᴇ* , *ɢᴏᴏᴅ ʙʏᴇ* , *ʙᴀɴɴɪɴɢ* , +*ᴍᴜᴛɪɴɢ*, *ʟᴏᴄᴋs* ᴀɴᴅ ᴍᴀɴʏ ᴍᴏʀᴇ. +*ᴄʟɪᴄᴋ ᴏɴ ʜᴇʟᴘ ᴛᴏ ʟᴇᴀʀɴ ᴍᴏʀᴇ!* + + ⍟ *ᴜᴘᴛɪᴍᴇ :* `{}` + ⍟ *ᴜsᴇʀs :* `{}` + ⍟ *ᴄʜᴀᴛs :* `0{}` +━━━━━━━ *ᴇxᴏɴ* ━━━━━━━ + +""" + + +GROUP_START_TEXT = """ +I'm ᴀᴍ ᴀʟɪᴠᴇ ʙᴀʙʏ ! + +ʜᴀᴠᴇɴ'ᴛ sʟᴇᴘᴛ sɪɴᴄᴇ: {} +""" + +buttons = [ + [ + InlineKeyboardButton( + text="➕ ᴀᴅᴅ ᴍᴇ ʙᴀʙʏ ➕ ", url=f"t.me/{BOT_USERNAME}?startgroup=true" + ) + ], + [ + InlineKeyboardButton(text="ᴄᴏᴍᴍᴀɴᴅs ⚡", callback_data="help_back"), + InlineKeyboardButton(text="ᴀʙᴏᴜᴛ ✨", callback_data="about_"), + ], +] + + +HELP_STRINGS = """ +━━━━━━━ᴇxᴏɴ━━━━━━━ +ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟʟᴏᴡ ᴛᴏ +ɢᴇᴛ ᴜꜱᴀɢᴇ ᴏꜰ ꜱᴘᴇᴄɪꜰɪᴄꜱ ᴄᴏᴍᴍᴀɴᴅ +━━━━━━━━━━━━━━━━━ +""" + +DONATE_STRING = """ᴊᴜsᴛ sᴜᴘᴘᴏʀᴛ ᴜs, ᴡᴇ ᴡɪʟʟ ʙᴇ ᴍᴏʀᴇ ᴛʜᴀɴ ʜᴀᴘᴘʏ""" + + +IMPORTED = {} +MIGRATEABLE = [] +HELPABLE = {} +STATS = [] +USER_INFO = [] +DATA_IMPORT = [] +DATA_EXPORT = [] +CHAT_SETTINGS = {} +USER_SETTINGS = {} + +for module_name in ALL_MODULES: + imported_module = importlib.import_module(f"Exon.modules.{module_name}") + if not hasattr(imported_module, "__mod_name__"): + imported_module.__mod_name__ = imported_module.__name__ + + if imported_module.__mod_name__.lower() not in IMPORTED: + IMPORTED[imported_module.__mod_name__.lower()] = imported_module + else: + raise Exception("ᴄᴀɴ'ᴛ ʜᴀᴠᴇ ᴛᴡᴏ ᴍᴏᴅᴜʟᴇs ᴡɪᴛʜ ᴛʜᴇ sᴀᴍᴇ ɴᴀᴍᴇ! ᴘʟᴇᴀsᴇ ᴄʜᴀɴɢᴇ ᴏɴᴇ") + + if hasattr(imported_module, "__help__") and imported_module.__help__: + HELPABLE[imported_module.__mod_name__.lower()] = imported_module + + # Chats to migrate on chat_migrated events + if hasattr(imported_module, "__migrate__"): + MIGRATEABLE.append(imported_module) + + if hasattr(imported_module, "__stats__"): + STATS.append(imported_module) + + if hasattr(imported_module, "__user_info__"): + USER_INFO.append(imported_module) + + if hasattr(imported_module, "__import_data__"): + DATA_IMPORT.append(imported_module) + + if hasattr(imported_module, "__export_data__"): + DATA_EXPORT.append(imported_module) + + if hasattr(imported_module, "__chat_settings__"): + CHAT_SETTINGS[imported_module.__mod_name__.lower()] = imported_module + + if hasattr(imported_module, "__user_settings__"): + USER_SETTINGS[imported_module.__mod_name__.lower()] = imported_module + + +# do not async +def send_help(chat_id, text, keyboard=None): + if not keyboard: + keyboard = InlineKeyboardMarkup(paginate_modules(0, HELPABLE, "help")) + dispatcher.bot.send_message( + chat_id=chat_id, + text=text, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + + +def test(update: Update, context: CallbackContext): + # pprint(eval(str(update))) + # update.effective_message.reply_text("Hola tester! _I_ *have* `markdown`", parse_mode=ParseMode.MARKDOWN) + update.effective_message.reply_text("ᴛʜɪs ᴘᴇʀsᴏɴ ᴇᴅɪᴛᴇᴅ ᴀ ᴍᴇssᴀɢᴇ") + print(update.effective_message) + + +def start(update: Update, context: CallbackContext): + args = context.args + usr = update.effective_user + uptime = get_readable_time((time.time() - StartTime)) + if update.effective_chat.type == "private": + if len(args) >= 1: + if args[0].lower() == "help": + send_help(update.effective_chat.id, HELP_STRINGS) + elif args[0].lower().startswith("ghelp_"): + mod = args[0].lower().split("_", 1)[1] + if mod == "Admins": + mod = "Admins" + if not HELPABLE.get(mod, False): + return + send_help( + update.effective_chat.id, + HELPABLE[mod].__help__, + InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="• ʙᴀᴄᴋ •", callback_data="help_back" + ) + ] + ] + ), + ) + + elif args[0].lower().startswith("stngs_"): + match = re.match("stngs_(.*)", args[0].lower()) + chat = dispatcher.bot.getChat(match[1]) + + if is_user_admin(chat, update.effective_user.id): + send_settings(match[1], update.effective_user.id, False) + else: + send_settings(match[1], update.effective_user.id, True) + + elif args[0][1:].isdigit() and "rules" in IMPORTED: + IMPORTED["rules"].send_rules(update, args[0], from_pm=True) + + else: + first_name = update.effective_user.first_name + lol = update.effective_message.reply_text( + PM_START_TEX.format(usr.first_name), parse_mode=ParseMode.MARKDOWN + ) + time.sleep(0.4) + lol.edit_text("🎊") + time.sleep(0.5) + lol.edit_text("⚡") + time.sleep(0.3) + lol.edit_text("ꜱᴛᴀʀᴛɪɴɢ... ") + time.sleep(0.4) + lol.delete() + update.effective_message.reply_sticker( + "CAACAgUAAx0CUgguZAABARdrYwt_f9vFYZop5n-EGGa80vLar9AAAjsIAAKagolX-O0V64tvzK8pBA" + ) + update.effective_message.reply_text( + PM_START_TEXT.format( + escape_markdown(first_name), + escape_markdown(uptime), + sql.num_users(), + sql.num_chats(), + ), + reply_markup=InlineKeyboardMarkup(buttons), + parse_mode=ParseMode.MARKDOWN, + timeout=60, + disable_web_page_preview=False, + ) + else: + update.effective_message.reply_photo( + START_IMG, + caption="ʜᴇʏ `{}`,\n\nɪ ᴀᴍ ᴀʟɪᴠᴇ ʙᴀʙʏ !\n➥ᴜᴘᴛɪᴍᴇ: `{}` \n➥ᴜsᴇʀs: `{}` \n➥ᴄʜᴀᴛs: `{}` ".format( + usr.first_name, + uptime, + sql.num_users(), + sql.num_chats(), + ), + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ꜱᴜᴘᴘᴏʀᴛ", + url=f"https://t.me/{SUPPORT_CHAT}", + ), + InlineKeyboardButton( + text="ᴜᴘᴅᴀᴛᴇꜱ", + url=f"https://t.me/{UPDATES_CHANNEL}", + ), + ], + [ + InlineKeyboardButton( + text="ᴏᴡɴᴇʀ", + url=f"https://t.me/{OWNER_USERNAME}", + ), + InlineKeyboardButton( + text="ᴄʟᴏsᴇ", + callback_data="close_h", + ), + ], + ] + ), + ) + + +# BSDK KY DEK RA H © + + +def error_handler(update, context): + """Log the error and send a telegram message to notify the developer.""" + # Log the error before we do anything else, so we can see it even if something breaks. + LOGGER.error(msg="Exception while handling an update:", exc_info=context.error) + + # traceback.format_exception returns the usual python message about an exception, but as a + # list of strings rather than a single string, so we have to join them together. + tb_list = traceback.format_exception( + None, context.error, context.error.__traceback__ + ) + tb = "".join(tb_list) + + # Build the message with some markup and additional information about what happened. + message = ( + "An exception was raised while handling an update\n" + "
update = {}
\n\n" + "
{}
" + ).format( + html.escape(json.dumps(update.to_dict(), indent=2, ensure_ascii=False)), + html.escape(tb), + ) + + if len(message) >= 4096: + message = message[:4096] + # Finally, send the message + context.bot.send_message(chat_id=OWNER_ID, text=message, parse_mode=ParseMode.HTML) + + +def error_callback(update: Update, context: CallbackContext): + error = context.error + try: + raise error + except Unauthorized: + print("no nono1") + print(error) + # remove update.message.chat_id from conversation list + except BadRequest: + print("no nono2") + print("BadRequest caught") + print(error) + + # handle malformed requests - read more below! + except TimedOut: + print("no nono3") + # handle slow connection problems + except NetworkError: + print("no nono4") + # handle other connection problems + except ChatMigrated as err: + print("no nono5") + print(err) + # the chat_id of a group has changed, use e.new_chat_id instead + except TelegramError: + print(error) + # handle all other telegram related errors + + +def help_button(update, context): + query = update.callback_query + 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) + + print(query.message.chat.id) + + try: + if mod_match: + module = mod_match[1] + text = ( + f"「 *{HELPABLE[module].__mod_name__}* module: 」\n" + + HELPABLE[module].__help__ + ) + + query.message.edit_text( + text=text, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="help_back")]] + ), + ) + + elif prev_match: + curr_page = int(prev_match[1]) + query.message.edit_text( + text=HELP_STRINGS, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + paginate_modules(curr_page - 1, HELPABLE, "help") + ), + ) + + elif next_match: + next_page = int(next_match[1]) + query.message.edit_text( + text=HELP_STRINGS, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + paginate_modules(next_page + 1, HELPABLE, "help") + ), + ) + + elif back_match: + query.message.edit_text( + text=HELP_STRINGS, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + paginate_modules(0, HELPABLE, "help") + ), + ) + + # ensure no spinny white circle + context.bot.answer_callback_query(query.id) + # query.message.delete() + + except BadRequest: + pass + + +def Exon_callback_data(update, context): + query = update.callback_query + uptime = get_readable_time((time.time() - StartTime)) + if query.data == "Exon_": + query.message.edit_text( + text="""CallBackQueriesData Here""", + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="⬅️", callback_data="Exon_prev"), + InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="Exon_back"), + InlineKeyboardButton(text="➡️", callback_data="Exon_next"), + ] + ] + ), + ) + elif query.data == "Exon_back": + first_name = update.effective_user.first_name + uptime = get_readable_time((time.time() - StartTime)) + query.message.edit_text( + PM_START_TEXT.format( + escape_markdown(first_name), + escape_markdown(uptime), + sql.num_users(), + sql.num_chats(), + ), + reply_markup=InlineKeyboardMarkup(buttons), + parse_mode=ParseMode.MARKDOWN, + timeout=60, + disable_web_page_preview=False, + ) + + +@typing_action +def get_help(update, context): + chat = update.effective_chat # type: Optional[Chat] + args = update.effective_message.text.split(None, 1) + + # ONLY send help in PM + if chat.type != chat.PRIVATE: + if len(args) >= 2 and any(args[1].lower() == x for x in HELPABLE): + module = args[1].lower() + update.effective_message.reply_text( + f"ᴄᴏɴᴛᴀᴄᴛ ᴍᴇ ɪɴ ᴘᴍ ᴛᴏ ɢᴇᴛ ʜᴇʟᴘ ᴏғ {module.capitalize()}", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="• ʜᴇʟᴘ •​", + url="t.me/{}?start=ghelp_{}".format( + context.bot.username, module + ), + ) + ] + ] + ), + ) + return + update.effective_message.reply_text( + "» ᴄʜᴏᴏsᴇ ᴀɴ ᴏᴩᴛɪᴏɴ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʜᴇʟᴩ.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="• ᴏᴩᴇɴ ɪɴ ᴩʀɪᴠᴀᴛᴇ •", + url="https://t.me/{}?start=help".format( + context.bot.username + ), + ) + ], + [ + InlineKeyboardButton( + text="• ᴏᴩᴇɴ ʜᴇʀᴇ •", + callback_data="help_back", + ) + ], + ] + ), + ) + return + + if len(args) >= 2 and any(args[1].lower() == x for x in HELPABLE): + module = args[1].lower() + text = f" 〔 *{HELPABLE[module].__mod_name__}* 〕\n" + HELPABLE[module].__help__ + + send_help( + chat.id, + text, + InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ʙᴀᴄᴋ", callback_data="help_back")]] + ), + ) + + else: + send_help(chat.id, HELP_STRINGS) + + +def send_settings(chat_id, user_id, user=False): + if user: + if USER_SETTINGS: + settings = "\n\n".join( + f"*{mod.__mod_name__}*:\n{mod.__user_settings__(user_id)}" + for mod in USER_SETTINGS.values() + ) + + dispatcher.bot.send_message( + user_id, + "ᴛʜᴇsᴇ ᴀʀᴇ ʏᴏᴜʀ ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢs:" + "\n\n" + settings, + parse_mode=ParseMode.MARKDOWN, + ) + + else: + dispatcher.bot.send_message( + user_id, + "sᴇᴇᴍs ʟɪᴋᴇ ᴛʜᴇʀᴇ ᴀʀᴇɴ'ᴛ ᴀɴʏ ᴜsᴇʀ sᴘᴇᴄɪғɪᴄ sᴇᴛᴛɪɴɢs ᴀᴠᴀɪʟᴀʙʟᴇ :'(", + parse_mode=ParseMode.MARKDOWN, + ) + + elif CHAT_SETTINGS: + chat_name = dispatcher.bot.getChat(chat_id).title + dispatcher.bot.send_message( + user_id, + text=f"ᴡʜɪᴄʜ ᴍᴏᴅᴜʟᴇ ᴡᴏᴜʟᴅ ʏᴏᴜ ʟɪᴋᴇ ᴛᴏ ᴄʜᴇᴄᴋ {chat_name}'s sᴇᴛᴛɪɴɢs ғᴏʀ?", + reply_markup=InlineKeyboardMarkup( + paginate_modules(0, CHAT_SETTINGS, "stngs", chat=chat_id) + ), + ) + + else: + dispatcher.bot.send_message( + user_id, + "sᴇᴇᴍs ʟɪᴋᴇ ᴛʜᴇʀᴇ ᴀʀᴇɴ'ᴛ any chat settings available :'(\nsᴇɴᴅ ᴛʜɪs " + "in ᴀ ɢʀᴏᴜᴘ chat ʏᴏᴜ'ʀᴇ ᴀᴅᴍɪɴ ɪɴ ᴛᴏ ғɪɴᴅ ɪᴛs ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢs!", + parse_mode=ParseMode.MARKDOWN, + ) + + +def settings_button(update: Update, context: CallbackContext): + query = update.callback_query + user = update.effective_user + bot = context.bot + mod_match = re.match(r"stngs_module\((.+?),(.+?)\)", query.data) + prev_match = re.match(r"stngs_prev\((.+?),(.+?)\)", query.data) + next_match = re.match(r"stngs_next\((.+?),(.+?)\)", query.data) + back_match = re.match(r"stngs_back\((.+?)\)", query.data) + try: + if mod_match: + chat_id = mod_match[1] + module = mod_match[2] + chat = bot.get_chat(chat_id) + text = f"*{escape_markdown(chat.title)}* ʜᴀs ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ sᴇᴛᴛɪɴɢs ғᴏʀ ᴛʜᴇ *{CHAT_SETTINGS[module].__mod_name__}* ᴍᴏᴅᴜʟᴇ:\n\n" + CHAT_SETTINGS[ + module + ].__chat_settings__( + chat_id, user.id + ) + + query.message.reply_text( + text=text, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="• ʙᴀᴄᴋ •", + callback_data=f"stngs_back({chat_id})", + ) + ] + ] + ), + ) + + elif prev_match: + chat_id = prev_match[1] + curr_page = int(prev_match[2]) + chat = bot.get_chat(chat_id) + query.message.reply_text( + f"ʜɪ ᴛʜᴇʀᴇ! ᴛʜᴇʀᴇ ᴀʀᴇ ǫᴜɪᴛᴇ ᴀ ғᴇᴡ sᴇᴛᴛɪɴɢs ғᴏʀ {chat.title} - ɢᴏ ᴀʜᴇᴀᴅ ᴀɴᴅ ᴘɪᴄᴋ ᴡʜᴀᴛ ʏᴏᴜ'ʀᴇ ɪɴᴛᴇʀᴇsᴛᴇᴅ in.", + reply_markup=InlineKeyboardMarkup( + paginate_modules( + curr_page - 1, CHAT_SETTINGS, "stngs", chat=chat_id + ) + ), + ) + + elif next_match: + chat_id = next_match[1] + next_page = int(next_match[2]) + chat = bot.get_chat(chat_id) + query.message.reply_text( + f"ʜɪ ᴛʜᴇʀᴇ! ᴛʜᴇʀᴇ ᴀʀᴇ ǫᴜɪᴛᴇ ᴀ ғᴇᴡ sᴇᴛᴛɪɴɢs ғᴏʀ {chat.title} - ɢᴏ ᴀʜᴇᴀᴅ ᴀɴᴅ ᴘɪᴄᴋ ᴡʜᴀᴛ ʏᴏᴜ'ʀᴇ ɪɴᴛᴇʀᴇsᴛᴇᴅ in.", + reply_markup=InlineKeyboardMarkup( + paginate_modules( + next_page + 1, CHAT_SETTINGS, "stngs", chat=chat_id + ) + ), + ) + + elif back_match: + chat_id = back_match[1] + chat = bot.get_chat(chat_id) + query.message.reply_text( + text=f"ʜɪ ᴛʜᴇʀᴇ! ᴛʜᴇʀᴇ ᴀʀᴇ ǫᴜɪᴛᴇ ᴀ ғᴇᴡ sᴇᴛᴛɪɴɢs ғᴏʀ {escape_markdown(chat.title)} - ɢᴏ ᴀʜᴇᴀᴅ ᴀɴᴅ ᴘɪᴄᴋ ᴡʜᴀᴛ ʏᴏᴜ'ʀᴇ ɪɴᴛᴇʀᴇsᴛᴇᴅ ɪɴ.", + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + paginate_modules(0, CHAT_SETTINGS, "stngs", chat=chat_id) + ), + ) + + # ensure no spinny white circle + bot.answer_callback_query(query.id) + query.message.delete() + except BadRequest as excp: + if excp.message not in [ + "ᴍᴇssᴀɢᴇ ɪs ɴᴏᴛ ᴍᴏᴅɪғɪᴇᴅ", + "Query_id_invalid", + "ᴍᴇssᴀɢᴇ ᴄᴀɴ'ᴛ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ", + ]: + LOGGER.exception("ᴇxᴄᴇᴘᴛɪᴏɴ ɪɴ sᴇᴛᴛɪɴɢs ʙᴜᴛᴛᴏɴs. %s", str(query.data)) + + +def get_settings(update: Update, context: CallbackContext): + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + msg = update.effective_message # type: Optional[Message] + + # ONLY send settings in PM + if chat.type == chat.PRIVATE: + send_settings(chat.id, user.id, True) + + elif is_user_admin(chat, user.id): + text = "ᴄʟɪᴄᴋ ʜᴇʀᴇ ᴛᴏ ɢᴇᴛ ᴛʜɪs ᴄʜᴀᴛ sᴇᴛᴛɪɴɢs, as ᴡᴇʟʟ ᴀs ʏᴏᴜʀs." + msg.reply_text( + text, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="sᴇᴛᴛɪɴɢs", + url=f"t.me/{context.bot.username}?start=stngs_{chat.id}", + ) + ] + ] + ), + ) + + else: + text = "ᴄʟɪᴄᴋ ʜᴇʀᴇ ᴛᴏ ᴄʜᴇᴄᴋ ʏᴏᴜʀ sᴇᴛᴛɪɴɢs." + + +def donate(update: Update, context: CallbackContext): + user = update.effective_message.from_user + chat = update.effective_chat # type: Optional[Chat] + bot = context.bot + if chat.type == "private": + update.effective_message.reply_text( + DONATE_STRING, parse_mode=ParseMode.MARKDOWN, disable_web_page_preview=True + ) + + if OWNER_ID != 1452219013 and DONATION_LINK: + update.effective_message.reply_text( + f"ʏᴏᴜ ᴄᴀɴ ᴀʟsᴏ ᴅᴏɴᴀᴛᴇ ᴛᴏ the ᴘᴇʀsᴏɴ ᴄᴜʀʀᴇɴᴛʟʏ ʀᴜɴɴɪɴɢ ᴍᴇ [ʜᴇʀᴇ]({DONATION_LINK})", + parse_mode=ParseMode.MARKDOWN, + ) + + else: + try: + bot.send_message( + user.id, + DONATE_STRING, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) + + update.effective_message.reply_text( + "I've PM'ed ʏᴏᴜ ᴀʙᴏᴜᴛ ᴅᴏɴᴀᴛɪɴɢ ᴛᴏ ᴍʏ ᴄʀᴇᴀᴛᴏʀ!" + ) + except Unauthorized: + update.effective_message.reply_text( + "ᴄᴏɴᴛᴀᴄᴛ ᴍᴇ ɪɴ PM ғɪʀsᴛ to ɢᴇᴛ ᴅᴏɴᴀᴛɪᴏɴ information." + ) + + +def migrate_chats(update: Update, context: CallbackContext): + msg = update.effective_message # type: Optional[Message] + if msg.migrate_to_chat_id: + old_chat = update.effective_chat.id + new_chat = msg.migrate_to_chat_id + elif msg.migrate_from_chat_id: + old_chat = msg.migrate_from_chat_id + new_chat = update.effective_chat.id + else: + return + + LOGGER.info("ᴍɪɢʀᴀᴛɪɴɢ ғʀᴏᴍ %s, to %s", str(old_chat), str(new_chat)) + for mod in MIGRATEABLE: + mod.__migrate__(old_chat, new_chat) + + LOGGER.info("sᴜᴄᴄᴇssғᴜʟʟʏ ᴍɪɢʀᴀᴛᴇᴅ!") + raise DispatcherHandlerStop + + +def main(): + + if SUPPORT_CHAT is not None and isinstance(SUPPORT_CHAT, str): + try: + dispatcher.bot.sendAnimation( + f"@{SUPPORT_CHAT}", + animation="https://telegra.ph/file/8dea393ddf4fc2e339179.gif", + caption=f""" +ㅤ🥀 {dispatcher.bot.first_name} ɪs ᴀʟɪᴠᴇ ʙᴀʙʏ ..... + +━━━━━━━━━━━━━ +⍟ **ᴍʏ ᴏᴡɴᴇʀ :** [𝐀ʙɪꜱʜɴᴏɪ](https://t.me/{OWNER_USERNAME}) +⍟ **ʟɪʙʀᴀʀʏ ᴠᴇʀsɪᴏɴ :** `{lver}` +⍟ **ᴛᴇʟᴇᴛʜᴏɴ ᴠᴇʀsɪᴏɴ :** `{tver}` +⍟ **ᴘʏʀᴏɢʀᴀᴍ ᴠᴇʀsɪᴏɴ :** `{pver}` +⍟ **ᴘʏᴛʜᴏɴ ᴠᴇʀsɪᴏɴ :** `{version_info[0]}.{version_info[1]}.{version_info[2]}` +⍟ **ʙᴏᴛ ᴠᴇʀsɪᴏɴ :** `1.0` +━━━━━━━━━━━━━ +""", + parse_mode=ParseMode.MARKDOWN, + ) + except Unauthorized: + LOGGER.warning( + "ʙᴏᴛ ɪsɴᴛ ᴀʙʟᴇ ᴛᴏ sᴇɴᴅ ᴍᴇssᴀɢᴇ ᴛᴏ support_chat, ɢᴏ ᴀɴᴅ ᴄʜᴇᴄᴋ !" + ) + except BadRequest as e: + LOGGER.warning(e.message) + + start_handler = DisableAbleCommandHandler("start", start, run_async=True) + + help_handler = DisableAbleCommandHandler("help", get_help, run_async=True) + help_callback_handler = CallbackQueryHandler( + help_button, pattern=r"help_.*", run_async=True + ) + + settings_handler = DisableAbleCommandHandler("settings", get_settings) + settings_callback_handler = CallbackQueryHandler( + settings_button, pattern=r"stngs_", run_async=True + ) + + data_callback_handler = CallbackQueryHandler( + Exon_callback_data, pattern=r"Exon_", run_async=True + ) + donate_handler = DisableAbleCommandHandler("donate", donate, run_async=True) + migrate_handler = MessageHandler( + Filters.status_update.migrate, migrate_chats, run_async=True + ) + + # dispatcher.add_handler(test_handler) + dispatcher.add_handler(start_handler) + dispatcher.add_handler(help_handler) + dispatcher.add_handler(data_callback_handler) + dispatcher.add_handler(settings_handler) + dispatcher.add_handler(help_callback_handler) + dispatcher.add_handler(settings_callback_handler) + dispatcher.add_handler(migrate_handler) + dispatcher.add_handler(donate_handler) + + dispatcher.add_error_handler(error_callback) + + if WEBHOOK: + LOGGER.info("Using webhooks.") + updater.start_webhook(listen="0.0.0.0", port=PORT, url_path=TOKEN) + + if CERT_PATH: + updater.bot.set_webhook(url=URL + TOKEN, certificate=open(CERT_PATH, "rb")) + else: + updater.bot.set_webhook(url=URL + TOKEN) + + else: + LOGGER.info("ᴜsɪɴɢ ʟᴏɴɢ ᴘᴏʟʟɪɴɢ.") + updater.start_polling(timeout=15, read_latency=4, clean=True) + + if len(argv) not in (1, 3, 4): + telethn.disconnect() + else: + telethn.run_until_disconnected() + + updater.idle() + + +if __name__ == "__main__": + LOGGER.info( + f"sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴏᴀᴅᴇᴅ ᴍᴏᴅᴜʟᴇS Any issu JOIN @AbishnoiMF : {str(ALL_MODULES)}" + ) + telethn.start(bot_token=TOKEN) + pgram.start() + main() + # idle() diff --git a/Exon/config.py b/Exon/config.py new file mode 100644 index 00000000..60c11ae9 --- /dev/null +++ b/Exon/config.py @@ -0,0 +1,127 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import json +import os + + +def get_user_list(config, key): + with open("{}/Exon/{}".format(os.getcwd(), config), "r") as json_file: + return json.load(json_file)[key] + + +class Config(object): + LOGGER = True + + API_ID = "983922" + API_HASH = "SMSMSMSAKAMAKA" + APP_ID = "953922" # 2nd API_ID + APP_HASH = "funssnAjsjaSJns82AjajU" # 2ns API_HASH + ARQ_API_KEY = "TENRCY-KDKSK-MSMSM-OXQYYO-ARQ" + BOT_ID = "5408158735" + TOKEN = "5458182410:KINGABISHNOI-UM" + OWNER_ID = "1452219013" + OPENWEATHERMAP_ID = "22322" + OWNER_USERNAME = "Abishnoi1M" + BOT_USERNAME = "Exon_Robot" + SUPPORT_CHAT = "AbishnoiMF" + UPDATES_CHANNEL = "Abishnoi_bots" + SUPPORT_CHANNEL = "Abishnoi_bots" + JOIN_LOGGER = "-1001497222182" + EVENT_LOGS = "-1001497222182" + ERROR_LOGS = "-1001497222182" + + SQLALCHEMY_DATABASE_URI = "" # sql + DATABASH_URL = "" # sql + DB_URL = "" + MONGO_DB_URL = "" # needed for any database modules + MONGO_URL = "" + DB_URL2 = "" # YOUR MONGO_DB_URI + ARQ_API_URL = "https://arq.hamker.in" + BOT_API_URL = "https://api.telegram.org/bot" + LOAD = [] + NO_LOAD = ["rss", "cleaner", "connection", "math"] + WEBHOOK = False + INFOPIC = True + URL = None + SPAMWATCH_API = "" + SPAMWATCH_SUPPORT_CHAT = "@AbishnoiMF" + + REDIS_URL = "" + + DRAGONS = get_user_list("elevated_users.json", "sudos") + DEV_USERS = get_user_list("elevated_users.json", "devs") + REQUESTER = get_user_list("elevated_users.json", "whitelists") + DEMONS = get_user_list("elevated_users.json", "supports") + INSPECTOR = get_user_list("elevated_users.json", "sudos") + TIGERS = get_user_list("elevated_users.json", "tigers") + WOLVES = get_user_list("elevated_users.json", "whitelists") + + DONATION_LINK = "https://t.me/Abishnoi1M" + CERT_PATH = None + STRICT_GBAN = "True" + PORT = "" + DEL_CMDS = True + STRICT_GBAN = True + WORKERS = 8 + BAN_STICKER = "" + ALLOW_EXCL = True + CASH_API_KEY = "NAI H BRO" + TIME_API_KEY = "ABISHNOI" + WALL_API = "F-OFF" + AI_API_KEY = "LOVEYOU" + BL_CHATS = [] + SPAMMERS = None + SPAMWATCH_API = "" + ALLOW_CHATS = None + TEMP_DOWNLOAD_DIRECTORY = "./" + HEROKU_APP_NAME = "" + HEROKU_API_KEY = "" + REM_BG_API_KEY = "LSdLgCceYz8vNqFgJVzrkDgR" + LASTFM_API_KEY = "FMLODA" + CF_API_KEY = "KISS" + BL_CHATS = [] + MONGO_PORT = "27017" + MONGO_DB = "EXON" + PHOTO = "https://telegra.ph/file/14d1f98500af1132e5460.jpg" + HELP_IMG = "https://telegra.ph/file/14d1f98500af1132e5460.jpg" + START_IMG = "https://telegra.ph/file/14d1f98500af1132e5460.jpg" + TIME_API_KEY = "5LB4TAKPEKZ0" + INFOPIC = False + GENIUS_API_TOKEN = "28jwoKAkskaSjsnsksAjnwjUJwj" + + +class Production(Config): + LOGGER = True + + +class Development(Config): + LOGGER = True + + +# ENJOY diff --git a/Exon/confing.py b/Exon/confing.py new file mode 100644 index 00000000..33bc567a --- /dev/null +++ b/Exon/confing.py @@ -0,0 +1,37 @@ +from envparse import env + +from Exon import LOGGER + +DEFAULTS = { + "LOAD_MODULES": True, +} + + +def get_str_key(name, required=False): + if name in DEFAULTS: + default = DEFAULTS[name] + else: + default = None + if not (data := env.str(name, default=default)) and not required: + LOGGER.warn("No str key: " + name) + return None + elif not data: + LOGGER.critical("No str key: " + name) + sys.exit(2) + else: + return data + + +def get_int_key(name, required=False): + if name in DEFAULTS: + default = DEFAULTS[name] + else: + default = None + if not (data := env.int(name, default=default)) and not required: + LOGGER.warn("No int key: " + name) + return None + elif not data: + LOGGER.critical("No int key: " + name) + sys.exit(2) + else: + return data diff --git "a/Exon/core/ABISHNOI COPYRIGHT \302\251" "b/Exon/core/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/core/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git "a/Exon/core/decorators/ABISHNOI COPYRIGHT \302\251" "b/Exon/core/decorators/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/core/decorators/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/core/decorators/errors.py b/Exon/core/decorators/errors.py new file mode 100644 index 00000000..d54ccdf6 --- /dev/null +++ b/Exon/core/decorators/errors.py @@ -0,0 +1,80 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 sys +import traceback +from functools import wraps + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden + +from Exon import ERROR_LOGS, pgram + + +def split_limits(text): + if len(text) < 2048: + return [text] + + lines = text.splitlines(True) + small_msg = "" + result = [] + for line in lines: + if len(small_msg) + len(line) < 2048: + small_msg += line + else: + result.append(small_msg) + small_msg = line + result.append(small_msg) + + return result + + +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await pgram.leave_chat(message.chat.id) + return + except Exception as err: + exc_type, exc_obj, exc_tb = sys.exc_info() + errors = traceback.format_exception( + etype=exc_type, + value=exc_obj, + tb=exc_tb, + ) + error_feedback = split_limits( + "**ERROR** | `{}` | `{}`\n\n```{}```\n\n```{}```\n".format( + message.from_user.id if message.from_user else 0, + message.chat.id if message.chat else 0, + message.text or message.caption, + "".join(errors), + ) + ) + + for x in error_feedback: + await pgram.send_message(ERROR_LOGS, x) + raise err + + return capture diff --git a/Exon/core/decorators/permissions.py b/Exon/core/decorators/permissions.py new file mode 100644 index 00000000..337b731e --- /dev/null +++ b/Exon/core/decorators/permissions.py @@ -0,0 +1,90 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 functools import wraps +from traceback import format_exc as err + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden +from pyrogram.types import Message + +from Exon import DEV_USERS, pgram +from Exon.modules.adminserv import member_permissions + + +async def authorised(func, subFunc2, client, message, *args, **kwargs): + chatID = message.chat.id + try: + await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await pgram.leave_chat(chatID) + 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): + chatID = message.chat.id + text = ( + "ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴛʜᴇ ʀᴇǫᴜɪʀᴇᴅ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴛʜɪs ᴀᴄᴛɪᴏɴ." + + f"\n**ᴘᴇʀᴍɪssɪᴏɴ:** __{permission}__" + ) + try: + await message.reply_text(text) + except ChatWriteForbidden: + await pgram.leave_chat(chatID) + 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) + if userID not in DEV_USERS and permission not in permissions: + return await unauthorised(message, permission, subFunc2) + return await authorised(func, subFunc2, client, message, *args, **kwargs) + + return subFunc2 + + return subFunc diff --git a/Exon/core/sections.py b/Exon/core/sections.py new file mode 100644 index 00000000..216374d3 --- /dev/null +++ b/Exon/core/sections.py @@ -0,0 +1,48 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +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 diff --git a/Exon/elevated_users.json b/Exon/elevated_users.json new file mode 100644 index 00000000..fbd7a02e --- /dev/null +++ b/Exon/elevated_users.json @@ -0,0 +1,11 @@ +{ + "devs": [1452219013], + "sudos": [1452219013], + "supports": [1452219013], + "whitelists": [1452219013], + "dragons": [1452219013], + "tigers": [1452219013], + "spammers": [1452219013] +} + + diff --git a/Exon/events.py b/Exon/events.py new file mode 100644 index 00000000..ae9eea01 --- /dev/null +++ b/Exon/events.py @@ -0,0 +1,94 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi """ + +from telethon import events + +from Exon import telethn + + +def register(**args): + """Registers a new message.""" + pattern = args.get("pattern") + + r_pattern = r"^[/!]" + + if pattern is not None and not pattern.startswith("(?i)"): + args["pattern"] = f"(?i){pattern}" + + args["pattern"] = pattern.replace("^/", r_pattern, 1) + + def decorator(func): + telethn.add_event_handler(func, events.NewMessage(**args)) + return func + + return decorator + + +def chataction(**args): + """Registers chat actions.""" + + def decorator(func): + telethn.add_event_handler(func, events.ChatAction(**args)) + return func + + return decorator + + +def userupdate(**args): + """Registers user updates.""" + + def decorator(func): + telethn.add_event_handler(func, events.UserUpdate(**args)) + return func + + return decorator + + +def inlinequery(**args): + """Registers inline query.""" + pattern = args.get("pattern") + + if pattern is not None and not pattern.startswith("(?i)"): + args["pattern"] = f"(?i){pattern}" + + def decorator(func): + telethn.add_event_handler(func, events.InlineQuery(**args)) + return func + + return decorator + + +def callbackquery(**args): + """Registers inline query.""" + + def decorator(func): + telethn.add_event_handler(func, events.CallbackQuery(**args)) + return func + + return decorator diff --git "a/Exon/modules/ABISHNOI COPYRIGHT \302\251" "b/Exon/modules/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/modules/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/modules/__init__.py b/Exon/modules/__init__.py new file mode 100644 index 00000000..c66d48ab --- /dev/null +++ b/Exon/modules/__init__.py @@ -0,0 +1,73 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import sys + +from Exon import LOAD, LOGGER, NO_LOAD + + +def __list_all_modules(): + import glob + from os.path import basename, dirname, isfile + + # 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") + ] + + if LOAD or NO_LOAD: + to_load = LOAD + if to_load: + if not all( + any(mod == module_name for module_name in all_modules) + for mod in to_load + ): + LOGGER.error("ɪɴᴠᴀʟɪᴅ ʟᴏᴀᴅᴏʀᴅᴇʀ ɴᴀᴍᴇs. ǫᴜɪᴛᴛɪɴɢ.") + sys.exit(1) + + all_modules = sorted(set(all_modules) - set(to_load)) + to_load = list(all_modules) + to_load + + else: + to_load = all_modules + + if NO_LOAD: + LOGGER.info(f"Not loading: {NO_LOAD}") + return [item for item in to_load if item not in NO_LOAD] + + return to_load + + return all_modules + + +ALL_MODULES = __list_all_modules() +LOGGER.info("ᴍᴏᴅᴜʟᴇs ᴛᴏ ʟᴏᴀᴅ: %s", str(ALL_MODULES)) +__all__ = ALL_MODULES + ["ALL_MODULES"] diff --git a/Exon/modules/admin.py b/Exon/modules/admin.py new file mode 100644 index 00000000..b1042b1d --- /dev/null +++ b/Exon/modules/admin.py @@ -0,0 +1,1113 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import os +from typing import Optional + +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CallbackQueryHandler, CommandHandler, Filters +from telegram.utils.helpers import mention_html + +from Exon import DRAGONS, LOGGER, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_message +from Exon.modules.helper_funcs.chat_status import ( + ADMIN_CACHE, + bot_admin, + can_pin, + can_promote, + connection_status, + is_user_admin, + user_admin, + user_can_promote, +) +from Exon.modules.helper_funcs.extraction import extract_user, extract_user_and_text +from Exon.modules.log_channel import loggable + + +def user_can_changeinfo(chat, user_admin, id): + pass + + +@bot_admin +@user_admin +def set_sticker(update: Update, context: CallbackContext): + msg = update.effective_message + chat = update.effective_chat + user = update.effective_user + + if user_can_changeinfo(chat, user, context.bot.id) is False: + return msg.reply_text("You're missing rights to change chat info!") + + if msg.reply_to_message: + if not msg.reply_to_message.sticker: + return msg.reply_text( + "You need to reply to some sticker to set chat sticker set!" + ) + stkr = msg.reply_to_message.sticker.set_name + try: + context.bot.set_chat_sticker_set(chat.id, stkr) + msg.reply_text(f"Successfully set new group stickers in {chat.title}!") + except BadRequest as excp: + if excp.message == "Participants_too_few": + return msg.reply_text( + "Sorry, due to telegram restrictions chat needs to have minimum 100 members before they can have group stickers!" + ) + msg.reply_text(f"Error! {excp.message}.") + else: + msg.reply_text("You need to reply to some sticker to set chat sticker set!") + + +@bot_admin +@user_admin +def setchatpic(update: Update, context: CallbackContext): + chat = update.effective_chat + msg = update.effective_message + user = update.effective_user + + if user_can_changeinfo(chat, user, context.bot.id) is False: + msg.reply_text("You are missing right to change group info!") + return + + if msg.reply_to_message: + if msg.reply_to_message.photo: + pic_id = msg.reply_to_message.photo[-1].file_id + elif msg.reply_to_message.document: + pic_id = msg.reply_to_message.document.file_id + else: + msg.reply_text("You can only set some photo as chat pic!") + return + dlmsg = msg.reply_text("Just a sec...") + tpic = context.bot.get_file(pic_id) + tpic.download("gpic.png") + try: + with open("gpic.png", "rb") as chatp: + context.bot.set_chat_photo(int(chat.id), photo=chatp) + msg.reply_text("Successfully set new chatpic!") + except BadRequest as excp: + msg.reply_text(f"Error! {excp.message}") + finally: + dlmsg.delete() + if os.path.isfile("gpic.png"): + os.remove("gpic.png") + else: + msg.reply_text("Reply to some photo or file to set new chat pic!") + + +@bot_admin +@user_admin +def rmchatpic(update: Update, context: CallbackContext): + chat = update.effective_chat + msg = update.effective_message + user = update.effective_user + + if user_can_changeinfo(chat, user, context.bot.id) is False: + msg.reply_text("You don't have enough rights to delete group photo") + return + try: + context.bot.delete_chat_photo(int(chat.id)) + msg.reply_text("Successfully deleted chat's profile photo!") + except BadRequest as excp: + msg.reply_text(f"Error! {excp.message}.") + return + + +@bot_admin +@user_admin +def set_desc(update: Update, context: CallbackContext): + msg = update.effective_message + chat = update.effective_chat + user = update.effective_user + + if user_can_changeinfo(chat, user, context.bot.id) is False: + return msg.reply_text("You're missing rights to change chat info!") + + tesc = msg.text.split(None, 1) + if len(tesc) >= 2: + desc = tesc[1] + else: + return msg.reply_text("Setting empty description won't do anything!") + try: + if len(desc) > 255: + return msg.reply_text("Description must needs to be under 255 characters!") + context.bot.set_chat_description(chat.id, desc) + msg.reply_text(f"Successfully updated chat description in {chat.title}!") + except BadRequest as excp: + msg.reply_text(f"Error! {excp.message}.") + + +@bot_admin +@user_admin +def setchat_title(update: Update, context: CallbackContext): + chat = update.effective_chat + msg = update.effective_message + user = update.effective_user + args = context.args + + if user_can_changeinfo(chat, user, context.bot.id) is False: + msg.reply_text("You don't have enough rights to change chat info!") + return + + title = " ".join(args) + if not title: + msg.reply_text("Enter some text to set new title in your chat!") + return + + try: + context.bot.set_chat_title(int(chat.id), title) + msg.reply_text( + f"Successfully set {title} as new chat title!", + parse_mode=ParseMode.HTML, + ) + except BadRequest as excp: + msg.reply_text(f"Error! {excp.message}.") + return + + +@connection_status +@bot_admin +@can_promote +@user_admin +@loggable +def promote(update: Update, context: CallbackContext) -> str: + bot = context.bot + args = context.args + + message = update.effective_message + chat = update.effective_chat + user = update.effective_user + + promoter = chat.get_member(user.id) + + if ( + not (promoter.can_promote_members or promoter.status == "creator") + and user.id not in DRAGONS + ): + message.reply_text("You don't have the necessary rights to do that!") + return + + user_id = extract_user(message, args) + + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect..", + ) + return + + try: + user_member = chat.get_member(user_id) + except: + return + + if user_member.status in ("administrator", "creator"): + message.reply_text("How am I meant to promote someone that's already an admin?") + return + + if user_id == bot.id: + message.reply_text("I can't promote myself! Get an admin to do it for me.") + return + + # set same perms as bot - bot can't assign higher perms than itself! + bot_member = chat.get_member(bot.id) + + try: + bot.promoteChatMember( + chat.id, + user_id, + # can_change_info=bot_member.can_change_info, + can_post_messages=bot_member.can_post_messages, + can_edit_messages=bot_member.can_edit_messages, + can_delete_messages=bot_member.can_delete_messages, + can_invite_users=bot_member.can_invite_users, + # can_promote_members=bot_member.can_promote_members, + can_restrict_members=bot_member.can_restrict_members, + can_pin_messages=bot_member.can_pin_messages, + ) + except BadRequest as err: + if err.message == "User_not_mutual_contact": + message.reply_text("I can't promote someone who isn't in the group.") + else: + message.reply_text("An error occured while promoting.") + return + + bot.sendMessage( + chat.id, + f"Sucessfully promoted {user_member.user.first_name or user_id} ({user_id}) in {chat.title}", + parse_mode=ParseMode.HTML, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🔽 Demote", + callback_data=f"admin_demote_{user_member.user.id}", + ), + InlineKeyboardButton( + text="🔄 AdminCache", + callback_data=f"admin_refresh_{user_member.user.id}", + ), + ], + ], + ), + ) + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#PROMOTED\n" + f"Admin: {mention_html(user.id, user.first_name)}\n" + f"User: {mention_html(user_member.user.id, user_member.user.first_name)}" + ) + + return log_message + + +@connection_status +@bot_admin +@can_promote +@user_admin +@loggable +def fullpromote(update: Update, context: CallbackContext) -> str: + bot = context.bot + args = context.args + + message = update.effective_message + chat = update.effective_chat + user = update.effective_user + + promoter = chat.get_member(user.id) + + if ( + not (promoter.can_promote_members or promoter.status == "creator") + and user.id not in DRAGONS + ): + message.reply_text("You don't have the necessary rights to do that!") + return + + user_id = extract_user(message, args) + + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect..", + ) + return + + try: + user_member = chat.get_member(user_id) + except: + return + + if user_member.status in ("administrator", "creator"): + message.reply_text("How am I meant to promote someone that's already an admin?") + return + + if user_id == bot.id: + message.reply_text("I can't promote myself! Get an admin to do it for me.") + return + + # set same perms as bot - bot can't assign higher perms than itself! + bot_member = chat.get_member(bot.id) + + try: + bot.promoteChatMember( + chat.id, + user_id, + can_change_info=bot_member.can_change_info, + can_post_messages=bot_member.can_post_messages, + can_edit_messages=bot_member.can_edit_messages, + can_delete_messages=bot_member.can_delete_messages, + can_invite_users=bot_member.can_invite_users, + can_promote_members=bot_member.can_promote_members, + can_restrict_members=bot_member.can_restrict_members, + can_pin_messages=bot_member.can_pin_messages, + can_manage_voice_chats=bot_member.can_manage_voice_chats, + ) + except BadRequest as err: + if err.message == "User_not_mutual_contact": + message.reply_text("I can't promote someone who isn't in the group.") + else: + message.reply_text("An error occured while promoting.") + return + + bot.sendMessage( + chat.id, + f"Sucessfully promoted {user_member.user.first_name or user_id} ({user_id}) with full rights in {chat.title}!", + parse_mode=ParseMode.HTML, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="🔽 Demote", + callback_data=f"admin_demote_{user_member.user.id}", + ), + InlineKeyboardButton( + text="🔄 AdminCache", + callback_data=f"admin_refresh_{user_member.user.id}", + ), + ], + ], + ), + ) + + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#FULLPROMOTED\n" + f"Admin: {mention_html(user.id, user.first_name)}\n" + f"User: {mention_html(user_member.user.id, user_member.user.first_name)}" + ) + + return log_message + + +@connection_status +@bot_admin +@can_promote +@user_admin +@loggable +def lowpromote(update: Update, context: CallbackContext) -> str: + bot = context.bot + args = context.args + + message = update.effective_message + chat = update.effective_chat + user = update.effective_user + + promoter = chat.get_member(user.id) + + if ( + not (promoter.can_promote_members or promoter.status == "creator") + and user.id not in DRAGONS + ): + message.reply_text("You don't have the necessary rights to do that!") + return + + user_id = extract_user(message, args) + + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect..", + ) + return + + try: + user_member = chat.get_member(user_id) + except: + return + + if user_member.status in ("administrator", "creator"): + message.reply_text("How am I meant to promote someone that's already an admin?") + return + + if user_id == bot.id: + message.reply_text("I can't promote myself! Get an admin to do it for me.") + return + + # set same perms as bot - bot can't assign higher perms than itself! + bot_member = chat.get_member(bot.id) + + try: + bot.promoteChatMember( + chat.id, + user_id, + can_delete_messages=bot_member.can_delete_messages, + can_invite_users=bot_member.can_invite_users, + can_pin_messages=bot_member.can_pin_messages, + ) + except BadRequest as err: + if err.message == "User_not_mutual_contact": + message.reply_text("I can't promote someone who isn't in the group.") + else: + message.reply_text("An error occured while promoting.") + return + + bot.sendMessage( + chat.id, + f"Sucessfully promoted {user_member.user.first_name or user_id} with low rights!", + parse_mode=ParseMode.HTML, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Demote", + callback_data=f"admin_demote_{user_member.user.id}", + ), + InlineKeyboardButton( + text="AdminCache", + callback_data=f"admin_refresh_{user_member.user.id}", + ), + ], + ], + ), + ) + + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#LOWPROMOTED\n" + f"Admin: {mention_html(user.id, user.first_name)}\n" + f"User: {mention_html(user_member.user.id, user_member.user.first_name)}" + ) + + return log_message + + +@connection_status +@bot_admin +@can_promote +@user_admin +@loggable +def demote(update: Update, context: CallbackContext) -> Optional[str]: + bot = context.bot + args = context.args + + chat = update.effective_chat + message = update.effective_message + user = update.effective_user + + user_id = extract_user(message, args) + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect.." + ) + return + + try: + user_member = chat.get_member(user_id) + except: + return + + if user_member.status == "creator": + message.reply_text("This person CREATED the chat, how would I demote them?") + return + + if user_member.status != "administrator": + message.reply_text("Can't demote what wasn't promoted!") + return + + if user_id == bot.id: + message.reply_text("I can't demote myself! Get an admin to do it for me.") + return + + try: + bot.promoteChatMember( + chat.id, + user_id, + can_change_info=False, + can_post_messages=False, + can_edit_messages=False, + can_delete_messages=False, + can_invite_users=False, + can_restrict_members=False, + can_pin_messages=False, + can_promote_members=False, + can_manage_voice_chats=False, + ) + + bot.sendMessage( + chat.id, + f"{user_member.user.first_name or user_id or None} was demoted by {message.from_user.first_name or None} in {chat.title or None}", + parse_mode=ParseMode.HTML, + ) + + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#DEMOTED\n" + f"Admin: {mention_html(user.id, user.first_name)}\n" + f"User: {mention_html(user_member.user.id, user_member.user.first_name)}" + ) + + return log_message + except BadRequest: + message.reply_text( + "Could not demote. I might not be admin, or the admin status was appointed by another" + " user, so I can't act upon them!" + ) + return + + +@user_admin +def refresh_admin(update, _): + try: + ADMIN_CACHE.pop(update.effective_chat.id) + except KeyError: + pass + + update.effective_message.reply_text("Admins cache refreshed!") + + +@connection_status +@bot_admin +@can_promote +@user_admin +def set_title(update: Update, context: CallbackContext): + bot = context.bot + args = context.args + + chat = update.effective_chat + message = update.effective_message + + user_id, title = extract_user_and_text(message, args) + try: + user_member = chat.get_member(user_id) + except: + return + + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect..", + ) + return + + if user_member.status == "creator": + message.reply_text( + "This person CREATED the chat, how can i set custom title for him?", + ) + return + + if user_member.status != "administrator": + message.reply_text( + "Can't set title for non-admins!\nPromote them first to set custom title!", + ) + return + + if user_id == bot.id: + message.reply_text( + "I can't set my own title myself! Get the one who made me admin to do it for me.", + ) + return + + if not title: + message.reply_text("Setting blank title doesn't do anything!") + return + + if len(title) > 16: + message.reply_text( + "The title length is longer than 16 characters.\nTruncating it to 16 characters.", + ) + + try: + bot.setChatAdministratorCustomTitle(chat.id, user_id, title) + except BadRequest: + message.reply_text( + "Either they aren't promoted by me or you set a title text that is impossible to set." + ) + return + + bot.sendMessage( + chat.id, + f"Sucessfully set title for {user_member.user.first_name or user_id} " + f"to {html.escape(title[:16])}!", + parse_mode=ParseMode.HTML, + ) + + +@bot_admin +@can_pin +@user_admin +@loggable +def pin(update: Update, context: CallbackContext) -> str: + bot = context.bot + args = context.args + + user = update.effective_user + chat = update.effective_chat + + is_group = chat.type not in ("private", "channel") + prev_message = update.effective_message.reply_to_message + + is_silent = True + if len(args) >= 1: + is_silent = args[0].lower() in ("notify", "loud", "violent") + + if prev_message and is_group: + try: + bot.pinChatMessage( + chat.id, + prev_message.message_id, + disable_notification=is_silent, + ) + except BadRequest as excp: + if excp.message != "Chat_not_modified": + raise + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#PINNED\n" + f"Admin: {mention_html(user.id, html.escape(user.first_name))}" + ) + + return log_message + + +@bot_admin +@can_pin +@user_admin +@loggable +def unpin(update: Update, context: CallbackContext) -> str: + bot = context.bot + chat = update.effective_chat + user = update.effective_user + + try: + bot.unpinChatMessage(chat.id) + except BadRequest as excp: + if excp.message == "Chat_not_modified": + pass + else: + raise + + log_message = ( + f"{html.escape(chat.title)}:\n" + f"#UNPINNED\n" + f"Admin: {mention_html(user.id, html.escape(user.first_name))}" + ) + + return log_message + + +@bot_admin +def pinned(update: Update, context: CallbackContext) -> str: + bot = context.bot + msg = update.effective_message + msg_id = ( + update.effective_message.reply_to_message.message_id + if update.effective_message.reply_to_message + else update.effective_message.message_id + ) + + chat = bot.getChat(chat_id=msg.chat.id) + if chat.pinned_message: + pinned_id = chat.pinned_message.message_id + if msg.chat.username: + link_chat_id = msg.chat.username + message_link = f"https://t.me/{link_chat_id}/{pinned_id}" + elif (str(msg.chat.id)).startswith("-100"): + link_chat_id = (str(msg.chat.id)).replace("-100", "") + message_link = f"https://t.me/c/{link_chat_id}/{pinned_id}" + + msg.reply_text( + f"Pinned on {html.escape(chat.title)}.", + reply_to_message_id=msg_id, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Pinned Message", + url=f"https://t.me/{link_chat_id}/{pinned_id}", + ) + ] + ] + ), + ) + + else: + msg.reply_text( + f"There is no pinned message in {html.escape(chat.title)}!", + parse_mode=ParseMode.HTML, + ) + + +@bot_admin +@user_admin +@connection_status +def invite(update: Update, context: CallbackContext): + bot = context.bot + chat = update.effective_chat + + if chat.username: + update.effective_message.reply_text(f"https://t.me/{chat.username}") + elif chat.type in [chat.SUPERGROUP, chat.CHANNEL]: + bot_member = chat.get_member(bot.id) + if bot_member.can_invite_users: + invitelink = bot.exportChatInviteLink(chat.id) + update.effective_message.reply_text(invitelink) + else: + update.effective_message.reply_text( + "I don't have access to the invite link, try changing my permissions!", + ) + else: + update.effective_message.reply_text( + "I can only give you invite links for supergroups and channels, sorry!", + ) + + +@connection_status +def adminlist(update, context): + chat = update.effective_chat ## type: Optional[Chat] -> unused variable + user = update.effective_user # type: Optional[User] + args = context.args # -> unused variable + bot = context.bot + + if update.effective_message.chat.type == "private": + send_message(update.effective_message, "This command only works in Groups.") + return + + update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title # -> unused variable + + try: + msg = update.effective_message.reply_text( + "Fetching group admins...", + parse_mode=ParseMode.HTML, + ) + except BadRequest: + msg = update.effective_message.reply_text( + "Fetching group admins...", + quote=False, + parse_mode=ParseMode.HTML, + ) + + administrators = bot.getChatAdministrators(chat_id) + text = f"Admins in {html.escape(update.effective_chat.title)}:" + + for admin in administrators: + user = admin.user + status = admin.status + custom_title = admin.custom_title + + if user.first_name == "": + name = "☠ Deleted Account" + else: + name = "{}".format( + mention_html( + user.id, + html.escape(f"{user.first_name} " + ((user.last_name or ""))), + ) + ) + + ##if user.is_bot: + # bot_admin_list.append(name) + # administrators.remove(admin) + # continue + + # continue + + # if user.username: + # name = escape_markdown("@" + user.username) + if status == "creator": + text += "\n\n 🌐 ᴄʀᴇᴀᴛᴏʀ:" + text += f" {name}\n" + + if custom_title: + text += f" ┗━ {html.escape(custom_title)}\n" + + text += "\n 🎖 ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs" + + custom_admin_list = {} + normal_admin_list = [] + + for admin in administrators: + user = admin.user + status = admin.status + custom_title = admin.custom_title + + if user.first_name == "": + name = "☠ Deleted Account" + else: + name = "{}".format( + mention_html( + user.id, + html.escape(f"{user.first_name} " + ((user.last_name or ""))), + ) + ) + + if status == "administrator": + if custom_title: + try: + custom_admin_list[custom_title].append(name) + except KeyError: + custom_admin_list[custom_title] = [name] + else: + normal_admin_list.append(name) + + for admin in normal_admin_list: + text += f"\n{admin}" + + for admin_group in custom_admin_list.copy(): + if len(custom_admin_list[admin_group]) == 1: + text += f"\n{custom_admin_list[admin_group][0]} | {html.escape(admin_group)}" + + custom_admin_list.pop(admin_group) + + text += "\n" + for admin_group, value in custom_admin_list.items(): + text += f"\n🚨 {admin_group}" + for admin in value: + text += f"\n{admin}" + text += "\n" + + # text += "\n🤖 Bots:" + # for each_bot in bot_admin_list: + # text += "\n{}".format(each_bot) + + try: + msg.edit_text(text, parse_mode=ParseMode.HTML) + except BadRequest: # if original message is deleted + return + + +# if user.is_bot: + +# bot_admin_list.append(name) + +# administrators.remove(admin) + +# text += "Bottos:" + +# for each_bot in bot_admin_list: + + +@user_admin +@user_can_promote +def promote_button(update: Update, context: CallbackContext): + query = update.callback_query + user = update.effective_user + chat = update.effective_chat + bot = context.bot + + mode = query.data.split("_")[1] + try: + if is_user_admin(chat, user.id): + if mode == "demote": + user_id = query.data.split("_")[2] + user_member = chat.get_member(user_id) + bot.promoteChatMember( + chat.id, + user_id, + can_change_info=False, + can_post_messages=False, + can_edit_messages=False, + can_delete_messages=False, + can_invite_users=False, + can_restrict_members=False, + can_pin_messages=False, + can_promote_members=False, + # can_manage_voice_chats=False + ) + query.message.delete() + bot.answer_callback_query( + query.id, + f"Sucessfully demoted {user_member.user.first_name or user_id}", + show_alert=True, + ) + elif mode == "refresh": + try: + ADMIN_CACHE.pop(update.effective_chat.id) + except KeyError: + pass + bot.answer_callback_query(query.id, "Admins cache refreshed!") + except BadRequest as excp: + if excp.message not in [ + "Message is not mod", + "User_id_invalid", + "Message Deleted", + ]: + LOGGER.exception("Exception in promote buttons. %s", str(query.data)) + + +__help__ = """ +ʜᴇʀᴇ ɪs ᴛʜᴇ ʜᴇʟᴘ ғᴏʀ ᴛʜᴇ *ᴀᴅᴍɪɴs* ᴍᴏᴅᴜʟᴇ: + +*ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅs*: + +✥ ᴘɪɴs ❉ + + • /pin: `sɪʟᴇɴᴛʟʏ ᴘɪɴs ᴛʜᴇ ᴍᴇssᴀɢᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ` + + • /unpin: `ᴜɴᴘɪɴs ᴛʜᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴘɪɴɴᴇᴅ ᴍᴇssᴀɢᴇ ` + + • /pinned: `ᴛᴏ ɢᴇᴛ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴘɪɴɴᴇᴅ ᴍᴇssᴀɢᴇ ` + + • /unpinall: `ᴛᴏ ᴜɴᴘɪɴ ᴀʟʟ ᴍᴇssᴀɢᴇs ɪɴ ᴛʜᴇ ᴄʜᴀᴛ ` + + +❉ ᴘʀᴏᴍᴏᴛᴇ ᴀɴᴅ ᴛɪᴛʟᴇs ❉: + + • /promote: `ᴘʀᴏᴍᴏᴛᴇs ᴛʜᴇ ᴜsᴇʀ ʀᴇᴘʟɪᴇᴅ ᴛᴏ (ᴄᴀɴ ʙᴇ ᴜsᴇᴅ ᴀs ғᴜʟʟᴘʀᴏᴍᴏᴛᴇ ᴏʀ ʟᴏᴡ ᴘʀᴏᴍᴏᴛᴇ)` + + • /demote: `ᴅᴇᴍᴏᴛᴇs ᴛʜᴇ ᴜsᴇʀ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ` + + • /title : `sᴇᴛs ᴀ ᴄᴜsᴛᴏᴍ ᴛɪᴛʟᴇ ғᴏʀ ᴀɴ ᴀᴅᴍɪɴ ᴛʜᴀᴛ ᴛʜᴇ ʙᴏᴛ ᴘʀᴏᴍᴏᴛᴇᴅ ` + + • /admincache: `ғᴏʀᴄᴇ ʀᴇғʀᴇsʜ ᴛʜᴇ ᴀᴅᴍɪɴs ʟɪsᴛ` + +❉ ᴏᴛʜᴇʀs :❉ + + • /setgtitle <new title>: `sᴇᴛs ᴄʜᴀᴛ ᴛɪᴛʟᴇ` + + • /setdesc <description>: `sᴇᴛs ᴄʜᴀᴛ ᴅᴇsᴄʀɪᴘᴛɪᴏɴ` + + • /setsticker <reply to sticker>: ` sᴇᴛs sᴛɪᴄᴋᴇʀ ᴘᴀᴄᴋ ɪɴ ᴀ sᴜᴘᴇʀɢʀᴏᴜᴘ` + + • /setgpic <reply to a picture>: `sᴇᴛs ɢʀᴏᴜᴘ's ᴘʀᴏғɪʟᴇ ᴘʜᴏᴛᴏ ` + + • /delgpic: `ʀᴇᴍᴏᴠᴇs ɢʀᴏᴜᴘ's ᴘʀᴏғɪʟᴇ ᴘʜᴏᴛᴏ ` + + • /admins: `sʜᴏᴡs ᴀᴅᴍɪɴ ʟɪsᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ` + + • /invitelink: `ɢᴇᴛs ɪɴᴠɪᴛᴇ ʟɪɴᴋ ᴏғ ᴛʜᴀᴛ ᴄʜᴀᴛ ` + +*ᴍᴏᴅᴇʀᴀᴛɪᴏɴ*: + +❉ ʙᴀɴɴɪɴɢ ᴀɴᴅ ᴋɪᴄᴋs: ❉ + + • /ban <userhandle>: `ʙᴀɴs a ᴜsᴇʀ (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ`) + + • /sban <userhandle>: `sɪʟᴇɴᴛʟʏ ʙᴀɴ ᴀ ᴜsᴇʀ ᴛʜᴇɴ ᴅᴇʟᴇᴛᴇs ᴄᴏᴍᴍᴀɴᴅ + ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴍᴇssᴀɢᴇ ᴀɴᴅ ᴅᴏᴇsɴ'ᴛ ʀᴇᴘʟʏ (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ)` + + • /dban <messagereplied>: `sɪʟᴇɴᴛʟʏ ʙᴀɴs ᴛʜᴇ ᴜsᴇʀ ᴀɴᴅ ᴅᴇʟᴇᴛᴇs ᴛʜᴇ ᴛᴀʀɢᴇᴛ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴍᴇssᴀɢᴇ + + • /tban <userhandle> x(m/h/d): `ʙᴀɴs ᴀ ᴜsᴇʀ ғᴏʀ x ᴛɪᴍᴇ, (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ) ᴍ = ᴍɪɴᴜᴛᴇs, ʜ = ʜᴏᴜʀs, ᴅ = ᴅᴀʏs + + • /unban <userhandle>: `ᴜɴʙᴀɴs ᴀ ᴜsᴇʀ (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ)` + + • /punch or kick <userhandle>: `ᴘᴜɴᴄʜᴇs ᴀ ᴜsᴇʀ ᴏᴜᴛ ᴏғ ᴛʜᴇ group (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ)` + +❉ ᴍᴜᴛɪɴɢ: ❉ + + • /mute <userhandle>: `sɪʟᴇɴᴄᴇs ᴀ ᴜsᴇʀ, ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ, ᴍᴜᴛɪɴɢ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴜsᴇʀ` + + • /tmute <userhandle> x(m/h/d): ᴍᴜᴛᴇs ᴀ ᴜsᴇʀ ғᴏʀ x ᴛɪᴍᴇ (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ). ᴍ = minutes, ʜ = ʜᴏᴜʀs, ᴅ = ᴅᴀʏs + + • /unmute <userhandle>: `ᴜɴᴍᴜᴛᴇs ᴀ ᴜsᴇʀ, ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ, ᴍᴜᴛɪɴɢ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴜsᴇʀ ` + +*ʟᴏɢɢɪɴɢ*: + + • /logchannel: ɢᴇᴛ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ɪɴғᴏ + + • /setlog: sᴇᴛ ᴛʜᴇ ʟᴏɢ ᴄʜᴀɴɴᴇʟ + + • /unsetlog: ᴜɴsᴇᴛ ᴛʜᴇ ʟᴏɢ ᴄʜᴀɴɴᴇʟ + +✥ ʜᴏᴡ ᴛᴏ sᴇᴛᴜᴘ: + + • ᴀᴅᴅ ʙᴏᴛ ᴛᴏ ᴄʜᴀɴɴᴇʟ ᴡɪᴛʜ ᴀᴅᴍɪɴ ᴘᴇʀᴍs + + • sᴇɴᴅ /setlog ᴄᴏᴍᴍᴀɴᴅ ɪɴ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ + + • ғᴏʀᴡᴀʀᴅ ᴛʜᴀᴛ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇ ᴛᴏ ᴛʜᴇ ɢʀᴏᴜᴘ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ sᴇᴛᴜᴘ ʟᴏɢɢɪɴɢ ғᴏʀ, ᴛʜᴇ sᴀᴍᴇ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇ ᴄᴀɴ ʙᴇ ғᴏʀᴡᴀʀᴅᴇᴅ ᴛᴏ ᴍᴜʟᴛɪᴘʟᴇ ɢʀᴏᴜᴘs ᴀᴛ ᴏɴᴄᴇ ᴀs ᴡᴇʟʟ + +✥ ʀᴜʟᴇs: + + • /rules: `ɢᴇᴛ ᴛʜᴇ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ` + + • /setrules <ʏᴏᴜʀ ʀᴜʟᴇs ʜᴇʀᴇ>: `sᴇᴛ ᴛʜᴇ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ` + + • /clearrules: `ᴄʟᴇᴀʀ ᴛʜᴇ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ ` + +""" +SET_DESC_HANDLER = CommandHandler( + "setdesc", set_desc, filters=Filters.chat_type.groups, run_async=True +) +SET_STICKER_HANDLER = CommandHandler( + "setsticker", set_sticker, filters=Filters.chat_type.groups, run_async=True +) +SETCHATPIC_HANDLER = CommandHandler( + "setgpic", setchatpic, filters=Filters.chat_type.groups, run_async=True +) +RMCHATPIC_HANDLER = CommandHandler( + "delgpic", rmchatpic, filters=Filters.chat_type.groups, run_async=True +) +SETCHAT_TITLE_HANDLER = CommandHandler( + "setgtitle", setchat_title, filters=Filters.chat_type.groups, run_async=True +) + +ADMINLIST_HANDLER = DisableAbleCommandHandler("admins", adminlist, run_async=True) + +PIN_HANDLER = CommandHandler( + "pin", pin, filters=Filters.chat_type.groups, run_async=True +) +UNPIN_HANDLER = CommandHandler( + "unpin", unpin, filters=Filters.chat_type.groups, run_async=True +) +PINNED_HANDLER = CommandHandler( + "pinned", pinned, filters=Filters.chat_type.groups, run_async=True +) + +INVITE_HANDLER = DisableAbleCommandHandler("invitelink", invite, run_async=True) + +PROMOTE_HANDLER = DisableAbleCommandHandler("promote", promote, run_async=True) +FULLPROMOTE_HANDLER = DisableAbleCommandHandler( + "fullpromote", fullpromote, run_async=True +) +LOWPROMOTE_HANDLER = DisableAbleCommandHandler("lowpromote", lowpromote, run_async=True) +DEMOTE_HANDLER = DisableAbleCommandHandler("demote", demote, run_async=True) +PROMOTE_CALLBACK_HANDLER = CallbackQueryHandler( + promote_button, pattern=r"admin_", run_async=True +) + + +SET_TITLE_HANDLER = CommandHandler("title", set_title, run_async=True) +ADMIN_REFRESH_HANDLER = CommandHandler( + "admincache", refresh_admin, filters=Filters.chat_type.groups, run_async=True +) + +dispatcher.add_handler(SET_DESC_HANDLER) +dispatcher.add_handler(SET_STICKER_HANDLER) +dispatcher.add_handler(SETCHATPIC_HANDLER) +dispatcher.add_handler(RMCHATPIC_HANDLER) +dispatcher.add_handler(SETCHAT_TITLE_HANDLER) +dispatcher.add_handler(ADMINLIST_HANDLER) +dispatcher.add_handler(PIN_HANDLER) +dispatcher.add_handler(UNPIN_HANDLER) +dispatcher.add_handler(PINNED_HANDLER) +dispatcher.add_handler(INVITE_HANDLER) +dispatcher.add_handler(PROMOTE_HANDLER) +dispatcher.add_handler(FULLPROMOTE_HANDLER) +dispatcher.add_handler(PROMOTE_CALLBACK_HANDLER) +dispatcher.add_handler(LOWPROMOTE_HANDLER) +dispatcher.add_handler(DEMOTE_HANDLER) +dispatcher.add_handler(SET_TITLE_HANDLER) +dispatcher.add_handler(ADMIN_REFRESH_HANDLER) + +__mod_name__ = "𝙰ᴅᴍɪɴs" +__command_list__ = [ + "setdesc" "setsticker" "setgpic" "delgpic" "setgtitle" "adminlist", + "admins", + "invitelink", + "promote", + "fullpromote", + "lowpromote", + "demote", + "admincache", +] +__handlers__ = [ + SET_DESC_HANDLER, + SET_STICKER_HANDLER, + SETCHATPIC_HANDLER, + RMCHATPIC_HANDLER, + SETCHAT_TITLE_HANDLER, + ADMINLIST_HANDLER, + PIN_HANDLER, + UNPIN_HANDLER, + PINNED_HANDLER, + PROMOTE_CALLBACK_HANDLER, + INVITE_HANDLER, + PROMOTE_HANDLER, + FULLPROMOTE_HANDLER, + LOWPROMOTE_HANDLER, + DEMOTE_HANDLER, + SET_TITLE_HANDLER, + ADMIN_REFRESH_HANDLER, +] diff --git a/Exon/modules/adminserv.py b/Exon/modules/adminserv.py new file mode 100644 index 00000000..25855de4 --- /dev/null +++ b/Exon/modules/adminserv.py @@ -0,0 +1,52 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 Exon import pgram + + +async def member_permissions(chat_id: int, user_id: int): + perms = [] + try: + member = await pgram.get_chat_member(chat_id, user_id) + except Exception: + return [] + 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_voice_chats: + perms.append("can_manage_voice_chats") + return perms diff --git a/Exon/modules/afk.py b/Exon/modules/afk.py new file mode 100644 index 00000000..d9536e35 --- /dev/null +++ b/Exon/modules/afk.py @@ -0,0 +1,202 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import time + +from telegram import MessageEntity +from telegram.error import BadRequest +from telegram.ext import Filters, MessageHandler + +from Exon import REDIS, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.readable_time import get_readable_time +from Exon.modules.sql.afk_redis import afk_reason, end_afk, is_user_afk, start_afk +from Exon.modules.users import get_user_id + +AFK_GROUP = 7 +AFK_REPLY_GROUP = 8 + + +def afk(update, context): + args = update.effective_message.text.split(None, 1) + user = update.effective_user + if not user: # ignore channels + return + + if user.id == 777000: + return + start_afk_time = time.time() + if len(args) >= 2: + reason = args[1] + else: + reason = "none" + start_afk(update.effective_user.id, reason) + REDIS.set(f"afk_time_{update.effective_user.id}", start_afk_time) + fname = update.effective_user.first_name + try: + update.effective_message.reply_text("{} ɪs ɴᴏᴡ ᴀᴡᴀʏ!".format(fname)) + except BadRequest: + pass + + +def no_longer_afk(update, context): + user = update.effective_user + message = update.effective_message + if not user: # ignore channels + return + + if not is_user_afk(user.id): # Check if user is afk or not + return + end_afk_time = get_readable_time( + (time.time() - float(REDIS.get(f"afk_time_{user.id}"))) + ) + REDIS.delete(f"afk_time_{user.id}") + res = end_afk(user.id) + if res: + if message.new_chat_members: # dont say msg + return + firstname = update.effective_user.first_name + try: + message.reply_text( + "{} ɪs ʙᴀᴄᴋ ᴏɴʟɪɴᴇ!\n\nʏᴏᴜ ᴡᴇʀᴇ ɢᴏɴᴇ ғᴏʀ {}.".format( + firstname, end_afk_time + ) + ) + except Exception: + return + + +def reply_afk(update, context): + message = update.effective_message + userc = update.effective_user + userc_id = userc.id + if message.entities and message.parse_entities( + [MessageEntity.TEXT_MENTION, MessageEntity.MENTION] + ): + entities = message.parse_entities( + [MessageEntity.TEXT_MENTION, MessageEntity.MENTION] + ) + + chk_users = [] + for ent in entities: + if ent.type == MessageEntity.TEXT_MENTION: + user_id = ent.user.id + fst_name = ent.user.first_name + + if user_id in chk_users: + return + chk_users.append(user_id) + + elif ent.type == MessageEntity.MENTION: + user_id = get_user_id( + message.text[ent.offset : ent.offset + ent.length] + ) + if not user_id: + # Should never happen, since for a user to become AFK they must have spoken. Maybe changed username? + return + + if user_id in chk_users: + return + chk_users.append(user_id) + + try: + chat = context.bot.get_chat(user_id) + except BadRequest: + print( + "ᴇʀʀᴏʀ: ᴄᴏᴜʟᴅ ɴᴏᴛ ғᴇᴛᴄʜ ᴜsᴇʀɪᴅ {} ғᴏʀ ᴀғᴋ ᴍᴏᴅᴜʟᴇ".format( + user_id + ) + ) + return + fst_name = chat.first_name + + else: + return + + check_afk(update, context, user_id, fst_name, userc_id) + + elif message.reply_to_message: + user_id = message.reply_to_message.from_user.id + fst_name = message.reply_to_message.from_user.first_name + check_afk(update, context, user_id, fst_name, userc_id) + + +def check_afk(update, context, user_id, fst_name, userc_id): + if is_user_afk(user_id): + reason = afk_reason(user_id) + since_afk = get_readable_time( + (time.time() - float(REDIS.get(f"afk_time_{user_id}"))) + ) + if reason == "none": + if int(userc_id) == int(user_id): + return + res = "{} ɪs ᴀғᴋ.\n\nʟᴀsᴛ sᴇᴇɴ {} ᴀɢᴏ.".format(fst_name, since_afk) + update.effective_message.reply_text(res) + else: + if int(userc_id) == int(user_id): + return + res = "{} ɪs ᴀғᴋ.\nʀᴇᴀsᴏɴ: {}\n\nʟᴀsᴛ sᴇᴇɴ {} ᴀɢᴏ.".format( + fst_name, reason, since_afk + ) + update.effective_message.reply_text(res) + + +def __user_info__(user_id): + is_afk = is_user_afk(user_id) + text = "" + if is_afk: + since_afk = get_readable_time( + (time.time() - float(REDIS.get(f"afk_time_{user_id}"))) + ) + text = "<i>ᴛʜɪs ᴜsᴇʀ ɪs ᴄᴜʀʀᴇɴᴛʟʏ ᴀғᴋ (ᴀᴡᴀʏ ғʀᴏᴍ ᴋᴇʏʙᴏᴀʀᴅ).</i>" + text += f"\n<i>sɪɴᴄᴇ: {since_afk}</i>" + + else: + text = "<i>ᴛʜɪs ᴜsᴇʀ ɪs ᴄᴜʀʀᴇɴᴛʟʏ ɪsɴ'ᴛ ᴀғᴋ (ᴀᴡᴀʏ ғʀᴏᴍ ᴋᴇʏʙᴏᴀʀᴅ).</i>" + return text + + +def __gdpr__(user_id): + end_afk(user_id) + + +__mod_name__ = "𝙰ғᴋ" + +__help__ = """ +✪ /afk <ʀᴇᴀꜱᴏɴ> *:* `ᴍᴀʀᴋ ʏᴏᴜʀsᴇʟғ ᴀs AFK (ᴀᴡᴀʏ ғʀᴏᴍ ᴋᴇʏʙᴏᴀʀᴅ). ᴡʜᴇɴ ᴍᴀʀᴋᴇᴅ ᴀs ᴀғᴋ, ᴀɴʏ ᴍᴇɴᴛɪᴏɴs ᴡɪʟʟ ʙᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴡɪᴛʜ ᴀᴍᴇssᴀɢᴇ ᴛᴏ sᴀʏ ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀᴠᴀɪʟᴀʙʟᴇ!` + +*ᴍᴏʀᴇ ᴛʏᴘᴇ* +✪ byy|brb|bye <ʀᴇᴀꜱᴏɴ> *:* `sᴀᴍᴇ ᴀs ᴀғᴋ` +""" + + +AFK_HANDLER = DisableAbleCommandHandler("afk", afk) +AFK_REGEX_HANDLER = MessageHandler(Filters.regex("(?i)brb|(?i)bye|(?i)byy"), afk) +NO_AFK_HANDLER = MessageHandler(Filters.all & Filters.chat_type.groups, no_longer_afk) +AFK_REPLY_HANDLER = MessageHandler(Filters.all & Filters.chat_type.groups, reply_afk) + +dispatcher.add_handler(AFK_HANDLER, AFK_GROUP) +dispatcher.add_handler(AFK_REGEX_HANDLER, AFK_GROUP) +dispatcher.add_handler(NO_AFK_HANDLER, AFK_GROUP) +dispatcher.add_handler(AFK_REPLY_HANDLER, AFK_REPLY_GROUP) diff --git a/Exon/modules/alive.py b/Exon/modules/alive.py new file mode 100644 index 00000000..8bcabaf1 --- /dev/null +++ b/Exon/modules/alive.py @@ -0,0 +1,81 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 random +from sys import version_info + +from pyrogram import __version__ as pver +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message +from telegram import __version__ as lver +from telethon import __version__ as tver + +from ABG.helper import PHOTO +from Exon import BOT_NAME +from Exon import BOT_USERNAME as fuck +from Exon import OWNER_USERNAME, SUPPORT_CHAT, UPDATES_CHANNEL, pgram + +ASAU = [ + [ + InlineKeyboardButton(text="ᴜᴘᴅᴀᴛᴇꜱ", url=f"https://t.me/{UPDATES_CHANNEL}"), + InlineKeyboardButton(text="ꜱᴜᴘᴘᴏʀᴛ", url=f"https://t.me/{SUPPORT_CHAT}"), + ], + [ + InlineKeyboardButton( + text="ᴀᴅᴅ ᴍᴇ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ", + url=f"https://t.me/{fuck}?startgroup=true", + ), + ], +] + + +@pgram.on_message(filters.command("alive")) +async def restart(client, m: Message): + await m.delete() + accha = await m.reply("⚡") + await asyncio.sleep(1) + await accha.edit("ᴀʟɪᴠɪɴɢ..") + await asyncio.sleep(0.1) + await accha.edit("ᴀʟɪᴠɪɴɢ ʙᴀʙʏ ....") + await accha.delete() + await asyncio.sleep(0.1) + umm = await m.reply_sticker( + "CAACAgUAAx0CZIiVngABBHAzYwdi9OIVTQ7DYELAqMl46fgnK4wAAjsIAAKagolX-O0V64tvzK8pBA" + ) + await asyncio.sleep(0.1) + await m.reply_photo( + random.choice(PHOTO), + caption=f"""**ʜᴇʏ, ɪ ᴀᴍ {BOT_NAME}** + ▱▱▱▱▱▱▱▱▱▱▱▱ +» **ᴍʏ ᴏᴡɴᴇʀ :** [𝐀ʙɪsʜɴᴏɪ](https://t.me/{OWNER_USERNAME}) +» **ʟɪʙʀᴀʀʏ ᴠᴇʀsɪᴏɴ :** `{lver}` +» **ᴛᴇʟᴇᴛʜᴏɴ ᴠᴇʀsɪᴏɴ :** `{tver}` +» **ᴘʏʀᴏɢʀᴀᴍ ᴠᴇʀsɪᴏɴ :** `{pver}` +» **ᴘʏᴛʜᴏɴ ᴠᴇʀsɪᴏɴ :** `{version_info[0]}.{version_info[1]}.{version_info[2]}` +⍟ **ʙᴏᴛ ᴠᴇʀꜱɪᴏɴ :** `1.0` + ▱▱▱▱▱▱▱▱▱▱▱▱""", + reply_markup=InlineKeyboardMarkup(ASAU), + ) diff --git a/Exon/modules/anime.py b/Exon/modules/anime.py new file mode 100644 index 00000000..00460ef1 --- /dev/null +++ b/Exon/modules/anime.py @@ -0,0 +1,542 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +import bs4 +import jikanpy +import requests +from telegram import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, + ParseMode, + Update, +) +from telegram.ext import CallbackContext + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + +info_btn = "ᴍᴏʀᴇ ɪɴғᴏʀᴍᴀᴛɪᴏɴ" +kaizoku_btn = "ᴋᴀɪᴢᴏᴋᴜ ☠️" +kayo_btn = "ᴋᴀʏᴏ 🏴‍☠️" +prequel_btn = "⬅️ ᴘʀᴇǫᴜᴇʟ" +sequel_btn = "sᴇǫᴜᴇʟ ➡️" +close_btn = "ᴄʟᴏsᴇ ❌" + + +def shorten(description, info="anilist.co"): + msg = "" + if len(description) > 700: + description = description[:500] + "...." + msg += f"\n*ᴅᴇsᴄʀɪᴘᴛɪᴏɴ*:\n{description}[Read More]({info})" + else: + msg += f"\n*ᴅᴇsᴄʀɪᴘᴛɪᴏɴ*:\n{description}" + return msg + + +# time formatter from uniborg +def t(milliseconds: int) -> str: + """ɪɴᴘᴜᴛs ᴛɪᴍᴇ ɪɴ ᴍɪʟʟɪsᴇᴄᴏɴᴅs, ᴛᴏ ɢᴇᴛ ʙᴇᴀᴜᴛɪғɪᴇᴅ ᴛɪᴍᴇ, + as string""" + seconds, milliseconds = divmod(milliseconds, 1000) + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + tmp = ( + (f"{str(days)} Days, " if days else "") + + (f"{str(hours)} Hours, " if hours else "") + + (f"{str(minutes)} Minutes, " if minutes else "") + + (f"{str(seconds)} Seconds, " if seconds else "") + + (f"{str(milliseconds)} ms, " if milliseconds else "") + ) + + return tmp[:-2] + + +airing_query = """ +query ($id: Int,$search: String) { + Media (id: $id, type: ANIME,search: $search) { + id + episodes + title { + romaji + english + native + } + nextAiringEpisode { + airingAt + timeUntilAiring + episode + } + } +} +""" + +fav_query = """ +query ($id: Int) { + Media (id: $id, type: ANIME) { + id + title { + romaji + english + native + } + } +} +""" + +anime_query = """ +query ($id: Int,$search: String) { + Media (id: $id, type: ANIME,search: $search) { + id + title { + romaji + english + native + } + description (asHtml: false) + startDate{ + year + } + episodes + season + type + format + status + duration + siteUrl + studios{ + nodes{ + name + } + } + trailer{ + id + site + thumbnail + } + averageScore + genres + bannerImage + } +} +""" + +character_query = """ +query ($query: String) { + Character (search: $query) { + id + name { + first + last + full + native + } + siteUrl + image { + large + } + description(asHtml: false) + } +} +""" + +manga_query = """ +query ($id: Int,$search: String) { + Media (id: $id, type: MANGA,search: $search) { + id + title { + romaji + english + native + } + description (asHtml: false) + startDate{ + year + } + type + format + status + siteUrl + averageScore + genres + bannerImage + } +} +""" + +url = "https://graphql.anilist.co" + + +def extract_arg(message: Message): + split = message.text.split(" ", 1) + if len(split) > 1: + return split[1] + reply = message.reply_to_message + return reply.text if reply is not None else None + + +def airing(update: Update, context: CallbackContext): + message = update.effective_message + search_str = extract_arg(message) + if not search_str: + update.effective_message.reply_text( + "ᴛᴇʟʟ ᴀɴɪᴍᴇ ɴᴀᴍᴇ :) ( /airing <anime name>)", + ) + return + variables = {"search": search_str} + response = requests.post( + url, + json={"query": airing_query, "variables": variables}, + ).json()["data"]["Media"] + msg = f"*Name*: *{response['title']['romaji']}*(`{response['title']['native']}`)\n*ID*: `{response['id']}`" + if response["nextAiringEpisode"]: + time = response["nextAiringEpisode"]["timeUntilAiring"] * 1000 + time = t(time) + msg += f"\n*ᴇᴘɪsᴏᴅᴇ*: `{response['nextAiringEpisode']['episode']}`\n*Airing In*: `{time}`" + else: + msg += f"\n*ᴇᴘɪsᴏᴅᴇ*:{response['episodes']}\n*Status*: `N/A`" + update.effective_message.reply_text(msg, parse_mode=ParseMode.MARKDOWN) + + +def anime(update: Update, context: CallbackContext): + message = update.effective_message + search = extract_arg(message) + if not search: + update.effective_message.reply_text("ғᴏʀᴍᴀᴛ : /anime < anime name >") + return + variables = {"search": search} + json = requests.post( + url, + json={"query": anime_query, "variables": variables}, + ).json() + if "errors" in json.keys(): + update.effective_message.reply_text("ᴀɴɪᴍᴇ ɴᴏᴛ ғᴏᴜɴᴅ") + return + if json: + json = json["data"]["Media"] + msg = f"*{json['title']['romaji']}*(`{json['title']['native']}`)\n*Type*: {json['format']}\n*Status*: {json['status']}\n*Episodes*: {json.get('episodes', 'N/A')}\n*Duration*: {json.get('duration', 'N/A')} Per Ep.\n*Score*: {json['averageScore']}\n*Genres*: `" + for x in json["genres"]: + msg += f"{x}, " + msg = msg[:-2] + "`\n" + msg += "*Studios*: `" + for x in json["studios"]["nodes"]: + msg += f"{x['name']}, " + msg = msg[:-2] + "`\n" + info = json.get("siteUrl") + trailer = json.get("trailer", None) + json["id"] + if trailer: + trailer_id = trailer.get("id", None) + site = trailer.get("site", None) + if site == "youtube": + trailer = f"https://youtu.be/{trailer_id}" + description = ( + json.get("description", "N/A") + .replace("<i>", "") + .replace("</i>", "") + .replace("<br>", "") + .replace("~!", "") + .replace("!~", "") + ) + msg += shorten(description, info) + image = json.get("bannerImage", None) + if trailer: + buttons = [ + [ + InlineKeyboardButton("ᴍᴏʀᴇ ɪɴғᴏ", url=info), + InlineKeyboardButton("ᴛʀᴀɪʟᴇʀ 🎬", url=trailer), + ], + ] + else: + buttons = [[InlineKeyboardButton("ᴍᴏʀᴇ ɪɴғᴏ", url=info)]] + if image: + try: + update.effective_message.reply_photo( + photo=image, + caption=msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + except: + msg += f" [〽️]({image})" + update.effective_message.reply_text( + msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + else: + update.effective_message.reply_text( + msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +def character(update: Update, context: CallbackContext): + message = update.effective_message + search = extract_arg(message) + if not search: + update.effective_message.reply_text("ғᴏʀᴍᴀᴛ : /character < character name >") + return + variables = {"query": search} + json = requests.post( + url, + json={"query": character_query, "variables": variables}, + ).json() + if "errors" in json.keys(): + update.effective_message.reply_text("ᴄʜᴀʀᴀᴄᴛᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ") + return + if json: + json = json["data"]["Character"] + msg = f"*{json.get('name').get('full')}* (`{json.get('name').get('native')}`)\n" + description = f"{json['description']}".replace("~!", "").replace("!~", "") + site_url = json.get("siteUrl") + msg += shorten(description, site_url) + if image := json.get("image", None): + image = image.get("large") + update.effective_message.reply_photo( + photo=image, + caption=msg.replace("<b>", "</b>"), + parse_mode=ParseMode.MARKDOWN, + ) + else: + update.effective_message.reply_text( + msg.replace("<b>", "</b>"), + parse_mode=ParseMode.MARKDOWN, + ) + + +def manga(update: Update, context: CallbackContext): + message = update.effective_message + search = extract_arg(message) + if not search: + update.effective_message.reply_text("ғᴏʀᴍᴀᴛ : /manga < manga name >") + return + variables = {"search": search} + json = requests.post( + url, + json={"query": manga_query, "variables": variables}, + ).json() + msg = "" + if "errors" in json.keys(): + update.effective_message.reply_text("Manga not found") + return + if json: + json = json["data"]["Media"] + title, title_native = json["title"].get("romaji", False), json["title"].get( + "native", + False, + ) + start_date, status, score = ( + json["startDate"].get("year", False), + json.get("status", False), + json.get("averageScore", False), + ) + if title: + msg += f"*{title}*" + if title_native: + msg += f"(`{title_native}`)" + if start_date: + msg += f"\n*sᴛᴀʀᴛ ᴅᴀᴛᴇ* - `{start_date}`" + if status: + msg += f"\n*sᴛᴀᴛᴜs* - `{status}`" + if score: + msg += f"\n*sᴄᴏʀᴇ* - `{score}`" + msg += "\n*ɢᴇɴʀᴇs* - " + for x in json.get("genres", []): + msg += f"{x}, " + msg = msg[:-2] + info = json["siteUrl"] + buttons = [[InlineKeyboardButton("ᴍᴏʀᴇ ɪɴғᴏ", url=info)]] + image = json.get("bannerImage", False) + msg += f"\n_{json.get('description', None)}_" + if image: + try: + update.effective_message.reply_photo( + photo=image, + caption=msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + except: + msg += f" [〽️]({image})" + update.effective_message.reply_text( + msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + else: + update.effective_message.reply_text( + msg, + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +def upcoming(update: Update, context: CallbackContext): + jikan = jikanpy.jikan.Jikan() + upcomin = jikan.top("anime", page=1, subtype="upcoming") + + upcoming_list = [entry["title"] for entry in upcomin["top"]] + upcoming_message = "" + + for entry_num in range(len(upcoming_list)): + if entry_num == 10: + break + upcoming_message += f"{entry_num + 1}. {upcoming_list[entry_num]}\n" + + update.effective_message.reply_text(upcoming_message) + + +def site_search(update: Update, context: CallbackContext, site: str): + message = update.effective_message + search_query = extract_arg(message) + more_results = True + + if not search_query: + message.reply_text("ɢɪᴠᴇ sᴏᴍᴇᴛʜɪɴɢ ᴛᴏ sᴇᴀʀᴄʜ") + return + + if site == "kaizoku": + search_url = f"https://animekaizoku.com/?s={search_query}" + html_text = requests.get(search_url).text + soup = bs4.BeautifulSoup(html_text, "html.parser") + if search_result := soup.find_all("h2", {"class": "post-title"}): + result = f"<b>sᴇᴀʀᴄʜ ʀᴇsᴜʟᴛs ғᴏʀ</b> <code>{html.escape(search_query)}</code> <b>on</b> @KaizokuAnime: \n\n" + for entry in search_result: + post_link = "https://animekaizoku.com/" + entry.a["href"] + post_name = html.escape(entry.text) + result += f"• <a href='{post_link}'>{post_name}</a>\n" + else: + more_results = False + result = f"<b>ɴᴏ ʀᴇsᴜʟᴛ ғᴏᴜɴᴅ ғᴏʀ</b> <code>{html.escape(search_query)}</code> <b>on</b> @KaizokuAnime" + + post_link = entry.a["href"] + post_name = html.escape(entry.text.strip()) + result += f"• <a href='{post_link}'>{post_name}</a>\n" + + buttons = [[InlineKeyboardButton("sᴇᴇ ᴀʟʟ ʀᴇsᴜʟᴛs", url=search_url)]] + + if more_results: + message.reply_text( + result, + parse_mode=ParseMode.HTML, + reply_markup=InlineKeyboardMarkup(buttons), + disable_web_page_preview=True, + ) + else: + message.reply_text( + result, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + + +def kaizoku(update: Update, context: CallbackContext): + site_search(update, context, "kaizoku") + + +__help__ = """ +ɢᴇᴛ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴀɴɪᴍᴇ, ᴍᴀɴɢᴀ ᴏʀ ᴄʜᴀʀᴀᴄᴛᴇʀs ғʀᴏᴍ [ᴀɴɪʟɪsᴛ](anilist.co) ᴀɴᴅ [ᴍᴀʟ](https://myanimelist.net/) + +*ᴀɴɪʟɪsᴛ ᴄᴏᴍᴍᴀɴᴅs:* + +• /anime <anime>*:* `ʀᴇᴛᴜʀɴs ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴛʜᴇ ᴀɴɪᴍᴇ ғʀᴏᴍ ᴀɴɪʟɪsᴛ ` + +• /character <character>*:* `ʀᴇᴛᴜʀɴs ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴛʜᴇ ᴄʜᴀʀᴀᴄᴛᴇʀ ғʀᴏᴍ ᴀɴɪʟɪsᴛ ` + +• /manga <manga>*:* `ʀᴇᴛᴜʀɴs ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴛʜᴇ ᴍᴀɴɢᴀ ғʀᴏᴍ ᴀɴɪʟɪsᴛ ` + +• /upcoming*:* `ʀᴇᴛᴜʀɴs ᴀ ʟɪsᴛ ᴏғ ɴᴇᴡ ᴀɴɪᴍᴇ ɪɴ ᴛʜᴇ upcoming sᴇᴀsᴏɴs ғʀᴏᴍ ᴀɴɪʟɪsᴛ ` + +• /airing <anime>*:* `ʀᴇᴛᴜʀɴs ᴀɴɪᴍᴇ ᴀɪʀɪɴɢ ɪɴғᴏ ғʀᴏᴍ ᴀɴɪʟɪsᴛ ` + +*ᴀɴɪᴍᴇ sᴇᴀʀᴄʜ ᴄᴏᴍᴍᴀɴᴅs:* + +• /kaizoku*:* `sᴇᴀʀᴄʜ ᴀɴ ᴀɴɪᴍᴇ ᴏɴ ᴀɴɪᴍᴇᴋᴀɪᴢᴏᴋᴜ ᴡᴇʙsɪᴛᴇ` + +*ᴀɴɪᴍᴇ ᴜᴛɪʟs:* + +• /fillers <ᴀɴɪᴍᴇ ɴᴀᴍᴇ>*:* `ɢᴇᴛs ʏᴏᴜ ᴛʜᴇ ғɪʟʟᴇʀ ᴇᴘɪsᴏᴅᴇs ʟɪsᴛ ғᴏʀ ᴛʜᴇ ɪɴᴘᴜᴛ ᴀɴɪᴍᴇ ` +• /fillers -n<ɴᴜᴍʙᴇʀ> <ᴀɴɪᴍᴇ ɴᴀᴍᴇ>*:* `ғɪʟʟᴇʀ ᴇᴘɪsᴏᴅᴇs ʟɪsᴛ ᴄʜᴏsᴇɴ ғʀᴏᴍ ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀɴɪᴍᴇ` + +*ᴇxᴀᴍᴘʟᴇ:* /fillers naruto - ᴡɪʟʟ ɢᴇᴛ ʏᴏᴜ ᴛʜᴇ ʟɪsᴛ ᴏғ ɴᴀʀᴜᴛᴏ ᴀɴᴅ ᴍᴀᴛᴄʜɪɴɢ sᴇʀɪᴇs + /fillers -n1 naruto - ᴡɪʟʟ ᴄʜᴏsᴇ ᴛᴏ sʜᴏᴡ ᴛʜᴇ ғɪʟʟᴇʀ ᴇᴘɪsᴏᴅᴇs ғᴏʀ ᴛʜᴇ 1sᴛ ᴀɴɪᴍᴇ ᴛᴏᴏᴋ ғʀᴏᴍ ᴛʜᴇ ʟɪsᴛᴇᴅ sᴇʀɪᴇs + +*NOTE*: ғɪʟʟᴇʀ ᴇᴘɪsᴏᴅᴇs ᴀʀᴇ ᴛʜᴏsᴇ ᴇᴘɪsᴏᴅᴇs ᴡʜɪᴄʜ ᴀʀᴇ ɴᴏᴛ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴡɪᴛʜ ᴛʜᴇ ᴍᴀɪɴ sᴛᴏʀʏ ʟɪɴᴇ + +• /schedule <ᴡᴇᴇᴋᴅᴀʏ>*:* `ɢᴇᴛs ʏᴏᴜ ᴛʜᴇ ᴀɴɪᴍᴇ ᴇᴘɪsᴏᴅᴇs sᴄʜᴇᴅᴜʟᴇᴅ ᴛᴏ ʙᴇ ᴀɪʀᴇᴅ ᴏɴ ᴛʜᴀᴛ ᴅᴀʏ` + +*ᴇxᴀᴍᴘʟᴇ:* /schedule monday ᴏʀ /schedule 0 + + +• /animequotes *:* `ɢᴇᴛ ǫᴜᴏᴛᴇs ɪɴ ᴘɪᴄᴛᴜʀᴇ` + +• /quote*:* `ɢᴇᴛ ᴛᴇxᴛ ǫᴜᴏᴛᴇs` + +""" + + +ANIME_HANDLER = DisableAbleCommandHandler("anime", anime, run_async=True) +AIRING_HANDLER = DisableAbleCommandHandler("airing", airing, run_async=True) +CHARACTER_HANDLER = DisableAbleCommandHandler("character", character, run_async=True) +MANGA_HANDLER = DisableAbleCommandHandler("manga", manga, run_async=True) +##USER_HANDLER = DisableAbleCommandHandler("user", user, run_async=True) +UPCOMING_HANDLER = DisableAbleCommandHandler("upcoming", upcoming, run_async=True) +KAIZOKU_SEARCH_HANDLER = DisableAbleCommandHandler("kaizoku", kaizoku, run_async=True) +##KAYO_SEARCH_HANDLER = DisableAbleCommandHandler("kayo", kayo, run_async=True) + +dispatcher.add_handler(ANIME_HANDLER) +dispatcher.add_handler(CHARACTER_HANDLER) +dispatcher.add_handler(MANGA_HANDLER) +dispatcher.add_handler(AIRING_HANDLER) +# dispatcher.add_handler(USER_HANDLER) +dispatcher.add_handler(KAIZOKU_SEARCH_HANDLER) +# dispatcher.add_handler(KAYO_SEARCH_HANDLER) +dispatcher.add_handler(UPCOMING_HANDLER) + +__mod_name__ = "𝙰ɴɪᴍᴇ" +__command_list__ = [ + "anime", + "manga", + "character", + "user", + "upcoming", + "airing", + "kayo", + "kaizoku", +] +__handlers__ = [ + ANIME_HANDLER, + CHARACTER_HANDLER, + MANGA_HANDLER, + # USER_HANDLER, + UPCOMING_HANDLER, + # KAYO_SEARCH_HANDLER, + AIRING_HANDLER, + KAIZOKU_SEARCH_HANDLER, +] diff --git a/Exon/modules/animequote.py b/Exon/modules/animequote.py new file mode 100644 index 00000000..b9c4879b --- /dev/null +++ b/Exon/modules/animequote.py @@ -0,0 +1,183 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 json +import random + +import requests +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.ext import CallbackContext, CallbackQueryHandler + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + + +def anime_quote(): + url = "https://animechan.vercel.app/api/random" + # since text attribute returns dictionary like string + response = requests.get(url) + try: + dic = json.loads(response.text) + except Exception: + pass + quote = dic["quote"] + character = dic["character"] + anime = dic["anime"] + return quote, character, anime + + +def quotes(update: Update, context: CallbackContext): + message = update.effective_message + quote, character, anime = anime_quote() + msg = f"<i>❝ {quote}❞</i>\n\n<b>{character} from {anime}</b>" + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ᴄʜᴀɴɢᴇ 🔁", callback_data="change_quote")]] + ) + message.reply_text( + msg, + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + + +def change_quote(update: Update, context: CallbackContext): + update.callback_query + update.effective_chat + message = update.effective_message + quote, character, anime = anime_quote() + msg = f"<i>❝ {quote}❞</i>\n\n<b>{character} from {anime}</b>" + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ᴄʜᴀɴɢᴇ 🔁", callback_data="quote_change")]] + ) + message.edit_text(msg, reply_markup=keyboard, parse_mode=ParseMode.HTML) + + +def animequotes(update: Update, context: CallbackContext): + message = update.effective_message + message.reply_to_message.from_user.first_name if message.reply_to_message else message.from_user.first_name + keyboard = [[InlineKeyboardButton(text="ᴄʜᴀɴɢᴇ 🔄", callback_data="changek_quote")]] + message.reply_photo( + random.choice(QUOTES_IMG), reply_markup=InlineKeyboardMarkup(keyboard) + ) + + +def changek_quote(update: Update, context: CallbackContext): + update.callback_query + update.effective_chat + message = update.effective_message + keyboard = [[InlineKeyboardButton(text="ᴄʜᴀɴɢᴇ 🔃", callback_data="quotek_change")]] + message.reply_photo( + random.choice(QUOTES_IMG), reply_markup=InlineKeyboardMarkup(keyboard) + ) + + +QUOTES_IMG = ( + "https://i.imgur.com/Iub4RYj.jpg", + "https://i.imgur.com/uvNMdIl.jpg", + "https://i.imgur.com/YOBOntg.jpg", + "https://i.imgur.com/fFpO2ZQ.jpg", + "https://i.imgur.com/f0xZceK.jpg", + "https://i.imgur.com/RlVcCip.jpg", + "https://i.imgur.com/CjpqLRF.jpg", + "https://i.imgur.com/8BHZDk6.jpg", + "https://i.imgur.com/8bHeMgy.jpg", + "https://i.imgur.com/5K3lMvr.jpg", + "https://i.imgur.com/NTzw4RN.jpg", + "https://i.imgur.com/wJxryAn.jpg", + "https://i.imgur.com/9L0DWzC.jpg", + "https://i.imgur.com/sBe8TTs.jpg", + "https://i.imgur.com/1Au8gdf.jpg", + "https://i.imgur.com/28hFQeU.jpg", + "https://i.imgur.com/Qvc03JY.jpg", + "https://i.imgur.com/gSX6Xlf.jpg", + "https://i.imgur.com/iP26Hwa.jpg", + "https://i.imgur.com/uSsJoX8.jpg", + "https://i.imgur.com/OvX3oHB.jpg", + "https://i.imgur.com/JMWuksm.jpg", + "https://i.imgur.com/lhM3fib.jpg", + "https://i.imgur.com/64IYKkw.jpg", + "https://i.imgur.com/nMbyA3J.jpg", + "https://i.imgur.com/7KFQhY3.jpg", + "https://i.imgur.com/mlKb7zt.jpg", + "https://i.imgur.com/JCQGJVw.jpg", + "https://i.imgur.com/hSFYDEz.jpg", + "https://i.imgur.com/PQRjAgl.jpg", + "https://i.imgur.com/ot9624U.jpg", + "https://i.imgur.com/iXmqN9y.jpg", + "https://i.imgur.com/RhNBeGr.jpg", + "https://i.imgur.com/tcMVNa8.jpg", + "https://i.imgur.com/LrVg810.jpg", + "https://i.imgur.com/TcWfQlz.jpg", + "https://i.imgur.com/muAUdvJ.jpg", + "https://i.imgur.com/AtC7ZRV.jpg", + "https://i.imgur.com/sCObQCQ.jpg", + "https://i.imgur.com/AJFDI1r.jpg", + "https://i.imgur.com/TCgmRrH.jpg", + "https://i.imgur.com/LMdmhJU.jpg", + "https://i.imgur.com/eyyax0N.jpg", + "https://i.imgur.com/YtYxV66.jpg", + "https://i.imgur.com/292w4ye.jpg", + "https://i.imgur.com/6Fm1vdw.jpg", + "https://i.imgur.com/2vnBOZd.jpg", + "https://i.imgur.com/j5hI9Eb.jpg", + "https://i.imgur.com/cAv7pJB.jpg", + "https://i.imgur.com/jvI7Vil.jpg", + "https://i.imgur.com/fANpjsg.jpg", + "https://i.imgur.com/5o1SJyo.jpg", + "https://i.imgur.com/dSVxmh8.jpg", + "https://i.imgur.com/02dXlAD.jpg", + "https://i.imgur.com/htvIoGY.jpg", + "https://i.imgur.com/hy6BXOj.jpg", + "https://i.imgur.com/OuwzNYu.jpg", + "https://i.imgur.com/L8vwvc2.jpg", + "https://i.imgur.com/3VMVF9y.jpg", + "https://i.imgur.com/yzjq2n2.jpg", + "https://i.imgur.com/0qK7TAN.jpg", + "https://i.imgur.com/zvcxSOX.jpg", + "https://i.imgur.com/FO7bApW.jpg", + "https://i.imgur.com/KK06gwg.jpg", + "https://i.imgur.com/6lG4tsO.jpg", +) + + +ANIMEQUOTES_HANDLER = DisableAbleCommandHandler( + "animequotes", animequotes, run_async=True +) +QUOTES_HANDLER = DisableAbleCommandHandler("quote", quotes, run_async=True) + +CHANGE_QUOTE = CallbackQueryHandler(change_quote, pattern=r"change_.*") +QUOTE_CHANGE = CallbackQueryHandler(change_quote, pattern=r"quote_.*") +CHANGEK_QUOTE = CallbackQueryHandler(changek_quote, pattern=r"changek_.*") +QUOTEK_CHANGE = CallbackQueryHandler(changek_quote, pattern=r"quotek_.*") + +dispatcher.add_handler(CHANGE_QUOTE) +dispatcher.add_handler(QUOTE_CHANGE) +dispatcher.add_handler(CHANGEK_QUOTE) +dispatcher.add_handler(QUOTEK_CHANGE) +dispatcher.add_handler(ANIMEQUOTES_HANDLER) +dispatcher.add_handler(QUOTES_HANDLER) + +__command_list__ = ["animequotes", "quote"] + +__handlers__ = [ANIMEQUOTES_HANDLER, QUOTES_HANDLER] diff --git a/Exon/modules/antichannel.py b/Exon/modules/antichannel.py new file mode 100644 index 00000000..109d3d11 --- /dev/null +++ b/Exon/modules/antichannel.py @@ -0,0 +1,98 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import Update +from telegram.ext import CallbackContext +from telegram.ext.filters import Filters + +from Exon.modules.helper_funcs.anonymous import AdminPerms, user_admin +from Exon.modules.helper_funcs.decorators import Exoncmd, Exonmsg +from Exon.modules.sql.antichannel_sql import ( + antichannel_status, + disable_antichannel, + enable_antichannel, +) + + +@Exoncmd(command="antichannelmode", group=100) +@user_admin(AdminPerms.CAN_RESTRICT_MEMBERS) +def set_antichannel(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + args = context.args + if len(args) > 0: + s = args[0].lower() + if s in ["yes", "on"]: + enable_antichannel(chat.id) + message.reply_html(f"ᴇɴᴀʙʟᴇᴅ 𝗔𝗻𝘁𝗶𝗰𝗵𝗮𝗻𝗻𝗲𝗹 ɪɴ {html.escape(chat.title)}") + elif s in ["off", "no"]: + disable_antichannel(chat.id) + message.reply_html(f"ᴅɪsᴀʙʟᴇᴅ 𝗔𝗻𝘁𝗶𝗰𝗵𝗮𝗻𝗻𝗲𝗹 ɪɴ {html.escape(chat.title)}") + else: + message.reply_text(f"ᴜɴʀᴇᴄᴏɢɴɪᴢᴇᴅ ᴀʀɢᴜᴍᴇɴᴛs {s}") + return + message.reply_html( + f"ᴀɴᴛɪᴄʜᴀɴɴᴇʟ sᴇᴛᴛɪɴɢ ɪs ᴄᴜʀʀᴇɴᴛʟʏ {antichannel_status(chat.id)} ɪɴ {html.escape(chat.title)}" + ) + + +@Exonmsg(Filters.chat_type.groups, group=110) +def eliminate_channel(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + bot = context.bot + if not antichannel_status(chat.id): + return + if ( + message.sender_chat + and message.sender_chat.type == "channel" + and not message.is_automatic_forward + ): + message.delete() + sender_chat = message.sender_chat + bot.ban_chat_sender_chat(sender_chat_id=sender_chat.id, chat_id=chat.id) + + +__mod_name__ = "𝙰ɴᴛɪ-ᴄʜᴀɴɴᴇʟ" + +__help__ = """ + + ⚠️ ᴡᴀʀɴɪɴɢ ⚠️ + +ɪғ ʏᴏᴜ ᴜsᴇ ᴛʜɪs ᴍᴏᴅᴇ, ᴛʜᴇ ʀᴇsᴜʟᴛ ɪs, ɪɴ ᴛʜᴇ ɢʀᴏᴜᴘ, ʏᴏᴜ ᴄᴀɴ'ᴛ ᴄʜᴀᴛ ᴜsɪɴɢ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ ғᴏʀ ғᴏʀᴇᴠᴇʀ ɪғ ʏᴏᴜ ɢᴇᴛ ʙᴀɴɴᴇᴅ ᴏɴᴄᴇ, +ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴍᴏᴅᴇ ɪs ᴀ ᴍᴏᴅᴇ ᴛᴏ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ʙᴀɴ ᴜsᴇʀs ᴡʜᴏ ᴄʜᴀᴛ ᴜsɪɴɢ ᴄʜᴀɴɴᴇʟs. +ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴜsᴇᴅ ʙʏ ᴀᴅᴍɪɴs. + +/antichannelmode <'ᴏɴ/'ʏᴇs> : `ᴇɴᴀʙʟᴇs ᴀɴᴛɪ-ᴄʜᴀɴɴᴇʟ ᴍᴏᴅᴇ ʙᴀɴ` + +/antichannelmode <'ᴏғғ/'ɴᴏ> : `ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪ-ᴄʜᴀɴɴᴇʟ ᴍᴏᴅᴇ ʙᴀɴ` + +/cleanlinked on : `ᴇɴᴀʙʟᴇs ᴄʜᴀɴɴᴇʟ ʟɪɴᴋ` + +/antichannelpin on : `ᴀɴᴛɪ-ᴄʜᴀɴɴᴇʟ ᴘɪɴ ᴍᴏᴅᴇ` + +/antiservice <'ᴏɴ/'ᴏғғ> : `ᴅᴇʟᴇᴛᴇ sᴇʀᴠɪᴄᴇ ᴍsɢ. ` +""" diff --git a/Exon/modules/antiflood.py b/Exon/modules/antiflood.py new file mode 100644 index 00000000..92aed2d2 --- /dev/null +++ b/Exon/modules/antiflood.py @@ -0,0 +1,383 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +from typing import Optional + +from telegram import Chat, ChatPermissions, Message, ParseMode, User +from telegram.error import BadRequest +from telegram.ext import CommandHandler, Filters, MessageHandler +from telegram.utils.helpers import mention_html + +from Exon import dispatcher +from Exon.modules.connection import connected +from Exon.modules.helper_funcs.alternate import send_message, typing_action +from Exon.modules.helper_funcs.chat_status import is_user_admin, user_admin +from Exon.modules.helper_funcs.string_handling import extract_time +from Exon.modules.log_channel import loggable +from Exon.modules.sql import antiflood_sql as sql +from Exon.modules.sql.approve_sql import is_approved + +FLOOD_GROUP = 3 + + +@loggable +def check_flood(update, context) -> str: + user = update.effective_user # type: Optional[User] + chat = update.effective_chat # type: Optional[Chat] + msg = update.effective_message # type: Optional[Message] + + if is_approved(chat.id, user.id): + sql.update_flood(chat.id, None) + return + + if not user: # ignore channels + return "" + + # ignore admins + if is_user_admin(chat, user.id): + sql.update_flood(chat.id, None) + return "" + + should_ban = sql.update_flood(chat.id, user.id) + if not should_ban: + return "" + + try: + getmode, getvalue = sql.get_flood_setting(chat.id) + if getmode == 1: + chat.ban_member(user.id) + execstrings = "ʙᴀɴɴᴇᴅ" + tag = "BANNED" + elif getmode == 2: + chat.ban_member(user.id) + chat.unban_member(user.id) + execstrings = "ᴋɪᴄᴋᴇᴅ" + tag = "KICKED" + elif getmode == 3: + context.bot.restrict_chat_member( + chat.id, user.id, permissions=ChatPermissions(can_send_messages=False) + ) + execstrings = "ᴍᴜᴛᴇᴅ" + tag = "MUTED" + elif getmode == 4: + bantime = extract_time(msg, getvalue) + chat.ban_member(user.id, until_date=bantime) + execstrings = f"ʙᴀɴɴᴇᴅ ғᴏʀ {getvalue}" + tag = "TBAN" + elif getmode == 5: + mutetime = extract_time(msg, getvalue) + context.bot.restrict_chat_member( + chat.id, + user.id, + until_date=mutetime, + permissions=ChatPermissions(can_send_messages=False), + ) + execstrings = f"ᴍᴜᴛᴇᴅ ғᴏʀ {getvalue}" + tag = "TMUTE" + send_message( + update.effective_message, + f"ᴡᴀɴɴᴀ sᴘᴀᴍ?! sᴏʀʀʏ ɪᴛ's ɴᴏᴛ ʏᴏᴜʀ ʜᴏᴜsᴇ ᴍᴀɴ!\n{execstrings}!", + ) + + return f"<b>{html.escape(chat.title)}:</b>\n#{tag}\n<b>User:</b> {mention_html(user.id, user.first_name)}\nғʟᴏᴏᴅᴇᴅ ᴛʜᴇ ɢʀᴏᴜᴘ." + + except BadRequest: + msg.reply_text( + "I ᴄᴀɴ'ᴛ ʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ʜᴇʀᴇ, ɢɪᴠᴇ ᴍᴇ ᴘᴇʀᴍɪssɪᴏɴs ғɪʀsᴛ! ᴜɴᴛɪʟ ᴛʜᴇɴ, ɪ'ʟʟ ᴅɪsᴀʙʟᴇ ᴀɴᴛɪ-ғʟᴏᴏᴅ." + ) + sql.set_flood(chat.id, 0) + return f"<b>{chat.title}:</b>\n#INFO\nᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴇɴᴏᴜɢʜ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ʀᴇsᴛʀɪᴄᴛ ᴜsᴇʀs sᴏ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪ-ғʟᴏᴏᴅ" + + +@user_admin +@loggable +@typing_action +def set_flood(update, context) -> str: + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + message = update.effective_message # type: Optional[Message] + args = context.args + + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return "" + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + + if len(args) >= 1: + val = args[0].lower() + if val in ("off", "no", "0"): + sql.set_flood(chat_id, 0) + if conn: + text = message.reply_text( + f"ᴀɴᴛɪғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ɪɴ {chat_name}." + ) + else: + text = message.reply_text("ᴀɴᴛɪғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ.") + send_message(update.effective_message, text, parse_mode="markdown") + + elif val.isdigit(): + amount = int(val) + if amount <= 0: + sql.set_flood(chat_id, 0) + if conn: + text = message.reply_text( + f"ᴀɴᴛɪғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ɪɴ {chat_name}." + ) + else: + text = message.reply_text("ᴀɴᴛɪғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ.") + return f"<b>{html.escape(chat_name)}:</b>\n#sᴇᴛғʟᴏᴏᴅ\n<b>Admin:</b> {mention_html(user.id, user.first_name)}\nᴅɪsᴀʙʟᴇ ᴀɴᴛɪғʟᴏᴏᴅ." + + if amount < 3: + send_message( + update.effective_message, + "ᴀɴᴛɪғʟᴏᴏᴅ ᴍᴜsᴛ ʙᴇ ᴇɪᴛʜᴇʀ 0 (disabled) ᴏʀ ɴᴜᴍʙᴇʀ ɢʀᴇᴀᴛᴇʀ ᴛʜᴀɴ 3!", + ) + return "" + sql.set_flood(chat_id, amount) + if conn: + text = message.reply_text( + f"ᴀɴᴛɪ-ғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ sᴇᴛ ᴛᴏ {amount} ɪɴ ᴄʜᴀᴛ: {chat_name}" + ) + + else: + text = message.reply_text( + f"sᴜᴄᴄᴇssғᴜʟʟʏ ᴜᴘᴅᴀᴛᴇᴅ ᴀɴᴛɪ-ғʟᴏᴏᴅ ʟɪᴍɪᴛ ᴛᴏ {amount}!" + ) + + send_message(update.effective_message, text, parse_mode="markdown") + return f"<b>{html.escape(chat_name)}:</b>\n#SETFLOOD\n<b>Admin:</b> {mention_html(user.id, user.first_name)}\nSet antiflood to <code>{amount}</code>." + + else: + message.reply_text("ɪɴᴠᴀʟɪᴅ ᴀʀɢᴜᴍᴇɴᴛ ᴘʟᴇᴀsᴇ ᴜsᴇ ᴀ ɴᴜᴍʙᴇʀ, 'off' ᴏʀ 'no'") + else: + message.reply_text( + ( + "ᴜsᴇ `/setflood ɴᴜᴍʙᴇʀ` ᴛᴏ ᴇɴᴀʙʟᴇ ᴀɴᴛɪ-ғʟᴏᴏᴅ.\nᴏʀ ᴜsᴇ `/setflood off` ᴛᴏ ᴅɪsᴀʙʟᴇ ᴀɴᴛɪғʟᴏᴏᴅ!." + ), + parse_mode="markdown", + ) + return "" + + +@typing_action +def flood(update, context): + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + msg = update.effective_message + + conn = connected(context.bot, update, chat, user.id, need_admin=False) + if conn: + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + + limit = sql.get_flood_limit(chat_id) + if limit == 0: + text = ( + msg.reply_text(f"I'ᴍ ɴᴏᴛ ᴇɴғᴏʀᴄɪɴɢ ᴀɴʏ ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ ɪɴ {chat_name}!") + if conn + else msg.reply_text("I'm ɴᴏᴛ ᴇɴғᴏʀᴄɪɴɢ ᴀɴʏ ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ ʜᴇʀᴇ!") + ) + + elif conn: + text = msg.reply_text( + f"I'ᴍ ᴄᴜʀʀᴇɴᴛʟʏ restricting ᴍᴇᴍʙᴇʀs ᴀғᴛᴇʀ {limit} ᴄᴏɴsᴇᴄᴜᴛɪᴠᴇ ᴍᴇssᴀɢᴇs ɪɴ {chat_name}." + ) + + else: + text = msg.reply_text( + f"I'm ᴄᴜʀʀᴇɴᴛʟʏ ʀᴇsᴛʀɪᴄᴛɪɴɢ ᴍᴇᴍʙᴇʀs ᴀғᴛᴇʀ {limit} ᴄᴏɴsᴇᴄᴜᴛɪᴠᴇ ᴍᴇssᴀɢᴇs." + ) + + send_message(update.effective_message, text, parse_mode="markdown") + + +@user_admin +@loggable +@typing_action +def set_flood_mode(update, context): + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + msg = update.effective_message # type: Optional[Message] + args = context.args + + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + + if args: + if args[0].lower() == "ban": + settypeflood = "ʙᴀɴ" + sql.set_flood_strength(chat_id, 1, "0") + elif args[0].lower() == "kick": + settypeflood = "ᴋɪᴄᴋ" + sql.set_flood_strength(chat_id, 2, "0") + elif args[0].lower() == "mute": + settypeflood = "ᴍᴜᴛᴇ" + sql.set_flood_strength(chat_id, 3, "0") + elif args[0].lower() == "tban": + if len(args) == 1: + teks = """ɪᴛ ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ ғᴏʀ ᴀɴᴛɪғʟᴏᴏᴅ ʙᴜᴛ ʏᴏᴜ ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴛɪᴍᴇ; ᴛʀʏ, `/setfloodmode tban <timevalue>`. + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4ᴍ = 4 ᴍɪɴᴜᴛᴇs, 3h = 3 ʜᴏᴜʀs, 6d = 6 ᴅᴀʏs, 5w = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return + settypeflood = f"ᴛʙᴀɴ ғᴏʀ {args[1]}" + sql.set_flood_strength(chat_id, 4, str(args[1])) + elif args[0].lower() == "tmute": + if len(args) == 1: + teks = """It ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ ғᴏʀ ᴀɴᴛɪғʟᴏᴏᴅ ʙᴜᴛ ʏᴏᴜ ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴛɪᴍᴇ; ᴛʀʏ, `/setfloodmode tmute <timevalue>`. + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4m = 4 ᴍɪɴᴜᴛᴇs, 3h = 3 ʜᴏᴜʀs, 6d = 6 ᴅᴀʏs, 5w = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return + settypeflood = f"ᴛᴍᴜᴛᴇ ғᴏʀ {args[1]}" + sql.set_flood_strength(chat_id, 5, str(args[1])) + else: + send_message( + update.effective_message, "I ᴏɴʟʏ ᴜɴᴅᴇʀsᴛᴀɴᴅ ban/kick/mute/tban/tmute!" + ) + return + if conn: + text = msg.reply_text( + f"ᴇxᴄᴇᴇᴅɪɴɢ ᴄᴏɴsᴇᴄᴜᴛɪᴠᴇ ғʟᴏᴏᴅ ʟɪᴍɪᴛ ᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ {settypeflood} ɪɴ {chat_name}!" + ) + + else: + text = msg.reply_text( + f"ᴇxᴄᴇᴇᴅɪɴɢ ᴄᴏɴsᴇᴄᴜᴛɪᴠᴇ ғʟᴏᴏᴅ ʟɪᴍɪᴛ ᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ {settypeflood}!" + ) + + send_message(update.effective_message, text, parse_mode="markdown") + return f"<b>{settypeflood}:</b>\n<b>Admin:</b> {html.escape(chat.title)}\nHas changed antiflood mode. User will {mention_html(user.id, user.first_name)}." + + getmode, getvalue = sql.get_flood_setting(chat.id) + if getmode == 1: + settypeflood = "ʙᴀɴ" + elif getmode == 2: + settypeflood = "ᴋɪᴄᴋ" + elif getmode == 3: + settypeflood = "ᴍᴜᴛᴇ" + elif getmode == 4: + settypeflood = f"ᴛʙᴀɴ ғᴏʀ {getvalue}" + elif getmode == 5: + settypeflood = f"ᴛᴍᴜᴛᴇ ғᴏʀ {getvalue}" + if conn: + text = msg.reply_text( + f"sᴇɴᴅɪɴɢ ᴍᴏʀᴇ ᴍᴇssᴀɢᴇs ᴛʜᴀɴ ғʟᴏᴏᴅ ʟɪᴍɪᴛ ᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ {settypeflood} ɪɴ {chat_name}." + ) + + else: + text = msg.reply_text( + f"sᴇɴᴅɪɴɢ ᴍᴏʀᴇ ᴍᴇssᴀɢᴇ ᴛʜᴀɴ ғʟᴏᴏᴅ ʟɪᴍɪᴛ ᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ {settypeflood}." + ) + + send_message(update.effective_message, text, parse_mode=ParseMode.MARKDOWN) + return "" + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + limit = sql.get_flood_limit(chat_id) + if limit == 0: + return "ɴᴏᴛ ᴇɴғᴏʀᴄɪɴɢ ᴛᴏ ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ." + return f"ᴀɴᴛɪғʟᴏᴏᴅ ʜᴀs ʙᴇᴇɴ sᴇᴛ ᴛᴏ`{limit}`." + + +__help__ = """ +*ᴀʟʟᴏᴡs ʏᴏᴜ ᴛᴏ ᴛᴀᴋᴇ ᴀᴄᴛɪᴏɴ ᴏɴ ᴜsᴇʀs ᴛʜᴀᴛ sᴇɴᴅᴍᴏʀᴇᴛʜᴀɴ x ᴍᴇssᴀɢᴇs ɪɴ ᴀ ʀᴏᴡ. Exᴄᴇᴇᴅɪɴɢ ᴛʜᴇ sᴇᴛ ғʟᴏᴏᴅ \nᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ ʀᴇsᴛʀɪᴄᴛɪɴɢ ᴛʜᴀᴛ ᴜsᴇʀ. +Tʜɪs ᴡɪʟʟ ᴍᴜᴛᴇ ᴜsᴇʀs ɪғ ᴛʜᴇʏ sᴇɴᴅ ᴍᴏʀᴇ ᴛʜᴀɴ 5 ᴍᴇssᴀɢᴇs ɪɴ ᴀ ʀᴏᴡ, ʙᴏᴛs ᴀʀᴇ ɪɢɴᴏʀᴇᴅ.* + +➥ /flood *:* `Gᴇᴛ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ sᴇᴛᴛɪɴɢ` + + • *ᴀᴅᴍɪɴs ᴏɴʟʏ:* + +➥ /setflood <`ɪɴᴛ`/'ᴏɴ'/'ᴏғғ'>*:* `ᴇɴᴀʙʟᴇs ᴏʀ ᴅɪsᴀʙʟᴇs ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ` + ᴇxᴀᴍᴘʟᴇ *:* `/setflood 5` + +➥ /setfloodmode <ʙᴀɴ/ᴋɪᴄᴋ/ᴍᴜᴛᴇ/ᴛʙᴀɴ/ᴛᴍᴜᴛᴇ> <ᴠᴀʟᴜᴇ>*:* `Aᴄᴛɪᴏɴ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴡʜᴇɴ ᴜsᴇʀ ʜᴀᴠᴇ ᴇxᴄᴇᴇᴅᴇᴅ ғʟᴏᴏᴅ ʟɪᴍɪᴛ. ʙᴀɴ/ᴋɪᴄᴋ/ᴍᴜᴛᴇ/ᴛᴍᴜᴛᴇ/ᴛʙᴀɴ` + + • *ɴᴏᴛᴇ:* + + `• Vᴀʟᴜᴇ ᴍᴜsᴛ ʙᴇ ғɪʟʟᴇᴅ ғᴏʀ ᴛʙᴀɴ ᴀɴᴅ ᴛᴍᴜᴛᴇ!!` + Iᴛ ᴄᴀɴ ʙᴇ: + `5ᴍ` = 5 ᴍɪɴᴜᴛᴇs + `6ʜ` = 6 ʜᴏᴜʀs + `3ᴅ` = 3 ᴅᴀʏs + `1ᴡ` = 1 ᴡᴇᴇᴋ + + """ + +__mod_name__ = "𝙰ɴᴛɪ-ғʟᴏᴏᴅ" + +FLOOD_BAN_HANDLER = MessageHandler( + Filters.all & ~Filters.status_update & Filters.chat_type.groups, + check_flood, + run_async=True, +) +SET_FLOOD_HANDLER = CommandHandler( + "setflood", set_flood, pass_args=True, run_async=True +) # , filters=Filters.chat_type.groups) +SET_FLOOD_MODE_HANDLER = CommandHandler( + "setfloodmode", set_flood_mode, pass_args=True, run_async=True +) # , filters=Filters.chat_type.groups) +FLOOD_HANDLER = CommandHandler( + "flood", flood, run_async=True +) # , filters=Filters.chat_type.groups) + +dispatcher.add_handler(FLOOD_BAN_HANDLER, FLOOD_GROUP) +dispatcher.add_handler(SET_FLOOD_HANDLER) +dispatcher.add_handler(SET_FLOOD_MODE_HANDLER) +dispatcher.add_handler(FLOOD_HANDLER) diff --git a/Exon/modules/antilinkedchannel.py b/Exon/modules/antilinkedchannel.py new file mode 100644 index 00000000..56b8ca49 --- /dev/null +++ b/Exon/modules/antilinkedchannel.py @@ -0,0 +1,130 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import TelegramError, Update +from telegram.ext import CallbackContext +from telegram.ext.filters import Filters + +import Exon.modules.sql.antilinkedchannel_sql as sql +from Exon.modules.helper_funcs.anonymous import AdminPerms, user_admin +from Exon.modules.helper_funcs.chat_status import bot_admin, bot_can_delete +from Exon.modules.helper_funcs.decorators import Exoncmd, Exonmsg + + +@Exoncmd(command="cleanlinked", group=112) +@bot_can_delete +@user_admin(AdminPerms.CAN_RESTRICT_MEMBERS) +def set_antilinkedchannel(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + args = context.args + if len(args) > 0: + s = args[0].lower() + if s in ["yes", "on"]: + if sql.status_pin(chat.id): + sql.disable_pin(chat.id) + sql.enable_pin(chat.id) + message.reply_html( + f"ᴇɴᴀʙʟᴇᴅ ʟɪɴᴋᴇᴅ channel ᴘᴏsᴛ ᴅᴇʟᴇᴛɪᴏɴ ᴀɴᴅ ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ɪɴ {html.escape(chat.title)}" + ) + + else: + sql.enable_linked(chat.id) + message.reply_html( + f"ᴇɴᴀʙʟᴇᴅ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ᴘᴏsᴛ ᴅᴇʟᴇᴛɪᴏɴ ɪɴ {html.escape(chat.title)}. ᴍᴇssᴀɢᴇs sᴇɴᴛ ғʀᴏᴍ ᴛʜᴇ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ᴡɪʟʟ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ." + ) + + elif s in ["off", "no"]: + sql.disable_linked(chat.id) + message.reply_html( + f"ᴅɪsᴀʙʟᴇᴅ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ᴘᴏsᴛ ᴅᴇʟᴇᴛɪᴏɴ ɪɴ {html.escape(chat.title)}" + ) + + else: + message.reply_text(f"ᴜɴʀᴇᴄᴏɢɴɪᴢᴇᴅ arguments {s}") + return + message.reply_html( + f"ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ᴘᴏsᴛ ᴅᴇʟᴇᴛɪᴏɴ ɪs ᴄᴜʀʀᴇɴᴛʟʏ {sql.status_linked(chat.id)} ɪɴ {html.escape(chat.title)}" + ) + + +@Exonmsg(Filters.is_automatic_forward, group=111) +def eliminate_linked_channel_msg(update: Update, _: CallbackContext): + message = update.effective_message + chat = update.effective_chat + if not sql.status_linked(chat.id): + return + try: + message.delete() + except TelegramError: + return + + +@Exoncmd(command="antichannelpin", group=114) +@bot_admin +@user_admin(AdminPerms.CAN_RESTRICT_MEMBERS) +def set_antipinchannel(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + args = context.args + if len(args) > 0: + s = args[0].lower() + if s in ["yes", "on"]: + if sql.status_linked(chat.id): + sql.disable_linked(chat.id) + sql.enable_pin(chat.id) + message.reply_html( + f"ᴅɪsᴀʙʟᴇᴅ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ ᴅᴇʟᴇᴛɪᴏɴ ᴀɴᴅ ᴇɴᴀʙʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ɪɴ {html.escape(chat.title)}" + ) + + else: + sql.enable_pin(chat.id) + message.reply_html( + f"ᴇɴᴀʙʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ɪɴ {html.escape(chat.title)}" + ) + elif s in ["off", "no"]: + sql.disable_pin(chat.id) + message.reply_html( + f"ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ɪɴ {html.escape(chat.title)}" + ) + else: + message.reply_text(f"ᴜɴʀᴇᴄᴏɢɴɪᴢᴇᴅ ᴀʀɢᴜᴍᴇɴᴛs {s}") + return + message.reply_html( + f"ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ message ᴜɴᴘɪɴ ɪs ᴄᴜʀʀᴇɴᴛʟʏ {sql.status_pin(chat.id)} ɪɴ {html.escape(chat.title)}" + ) + + +@Exonmsg(Filters.is_automatic_forward | Filters.status_update.pinned_message, group=113) +def eliminate_linked_channel_msg(update: Update, _: CallbackContext): + message = update.effective_message + chat = update.effective_chat + if not sql.status_pin(chat.id): + return + try: + message.unpin() + except TelegramError: + return diff --git a/Exon/modules/antinsfw.py b/Exon/modules/antinsfw.py new file mode 100644 index 00000000..db45f198 --- /dev/null +++ b/Exon/modules/antinsfw.py @@ -0,0 +1,201 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 os import remove + +from pyrogram import filters + +from Exon import BOT_USERNAME, DRAGONS, arq, pgram +from Exon.modules.mongo.nsfw_mongo import is_nsfw_on, nsfw_off, nsfw_on +from Exon.utils.errors import capture_err +from Exon.utils.permissions import adminsOnly + + +async def get_file_id_from_message(message): + file_id = None + if message.document: + if int(message.document.file_size) > 3145728: + return + mime_type = message.document.mime_type + if mime_type not in ("image/png", "image/jpeg"): + return + file_id = message.document.file_id + + if message.sticker: + if message.sticker.is_animated: + if not message.sticker.thumbs: + return + file_id = message.sticker.thumbs[0].file_id + else: + file_id = message.sticker.file_id + + if message.photo: + file_id = message.photo.file_id + + if message.animation: + if not message.animation.thumbs: + return + file_id = message.animation.thumbs[0].file_id + + if message.video: + if not message.video.thumbs: + return + file_id = message.video.thumbs[0].file_id + return file_id + + +@pgram.on_message( + ( + filters.document + | filters.photo + | filters.sticker + | filters.animation + | filters.video + ) + & ~filters.private, + group=8, +) +@capture_err +async def detect_nsfw(_, message): + if not await is_nsfw_on(message.chat.id): + return + if not message.from_user: + return + file_id = await get_file_id_from_message(message) + if not file_id: + return + file = await pgram.download_media(file_id) + try: + results = await arq.nsfw_scan(file=file) + except Exception: + return + if not results.ok: + return + results = results.result + remove(file) + nsfw = results.is_nsfw + if message.from_user.id in DRAGONS: + return + if not nsfw: + return + try: + await message.delete() + except Exception: + return + await message.reply_text( + f""" +**ɴsғᴡ ɪᴍᴀɢᴇ ᴅᴇᴛᴇᴄᴛᴇᴅ & ᴅᴇʟᴇᴛᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ!** + +**𝗨𝘀𝗲𝗿:** {message.from_user.mention} [`{message.from_user.id}`] +**𝗦𝗮𝗳𝗲:** `{results.neutral} %` +**𝗣𝗼𝗿𝗻:** `{results.porn} %` +**𝗔𝗱𝘂𝗹𝘁:** `{results.sexy} %` +**𝗛𝗲𝗻𝘁𝗮𝗶:** `{results.hentai} %` +**𝗗𝗿𝗮𝘄𝗶𝗻𝗴𝘀:** `{results.drawings} %` + +""" + ) + + +@pgram.on_message(filters.command(["pscan", f"pscan@{BOT_USERNAME}"])) +@capture_err +async def nsfw_scan_command(_, message): + if not message.reply_to_message: + await message.reply_text( + "ʀᴇᴘʟʏ ᴛᴏ ᴀɴ ɪᴍᴀɢᴇ/ᴅᴏᴄᴜᴍᴇɴᴛ/sᴛɪᴄᴋᴇʀ/ᴀɴɪᴍᴀᴛɪᴏɴ ᴛᴏ sᴄᴀɴ ɪᴛ." + ) + return + reply = message.reply_to_message + if ( + not reply.document + and not reply.photo + and not reply.sticker + and not reply.animation + and not reply.video + ): + await message.reply_text( + "ʀᴇᴘʟʏ ᴛᴏ ᴀɴ ɪᴍᴀɢᴇ/ᴅᴏᴄᴜᴍᴇɴᴛ/sᴛɪᴄᴋᴇʀ/ᴀɴɪᴍᴀᴛɪᴏɴ ᴛᴏ sᴄᴀɴ ɪᴛ." + ) + return + m = await message.reply_text("sᴄᴀɴɴɪɴɢ..") + file_id = await get_file_id_from_message(reply) + if not file_id: + return await m.edit("sᴏᴍᴇᴛʜɪɴɢ ᴡʀᴏɴɢ ʜᴀᴘᴘᴇɴᴇᴅ.") + file = await pgram.download_media(file_id) + try: + results = await arq.nsfw_scan(file=file) + except Exception: + return + remove(file) + if not results.ok: + return await m.edit(results.result) + results = results.result + await m.edit( + f""" +**𝗡𝗲𝘂𝘁𝗿𝗮𝗹:** `{results.neutral} %` +**𝗣𝗼𝗿𝗻:** `{results.porn} %` +**𝗛𝗲𝗻𝘁𝗮𝗶:** `{results.hentai} %` +**𝗦𝗲𝘅𝘆:** `{results.sexy} %` +**𝗗𝗿𝗮𝘄𝗶𝗻𝗴𝘀:** `{results.drawings} %` +**𝗡𝗦𝗙𝗪:** `{results.is_nsfw}` +""" + ) + + +@pgram.on_message( + filters.command(["antiporn", f"antiporn@{BOT_USERNAME}"]) & ~filters.private +) +@adminsOnly("can_change_info") +async def nsfw_enable_disable(_, message): + if len(message.command) != 2: + await message.reply_text("ᴜsᴀɢᴇ: /antiporn [on/off]") + return + status = message.text.split(None, 1)[1].strip() + status = status.lower() + chat_id = message.chat.id + if status in ("on", "yes"): + await nsfw_on(chat_id) + await message.reply_text( + "ᴇɴᴀʙʟᴇᴅ ᴀɴᴛɪ-ᴘᴏʀɴ sʏsᴛᴇᴍ. I ᴡɪʟʟ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇs ᴄᴏɴᴛᴀɪɴɪɴɢ ɪɴᴀᴘᴘʀᴏᴘʀɪᴀᴛᴇ ᴄᴏɴᴛᴇɴᴛ." + ) + elif status in ("off", "no"): + await nsfw_off(chat_id) + await message.reply_text("ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪ-ᴘᴏʀɴ sʏsᴛᴇᴍ.") + else: + await message.reply_text("ᴜɴᴋɴᴏᴡɴ sᴜғғɪx, ᴜsᴇ /antiporn [on/off]") + + +__mod_name__ = "𝙿ᴏʀɴ" + + +__help__ = """ +*ᴀɴᴛɪ ᴘᴏʀɴ sʏsᴛᴇᴍ* + +/antiporn <oɴ> *:* `ᴇɴᴀʙʟᴇᴅ ᴀɴᴛɪɴsғᴡ` *ᴀɴᴛɪᴘᴏʀɴ* `sʏsᴛᴇᴍ. ʙᴏᴛ ᴡɪʟʟ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇs ᴄᴏɴᴛᴀɪɴɪɴɢ ɪɴᴀᴘᴘʀᴏᴘʀɪᴀᴛᴇ ᴄᴏɴᴛᴇɴᴛ` [ᴅᴇғᴇᴀᴛ ᴏɴ] + +/antiporn <ᴏғғ> *:* `sᴀʟᴇ ᴏғғ ʜɪ ǫ ᴋᴀᴇ ɴᴀ ʙ ᴏɴ ᴋᴀʀ ᴅᴇ` + +/pscan *:* `ʀᴇᴘʟʏ ᴛᴏ ᴀɴ ɪᴍᴀɢᴇ/ᴅᴏᴄᴜᴍᴇɴᴛ/sᴛɪᴄᴋᴇʀ/ᴀɴɪᴍᴀᴛɪᴏɴ ᴛᴏ sᴄᴀɴ ɪᴛ` + +""" diff --git a/Exon/modules/antiservice.py b/Exon/modules/antiservice.py new file mode 100644 index 00000000..bffe48d5 --- /dev/null +++ b/Exon/modules/antiservice.py @@ -0,0 +1,61 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +from pyrogram import filters + +from Exon import pgram +from Exon.core.decorators.permissions import adminsOnly +from Exon.utils.dbfunctions import antiservice_off, antiservice_on, is_antiservice_on + + +@pgram.on_message(filters.command("antiservice") & ~filters.private & ~filters.edited) +@adminsOnly("can_change_info") +async def anti_service(_, message): + if len(message.command) != 2: + return await message.reply_text("ᴜsᴀɢᴇ: /antiservice [on | off]") + status = message.text.split(None, 1)[1].strip() + status = status.lower() + chat_id = message.chat.id + if status == "on": + await antiservice_on(chat_id) + await message.reply_text( + "ᴇɴᴀʙʟᴇᴅ ᴀɴᴛɪsᴇʀᴠɪᴄᴇ sʏsᴛᴇᴍ. ɪ ᴡɪʟʟ ᴅᴇʟᴇᴛᴇ sᴇʀᴠɪᴄᴇ ᴍᴇssᴀɢᴇs ғʀᴏᴍ ɴᴏᴡ ᴏɴ." + ) + elif status == "off": + await antiservice_off(chat_id) + await message.reply_text( + "ᴅɪsᴀʙʟᴇᴅ ᴀɴᴛɪsᴇʀᴠɪᴄᴇ sʏsᴛᴇᴍ. I ᴡᴏɴ'ᴛ ʙᴇ ᴅᴇʟᴇᴛɪɴɢ sᴇʀᴠɪᴄᴇ ᴍᴇssᴀɢᴇ ғʀᴏᴍ ɴᴏᴡ ᴏɴ." + ) + else: + await message.reply_text("ᴜɴᴋɴᴏᴡɴ sᴜғғɪx, ᴜsᴇ /antiservice [enable|disable]") + + +@pgram.on_message(filters.service, group=11) +async def delete_service(_, message): + chat_id = message.chat.id + try: + if await is_antiservice_on(chat_id): + return await message.delete() + except Exception: + pass diff --git a/Exon/modules/approval.py b/Exon/modules/approval.py new file mode 100644 index 00000000..dc00e4ca --- /dev/null +++ b/Exon/modules/approval.py @@ -0,0 +1,258 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CallbackQueryHandler, run_async +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.approve_sql as sql +from Exon import DRAGONS, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import user_admin +from Exon.modules.helper_funcs.extraction import extract_user +from Exon.modules.log_channel import loggable + + +@loggable +@user_admin +@run_async +def approve(update, context): + message = update.effective_message + chat_title = message.chat.title + chat = update.effective_chat + args = context.args + user = update.effective_user + user_id = extract_user(message, args) + if not user_id: + message.reply_text( + "I ᴅᴏɴ'ᴛ ᴋɴᴏᴡ ᴡʜᴏ ʏᴏᴜ'ʀᴇ ᴛᴀʟᴋɪɴɢ ᴀʙᴏᴜᴛ, ʏᴏᴜ'ʀᴇ ɢᴏɪɴɢ ᴛᴏ ɴᴇᴇᴅ ᴛᴏ sᴘᴇᴄɪғʏ ᴀ ᴜsᴇʀ!" + ) + return "" + try: + member = chat.get_member(user_id) + except BadRequest: + return "" + if member.status == "administrator" or member.status == "creator": + message.reply_text( + "ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴀᴅᴍɪɴ - ʟᴏᴄᴋs, ʙʟᴏᴄᴋʟɪsᴛs, ᴀɴᴅ ᴀɴᴛɪғʟᴏᴏᴅ ᴀʟʀᴇᴀᴅʏ ᴅᴏɴ'ᴛ ᴀᴘᴘʟʏ ᴛᴏ ᴛʜᴇᴍ." + ) + return "" + if sql.is_approved(message.chat_id, user_id): + message.reply_text( + f"[{member.user['first_name']}](tg://user?id={member.user['id']}) ɪs ᴀʟʀᴇᴀᴅʏ ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ {chat_title}", + parse_mode=ParseMode.MARKDOWN, + ) + return "" + sql.approve(message.chat_id, user_id) + message.reply_text( + f"[{member.user['first_name']}](tg://user?id={member.user['id']}) ʜᴀs ʙᴇᴇɴ ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ {chat_title}! ᴛʜᴇʏ ᴡɪʟʟ ɴᴏᴡ ʙᴇ ɪɢɴᴏʀᴇᴅ ʙʏ ᴀᴜᴛᴏᴍᴀᴛᴇᴅ ᴀᴅᴍɪɴ ᴀᴄᴛɪᴏɴs ʟɪᴋᴇ locᴋs,ʙʟᴏᴄᴋʟɪsᴛs, ᴀɴᴅ ᴀɴᴛɪғʟᴏᴏᴅ.", + parse_mode=ParseMode.MARKDOWN, + ) + log_message = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴀᴘᴘʀᴏᴠᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + + return log_message + + +@loggable +@user_admin +@run_async +def disapprove(update, context): + message = update.effective_message + chat_title = message.chat.title + chat = update.effective_chat + args = context.args + user = update.effective_user + user_id = extract_user(message, args) + if not user_id: + message.reply_text( + "I ᴅᴏɴ'ᴛ ᴋɴᴏᴡ ᴡʜᴏ ʏᴏᴜ'ʀᴇ ᴛᴀʟᴋɪɴɢ ᴀʙᴏᴜᴛ, ʏᴏᴜ'ʀᴇ ɢᴏɪɴɢ ᴛᴏ ɴᴇᴇᴅ ᴛᴏ sᴘᴇᴄɪғʏ ᴀ ᴜsᴇʀ!" + ) + return "" + try: + member = chat.get_member(user_id) + except BadRequest: + return "" + if member.status == "administrator" or member.status == "creator": + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴ, ᴛʜᴇʏ ᴄᴀɴ'ᴛ ʙᴇ ᴜɴᴀᴘᴘʀᴏᴠᴇᴅ.") + return "" + if not sql.is_approved(message.chat_id, user_id): + message.reply_text(f"{member.user['first_name']} ɪsɴ'ᴛ ᴀᴘᴘʀᴏᴠᴇᴅ ʏᴇᴛ!") + return "" + sql.disapprove(message.chat_id, user_id) + message.reply_text( + f"{member.user['first_name']} ɪs ɴᴏ ʟᴏɴɢᴇʀ ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ {chat_title}." + ) + log_message = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴᴀᴘᴘʀᴏᴠᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + + return log_message + + +@user_admin +@run_async +def approved(update, context): + message = update.effective_message + chat_title = message.chat.title + chat = update.effective_chat + msg = "ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ᴜsᴇʀs ᴀʀᴇ ᴀᴘᴘʀᴏᴠᴇᴅ.\n" + approved_users = sql.list_approved(message.chat_id) + for i in approved_users: + member = chat.get_member(int(i.user_id)) + msg += f"- `{i.user_id}`: {member.user['first_name']}\n" + if msg.endswith("approved.\n"): + message.reply_text(f"ɴᴏ ᴜsᴇʀs ᴀʀᴇ ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ {chat_title}.") + return "" + else: + message.reply_text(msg, parse_mode=ParseMode.MARKDOWN) + + +@user_admin +def approval(update, context): + message = update.effective_message + chat = update.effective_chat + args = context.args + user_id = extract_user(message, args) + if not user_id: + message.reply_text( + "I ᴅᴏɴ'ᴛ ᴋɴᴏᴡ ᴡʜᴏ ʏᴏᴜ'ʀᴇ ᴛᴀʟᴋɪɴɢ ᴀʙᴏᴜᴛ, ʏᴏᴜ'ʀᴇ ɢᴏɪɴɢ ᴛᴏ ɴᴇᴇᴅ ᴛᴏ sᴘᴇᴄɪғʏ ᴀ ᴜsᴇʀ!" + ) + return "" + member = chat.get_member(int(user_id)) + + if sql.is_approved(message.chat_id, user_id): + message.reply_text( + f"{member.user['first_name']} ɪs ᴀɴ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀ. ʟᴏᴄᴋs, ᴀɴᴛɪғʟᴏᴏᴅ, ᴀɴᴅ ʙʟᴏᴄᴋʟɪsᴛs ᴡᴏɴ'ᴛ ᴀᴘᴘʟʏ ᴛᴏ ᴛʜᴇᴍ." + ) + else: + message.reply_text( + f"{member.user['first_name']} ɪs ɴᴏᴛ ᴀɴ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀ. ᴛʜᴇʏ ᴀʀᴇ ᴀғғᴇᴄᴛᴇᴅ ʙʏ ɴᴏʀᴍᴀʟ ᴄᴏᴍᴍᴀɴᴅs." + ) + + +@run_async +def unapproveall(update: Update, context: CallbackContext): + chat = update.effective_chat + user = update.effective_user + member = chat.get_member(user.id) + if member.status != "creator" and user.id not in DRAGONS: + update.effective_message.reply_text( + "ᴏɴʟʏ ᴛʜᴇ ᴄʜᴀᴛ ᴏᴡɴᴇʀ ᴄᴀɴ ᴜɴᴀᴘᴘʀᴏᴠᴇ ᴀʟʟ ᴜsᴇʀs ᴀᴛ ᴏɴᴄᴇ." + ) + else: + buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="✰ ᴜɴᴀᴘᴘʀᴏᴠᴇ ᴀʟʟ ✰", callback_data="unapproveall_user" + ) + ], + [ + InlineKeyboardButton( + text="✰ ᴄᴀɴᴄᴇʟ ✰", callback_data="unapproveall_cancel" + ) + ], + ] + ) + update.effective_message.reply_text( + f"ᴀʀᴇ ʏᴏᴜ sᴜʀᴇ ʏᴏᴜ ᴡᴏᴜʟᴅ ʟɪᴋᴇ ᴛᴏ ᴜɴᴀᴘᴘʀᴏᴠᴇ ALL ᴜsᴇʀs ɪɴ {chat.title}? ᴛʜɪs ᴀᴄᴛɪᴏɴ ᴄᴀɴɴᴏᴛ ʙᴇ ᴜɴᴅᴏɴᴇ.", + reply_markup=buttons, + parse_mode=ParseMode.MARKDOWN, + ) + + +@run_async +def unapproveall_btn(update: Update, context: CallbackContext): + query = update.callback_query + chat = update.effective_chat + message = update.effective_message + member = chat.get_member(query.from_user.id) + if query.data == "unapproveall_user": + if member.status == "creator" or query.from_user.id in DRAGONS: + approved_users = sql.list_approved(chat.id) + users = [int(i.user_id) for i in approved_users] + for user_id in users: + sql.disapprove(chat.id, user_id) + + if member.status == "administrator": + query.answer("ᴏɴʟʏ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ ᴄᴀɴ ᴅᴏ ᴛʜɪs.") + + if member.status == "member": + query.answer("ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴀᴅᴍɪɴ ᴛᴏ ᴅᴏ ᴛʜɪs.") + elif query.data == "unapproveall_cancel": + if member.status == "creator" or query.from_user.id in DRAGONS: + message.edit_text("ʀᴇᴍᴏᴠɪɴɢ of ᴀʟʟ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀs ʜᴀs ʙᴇᴇɴ ᴄᴀɴᴄᴇʟʟᴇᴅ.") + return "" + if member.status == "administrator": + query.answer("ᴏɴʟʏ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ ᴄᴀɴ ᴅᴏ ᴛʜɪs.") + if member.status == "member": + query.answer("ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴀᴅᴍɪɴ ᴛᴏ ᴅᴏ ᴛʜɪs.") + + +__help__ = """ +*ꜱᴏᴍᴇᴛɪᴍᴇꜱ, ʏᴏᴜ ᴍɪɢʜᴛ ᴛʀᴜꜱᴛ ᴀ ᴜꜱᴇʀ ɴᴏᴛ ᴛᴏ ꜱᴇɴᴅ ᴜɴᴡᴀɴᴛᴇᴅ ᴄᴏɴᴛᴇɴᴛ. +ᴍᴀʏʙᴇ ɴᴏᴛ ᴇɴᴏᴜɢʜ ᴛᴏ ᴍᴀᴋᴇ ᴛʜᴇᴍ ᴀᴅᴍɪɴ, ʙᴜᴛ ʏᴏᴜ ᴍɪɢʜᴛ ʙᴇ ᴏᴋ ᴡɪᴛʜ ʟᴏᴄᴋꜱ, ʙʟᴀᴄᴋʟɪꜱᴛꜱ, ᴀɴᴅ ᴀɴᴛɪғʟᴏᴏᴅ ɴᴏᴛ ᴀᴘᴘʟʏɪɴɢ ᴛᴏ ᴛʜᴇᴍ* +`ᴛʜᴀᴛ ᴡʜᴀᴛ ᴀᴘᴘʀᴏᴠᴀʟꜱ ᴀʀᴇ ғᴏʀ - ᴀᴘᴘʀᴏᴠᴇ ᴏғ ᴛʀᴜꜱᴛᴡᴏʀᴛʜʏ ᴜꜱᴇʀꜱ ᴛᴏ ᴀʟʟᴏᴡ ᴛʜᴇᴍ ᴛᴏ ꜱᴇɴᴅ` + +*ᴀᴅᴍɪɴ ᴄᴏᴍᴍᴀɴᴅꜱ:* +⍟ /approval*:* `ᴄʜᴇᴄᴋ ᴀ ᴜꜱᴇʀ ᴀᴘᴘʀᴏᴠᴀʟ ꜱᴛᴀᴛᴜꜱ ɪɴ ᴛʜɪꜱ ᴄʜᴀᴛ.` + +⍟ /approve*:* `ᴀᴘᴘʀᴏᴠᴇ ᴏғ ᴀ ᴜꜱᴇʀ. ʟᴏᴄᴋꜱ, ʙʟᴀᴄᴋʟɪꜱᴛꜱ, ᴀɴᴅ ᴀɴᴛɪғʟᴏᴏᴅ ᴡᴏɴ'ᴛ ᴀᴘᴘʟʏ ᴛᴏ ᴛʜᴇᴍ ᴀɴʏᴍᴏʀᴇ`. + +⍟ /unapprove*:* `ᴜɴᴀᴘᴘʀᴏᴠᴇ ᴏғ ᴀ ᴜꜱᴇʀ. ᴛʜᴇʏ ᴡɪʟʟ ɴᴏᴡ ʙᴇ ꜱᴜʙᴊᴇᴄᴛ to ʟᴏᴄᴋꜱ, blacklists, and antiflood again.` + +⍟ /approved*:* `ʟɪꜱᴛ ᴀʟʟ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜꜱᴇʀꜱ` + +⍟ /unapproveall*:* `ᴜɴᴀᴘᴘʀᴏᴠᴇ` *ᴀʟʟ* `ᴜꜱᴇʀꜱ ɪɴ a ᴄʜᴀᴛ. ᴛʜɪꜱ ᴄᴀɴɴᴏᴛ ʙᴇ ᴜɴᴅᴏɴᴇ` +""" + + +APPROVE = DisableAbleCommandHandler("approve", approve) +DISAPPROVE = DisableAbleCommandHandler("unapprove", disapprove) +APPROVED = DisableAbleCommandHandler("approved", approved) +APPROVAL = DisableAbleCommandHandler("approval", approval) +UNAPPROVEALL = DisableAbleCommandHandler("unapproveall", unapproveall) +UNAPPROVEALL_BTN = CallbackQueryHandler(unapproveall_btn, pattern=r"unapproveall_.*") + +dispatcher.add_handler(APPROVE) +dispatcher.add_handler(DISAPPROVE) +dispatcher.add_handler(APPROVED) +dispatcher.add_handler(APPROVAL) +dispatcher.add_handler(UNAPPROVEALL) +dispatcher.add_handler(UNAPPROVEALL_BTN) + +__mod_name__ = "𝙰ᴘᴘʀᴏᴠᴀʟ" +__command_list__ = ["approve", "unapprove", "approved", "approval"] +__handlers__ = [APPROVE, DISAPPROVE, APPROVED, APPROVAL] diff --git a/Exon/modules/arq.py b/Exon/modules/arq.py new file mode 100644 index 00000000..915edee9 --- /dev/null +++ b/Exon/modules/arq.py @@ -0,0 +1,62 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +from pyrogram import filters + +from Exon import BOT_USERNAME, arq, pgram + + +@pgram.on_message(filters.command("arq")) +async def arq_stats(_, message): + data = await arq.stats() + if not data.ok: + return await message.reply_text(data.result) + data = data.result + uptime = data.uptime + requests = data.requests + cpu = data.cpu + server_mem = data.memory.server + api_mem = data.memory.api + disk = data.disk + platform = data.platform + python_version = data.python + users = data.users + statistics = f""" +**>-< sʏsᴛᴇᴍ >-<** +**ᴜᴘᴛɪᴍᴇ:** `{uptime}` +**ʀᴇǫᴜᴇsᴛs ᴜᴘᴛɪᴍᴇ:** `{requests}` +**ᴄᴘᴜ:** `{cpu}` +**ᴍᴇᴍᴏʀʏ:** +**ᴛᴏᴛᴀʟ ᴜsᴇᴅ:** `{server_mem}` +**ᴀᴘɪ:** `{api_mem}` +**ᴅɪsᴋ:** `{disk}` +**ᴘʟᴀᴛғᴏʀᴍ:** `{platform}` +**ᴘʏᴛʜᴏɴ:** `{python_version}` + +**ᴀʀǫ sᴛᴀᴛɪsᴛɪᴄs:** +**ᴜsᴇʀs:** `{users}` + +**@{BOT_USERNAME} sᴏᴍᴇ ᴍᴏᴅᴜʟᴇs ʀᴜɴɴɪɴɢ ᴏɴ ᴀʀǫ** +""" + await message.reply_text(statistics, disable_web_page_preview=True) diff --git a/Exon/modules/backups.py b/Exon/modules/backups.py new file mode 100644 index 00000000..44f8a907 --- /dev/null +++ b/Exon/modules/backups.py @@ -0,0 +1,408 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 json +import os +import time +from io import BytesIO + +from telegram import Message, ParseMode +from telegram.error import BadRequest +from telegram.ext import CommandHandler + +import Exon.modules.sql.blacklist_sql as blacklistsql +import Exon.modules.sql.locks_sql as locksql +import Exon.modules.sql.notes_sql as sql +import Exon.modules.sql.rules_sql as rulessql +from Exon import JOIN_LOGGER, LOGGER, OWNER_ID, SUPPORT_CHAT, dispatcher +from Exon.__main__ import DATA_IMPORT +from Exon.modules.connection import connected +from Exon.modules.helper_funcs.alternate import typing_action +from Exon.modules.helper_funcs.chat_status import user_admin +from Exon.modules.sql import disable_sql as disabledsql + + +@user_admin +@typing_action +def import_data(update, context): + msg = update.effective_message + chat = update.effective_chat + user = update.effective_user + # TODO: allow uploading doc with command, not just as reply + # only work with a doc + + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + update.effective_message.reply_text("ᴛʜɪs ɪs ᴀ ɢʀᴏᴜᴘ ᴏɴʟʏ ᴄᴏᴍᴍᴀɴᴅ!") + return "" + + chat = update.effective_chat + chat_name = update.effective_message.chat.title + + if msg.reply_to_message and msg.reply_to_message.document: + try: + file_info = context.bot.get_file(msg.reply_to_message.document.file_id) + except BadRequest: + msg.reply_text( + "ᴛʀʏ ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ᴀɴᴅ ᴜᴘʟᴏᴀᴅɪɴɢ ᴛʜᴇ ғɪʟᴇ ʏᴏᴜʀsᴇʟғ ᴀɢᴀɪɴ, ᴛʜɪs ᴏɴᴇ sᴇᴇᴍ ʙʀᴏᴋᴇɴ ᴛᴏ ᴍᴇ!", + ) + return + + with BytesIO() as file: + file_info.download(out=file) + file.seek(0) + data = json.load(file) + + # only import one group + if len(data) > 1 and str(chat.id) not in data: + msg.reply_text( + "ᴛʜᴇʀᴇ ᴀʀᴇ ᴍᴏʀᴇ ᴛʜᴀɴ ᴏɴᴇ ɢʀᴏᴜᴘ ɪɴ ᴛʜɪs ғɪʟᴇ ᴀɴᴅ ᴛʜᴇ ᴄʜᴀᴛ.ɪᴅ ɪs ɴᴏᴛ same! ʜᴏᴡ am ɪ sᴜᴘᴘᴏsᴇᴅ ᴛᴏ ɪᴍᴘᴏʀᴛ ɪᴛ?", + ) + return + + # Check if backup is this chat + try: + if data.get(str(chat.id)) is None: + if conn: + text = f"ʙᴀᴄᴋᴜᴘ ᴄᴏᴍᴇs ғʀᴏᴍ ᴀɴᴏᴛʜᴇʀ ᴄʜᴀᴛ, I ᴄᴀɴ'ᴛ ʀᴇᴛᴜʀɴ ᴀɴᴏᴛʜᴇʀ ᴄʜᴀᴛ ᴛᴏ ᴄʜᴀᴛ *{chat_name}*" + + else: + text = "ʙᴀᴄᴋᴜᴘ ᴄᴏᴍᴇs ғʀᴏᴍ ᴀɴᴏᴛʜᴇʀ ᴄʜᴀᴛ, I ᴄᴀɴ'ᴛ ʀᴇᴛᴜʀɴ ᴀɴᴏᴛʜᴇʀ ᴄʜᴀᴛ ᴛᴏ this chat" + return msg.reply_text(text, parse_mode="markdown") + except Exception: + return msg.reply_text("ᴛʜᴇʀᴇ ᴡᴀs ᴀ ᴘʀᴏʙʟᴇᴍ ᴡʜɪʟᴇ ɪᴍᴘᴏʀᴛɪɴɢ ᴛʜᴇ ᴅᴀᴛᴀ!") + # Check if backup is from self + try: + if str(context.bot.id) != str(data[str(chat.id)]["bot"]): + return msg.reply_text( + "ʙᴀᴄᴋᴜᴘ ғʀᴏᴍ ᴀɴᴏᴛʜᴇʀ ʙᴏᴛ ᴛʜᴀᴛ ɪs ɴᴏᴛ sᴜɢɢᴇsᴛᴇᴅ ᴍɪɢʜᴛ ᴄᴀᴜsᴇ ᴛʜᴇ ᴘʀᴏʙʟᴇᴍ, ᴅᴏᴄᴜᴍᴇɴᴛs, ᴘʜᴏᴛᴏs, ᴠɪᴅᴇᴏs, ᴀᴜᴅɪᴏs, ʀᴇᴄᴏʀᴅs ᴍɪɢʜᴛ ɴᴏᴛ ᴡᴏʀᴋ ᴀs ɪᴛ sʜᴏᴜʟᴅ ʙᴇ.", + ) + except Exception: + pass + # Select data source + if str(chat.id) in data: + data = data[str(chat.id)]["hashes"] + else: + data = data[list(data.keys())[0]]["hashes"] + + try: + for mod in DATA_IMPORT: + mod.__import_data__(str(chat.id), data) + except Exception: + msg.reply_text( + f"ᴀɴ ᴇʀʀᴏʀ ᴏᴄᴄᴜʀʀᴇᴅ ᴡʜɪʟᴇ ʀᴇᴄᴏᴠᴇʀɪɴɢ ʏᴏᴜʀ ᴅᴀᴛᴀ. ᴛʜᴇ ᴘʀᴏᴄᴇss ғᴀɪʟᴇᴅ. If ʏᴏᴜ ᴇxᴘᴇʀɪᴇɴᴄᴇ ᴀ ᴘʀᴏʙʟᴇᴍ ᴡɪᴛʜ ᴛʜɪs, ᴘʟᴇᴀsᴇ ᴛᴀᴋᴇ ɪᴛ ᴛᴏ @{SUPPORT_CHAT}", + ) + + LOGGER.exception( + "ɪᴍᴘʀᴛ ғᴏʀ ᴛʜᴇ ᴄʜᴀᴛ %s ᴡɪᴛʜ ᴛʜᴇ ɴᴀᴍᴇ %s ғᴀɪʟᴇᴅ.", + str(chat.id), + str(chat.title), + ) + return + + # TODO: some of that link logic + # NOTE: consider default permissions stuff? + if conn: + + text = f"ʙᴀᴄᴋᴜᴘ ғᴜʟʟʏ ʀᴇsᴛᴏʀᴇᴅ ᴏɴ *{chat_name}*." + else: + text = "ʙᴀᴄᴋᴜᴘ ғᴜʟʟʏ ʀᴇsᴛᴏʀᴇᴅ" + msg.reply_text(text, parse_mode="markdown") + + +@user_admin +def export_data(update, context): + chat_data = context.chat_data + msg = update.effective_message # type: Optional[Message] + user = update.effective_user # type: Optional[User] + chat_id = update.effective_chat.id + chat = update.effective_chat + current_chat_id = update.effective_chat.id + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + # chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + update.effective_message.reply_text("ᴛʜɪs ɪs ᴀ 𝚐𝚛𝚘𝚞𝚙 ᴏɴʟʏ ᴄᴏᴍᴍᴀɴᴅ!") + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + update.effective_message.chat.title + + jam = time.time() + new_jam = jam + 10800 + checkchat = get_chat(chat_id, chat_data) + if checkchat.get("status") and jam <= int(checkchat.get("value")): + timeformatt = time.strftime( + "%H:%M:%M %d/%m/%Y", + time.localtime(checkchat.get("value")), + ) + update.effective_message.reply_text( + "ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ʙᴀᴄᴋᴜᴘ ᴏɴᴄᴇ ᴀ ᴅᴀʏ!\nʏᴏᴜ ᴄᴀɴ ʙᴀᴄᴋᴜᴘ ᴀɢᴀɪɴ ɪɴ ᴀʙᴏᴜᴛ `{}`".format( + timeformatt, + ), + parse_mode=ParseMode.MARKDOWN, + ) + return + if user.id != OWNER_ID: + put_chat(chat_id, new_jam, chat_data) + note_list = sql.get_all_chat_notes(chat_id) + backup = {} + buttonlist = [] + namacat = "" + isicat = "" + rules = "" + count = 0 + countbtn = 0 + # Notes + for note in note_list: + count += 1 + sql.get_note(chat_id, note.name) + namacat += "{}<###splitter###>".format(note.name) + if note.msgtype == 1: + tombol = sql.get_buttons(chat_id, note.name) + for btn in tombol: + countbtn += 1 + if btn.same_line: + buttonlist.append( + ("{}".format(btn.name), "{}".format(btn.url), True), + ) + else: + buttonlist.append( + ("{}".format(btn.name), "{}".format(btn.url), False), + ) + isicat += "###button###: {}<###button###>{}<###splitter###>".format( + note.value, + str(buttonlist), + ) + buttonlist.clear() + elif note.msgtype == 2: + isicat += "###sticker###:{}<###splitter###>".format(note.file) + elif note.msgtype == 3: + isicat += "###file###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + elif note.msgtype == 4: + isicat += "###photo###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + elif note.msgtype == 5: + isicat += "###audio###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + elif note.msgtype == 6: + isicat += "###voice###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + elif note.msgtype == 7: + isicat += "###video###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + elif note.msgtype == 8: + isicat += "###video_note###:{}<###TYPESPLIT###>{}<###splitter###>".format( + note.file, + note.value, + ) + else: + isicat += "{}<###splitter###>".format(note.value) + notes = { + "#{}".format(namacat.split("<###splitter###>")[x]): "{}".format( + isicat.split("<###splitter###>")[x], + ) + for x in range(count) + } + # Rules + rules = rulessql.get_rules(chat_id) + # Blacklist + bl = list(blacklistsql.get_chat_blacklist(chat_id)) + # Disabled command + disabledcmd = list(disabledsql.get_all_disabled(chat_id)) + # Filters + """ + all_filters = list(filtersql.get_chat_triggers(chat_id)) + export_filters = {} + for filters in all_filters: + filt = filtersql.get_filter(chat_id, filters) + if filt.is_sticker: + typefilt = "sticker" + elif filt.is_document: + typefilt = "document" + elif filt.is_image: + typefilt = "image" + elif filt.is_audio: + typefilt = "audio" + elif filt.is_video: + typefilt = "video" + elif filt.is_voice: + typefilt = "voice" + elif filt.has_buttons: + typefilt = "buttons" + buttons = filtersql.get_buttons(chat_id, filt.keyword) + elif filt.has_markdown: + typefilt = "text" + if typefilt == "buttons": + content = "{}#=#{}|btn|{}".format(typefilt, filt.reply, buttons) + else: + content = "{}#=#{}".format(typefilt, filt.reply) + print(content) + export_filters[filters] = content + #print(export_filters) + + """ + + # Welcome (TODO) + # welc = welcsql.get_welc_pref(chat_id) + # Locked + curr_locks = locksql.get_locks(chat_id) + curr_restr = locksql.get_restr(chat_id) + + if curr_locks: + locked_lock = { + "sticker": curr_locks.sticker, + "audio": curr_locks.audio, + "voice": curr_locks.voice, + "document": curr_locks.document, + "video": curr_locks.video, + "contact": curr_locks.contact, + "photo": curr_locks.photo, + "gif": curr_locks.gif, + "url": curr_locks.url, + "bots": curr_locks.bots, + "forward": curr_locks.forward, + "game": curr_locks.game, + "location": curr_locks.location, + "rtl": curr_locks.rtl, + } + else: + locked_lock = {} + + if curr_restr: + locked_restr = { + "messages": curr_restr.messages, + "media": curr_restr.media, + "other": curr_restr.other, + "previews": curr_restr.preview, + "all": all( + [ + curr_restr.messages, + curr_restr.media, + curr_restr.other, + curr_restr.preview, + ], + ), + } + else: + locked_restr = {} + + locks = {"locks": locked_lock, "restrict": locked_restr} + # Warns (TODO) + # warns = warnssql.get_warns(chat_id) + # Backing up + backup[chat_id] = { + "bot": context.bot.id, + "hashes": { + "info": {"rules": rules}, + "extra": notes, + "blacklist": bl, + "disabled": disabledcmd, + "locks": locks, + }, + } + baccinfo = json.dumps(backup, indent=4) + with open("ExonRobot{}Backup".format(chat_id), "w") as f: + f.write(str(baccinfo)) + context.bot.sendChatAction(current_chat_id, "upload_document") + tgl = time.strftime("%H:%M:%S - %d/%m/%Y", time.localtime(time.time())) + try: + context.bot.sendMessage( + JOIN_LOGGER, + "*sᴜᴄᴄᴇssғᴜʟʟʏ ɪᴍᴘᴏʀᴛᴇᴅ ʙᴀᴄᴋᴜᴘ:*\nᴄʜᴀᴛ: `{}`\nᴄʜᴀᴛ 𝙸𝙳: `{}`\nᴏɴ: `{}`".format( + chat.title, + chat_id, + tgl, + ), + parse_mode=ParseMode.MARKDOWN, + ) + except BadRequest: + pass + context.bot.sendDocument( + current_chat_id, + document=open("ExonRobot{}Backup".format(chat_id), "rb"), + caption="*sᴜᴄᴄᴇssғᴜʟʟʏ ᴇxᴘᴏʀᴛᴇᴅ ʙᴀᴄᴋᴜᴘ:*\nᴄʜᴀᴛ: `{}`\nᴄʜᴀᴛ ɪᴅ: `{}`\nᴏɴ: `{}`\n\nɴᴏᴛᴇ: ᴛʜɪs `ᴇxᴏɴʀᴏʙᴏᴛ-ʙᴀᴄᴋᴜᴘ` ᴡᴀs sᴘᴇᴄɪᴀʟʟʏ ᴍᴀᴅᴇ ғᴏʀ ɴᴏᴛᴇs.".format( + chat.title, + chat_id, + tgl, + ), + timeout=360, + reply_to_message_id=msg.message_id, + parse_mode=ParseMode.MARKDOWN, + ) + os.remove("Exon{}Backup".format(chat_id)) # Cleaning file + + +# Temporary data +def put_chat(chat_id, value, chat_data): + print(chat_data) + status = value is not False + chat_data[chat_id] = {"backups": {"status": status, "value": value}} + + +def get_chat(chat_id, chat_data): + print(chat_data) + try: + return chat_data[chat_id]["backups"] + except KeyError: + return {"status": False, "value": False} + + +__mod_name__ = "𝙱ᴀᴄᴋᴜᴘs" + +__help__ = """ +*ᴏɴʟʏ ғᴏʀ ɢʀᴏᴜᴘ ᴏᴡɴᴇʀ:* + +⍟ /import*:* `ʀᴇᴘʟʏ ᴛᴏ ᴛʜᴇ ʙᴀᴄᴋᴜᴘ ғɪʟᴇ ғᴏʀ ᴛʜᴇ ʙᴜᴛʟᴇʀ / ɢʀᴏᴜᴘ ᴛᴏ ɪᴍᴘᴏʀᴛ ᴀs ᴍᴜᴄʜ ᴀs ᴘᴏssɪʙʟᴇ, ᴍᴀᴋɪɴɢ ᴛʀᴀɴsғᴇʀs ᴠᴇʀʏ ᴇᴀsʏ!` + + **ɴᴏᴛᴇ ᴛʜᴀᴛ ғɪʟᴇs / ᴘʜᴏᴛᴏs ᴄᴀɴɴᴏᴛ ʙᴇ ɪᴍᴘᴏʀᴛᴇᴅ ᴅᴜᴇ ᴛᴏ ᴛᴇʟᴇɢʀᴀᴍ ʀᴇsᴛʀɪᴄᴛɪᴏɴs **. + +⍟ /export*:* `ᴇxᴘᴏʀᴛ ɢʀᴏᴜᴘ ᴅᴀᴛᴀ, ᴡʜɪᴄʜ ᴡɪʟʟ ʙᴇ ᴇxᴘᴏʀᴛᴇᴅ ᴀʀᴇ: ʀᴜʟᴇs, ɴᴏᴛᴇs (ᴅᴏᴄᴜᴍᴇɴᴛs, ɪᴍᴀɢᴇs, ᴍᴜsɪᴄ, ᴠɪᴅᴇᴏ, ᴀᴜᴅɪᴏ, ᴠᴏɪᴄᴇ, ᴛᴇxᴛ, ᴛᴇxᴛ ʙᴜᴛᴛᴏɴs)` +""" + +IMPORT_HANDLER = CommandHandler("import", import_data, run_async=True) +EXPORT_HANDLER = CommandHandler( + "export", export_data, pass_chat_data=True, run_async=True +) + +dispatcher.add_handler(IMPORT_HANDLER) +dispatcher.add_handler(EXPORT_HANDLER) diff --git a/Exon/modules/bans.py b/Exon/modules/bans.py new file mode 100644 index 00000000..f6ef7abe --- /dev/null +++ b/Exon/modules/bans.py @@ -0,0 +1,616 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +from typing import Optional + +from telegram import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + ParseMode, + TelegramError, + Update, +) +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CallbackQueryHandler, CommandHandler, Filters +from telegram.utils.helpers import mention_html + +from Exon import ( + DEMONS, + DEV_USERS, + DRAGONS, + LOGGER, + OWNER_ID, + TIGERS, + WOLVES, + dispatcher, +) +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import ( + bot_admin, + can_delete, + can_restrict, + connection_status, + dev_plus, + is_user_admin, + is_user_ban_protected, + is_user_in_chat, + user_admin, + user_admin_no_reply, + user_can_ban, +) +from Exon.modules.helper_funcs.extraction import extract_user_and_text +from Exon.modules.helper_funcs.filters import CustomFilters +from Exon.modules.helper_funcs.string_handling import extract_time +from Exon.modules.log_channel import gloggable, loggable + + +@connection_status +@bot_admin +@can_restrict +@user_admin +@user_can_ban +@loggable +def ban(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + log_message = "" + bot = context.bot + args = context.args + reason = "" + if message.reply_to_message and message.reply_to_message.sender_chat: + if r := bot.ban_chat_sender_chat( + chat_id=chat.id, + sender_chat_id=message.reply_to_message.sender_chat.id, + ): + message.reply_text( + f"ᴄʜᴀɴɴᴇʟ {html.escape(message.reply_to_message.sender_chat.title)} ᴡᴀs ʙᴀɴɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ ғʀᴏᴍ {html.escape(chat.title)}", + parse_mode="html", + ) + + else: + message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ʙᴀɴ ᴄʜᴀɴɴᴇʟ") + return + user_id, reason = extract_user_and_text(message, args) + if not user_id: + message.reply_text("⚠️ ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ.") + return log_message + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message != "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text("ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴘᴇʀsᴏɴ.") + return log_message + if user_id == bot.id: + message.reply_text("ᴏʜ ʏᴇᴀʜ, ʙᴀɴ ᴍʏsᴇʟғ, ɴᴏᴏʙ sᴀʟᴀ!") + return log_message + if is_user_ban_protected(chat, user_id, member) and user not in DEV_USERS: + if user_id == OWNER_ID: + message.reply_text("ᴛʀʏɪɴɢ ᴛᴏ ᴘᴜᴛ ᴍᴇ ᴀɢᴀɪɴsᴛ ᴍʏ ᴏɴɪᴄʜᴀɴ ʜᴜʜ?") + elif user_id in DEV_USERS: + message.reply_text("I ᴄᴀɴ'ᴛ ᴀᴄᴛ ᴀɢᴀɪɴsᴛ ᴏᴜʀ ғᴀᴍɪʟʏ.") + elif user_id in DRAGONS: + message.reply_text( + "ғɪɢʜᴛɪɴɢ ᴏᴜʀ ʙᴇsᴛ ғʀɪᴇɴᴅs ʜᴇʀᴇ ᴡɪʟʟ ᴘᴜᴛ ᴜsᴇʀ ʟɪᴠᴇs ᴀᴛ risk." + ) + elif user_id in DEMONS: + message.reply_text("ʙʀɪɴɢ ᴀɴ ᴏʀᴅᴇʀ ғʀᴏᴍ ᴏɴɪᴄʜᴀɴ ᴛᴏ ғɪɢʜᴛ ᴏᴜʀ ғʀɪᴇɴᴅs.") + elif user_id in TIGERS: + message.reply_text("ʙʀɪɴɢ ᴀɴ ᴏʀᴅᴇʀ ғʀᴏᴍ ᴏɴɪᴄʜᴀɴ ᴛᴏ ғɪɢʜᴛ ᴏᴜʀ ᴄʟᴀssᴍᴀᴛᴇs") + elif user_id in WOLVES: + message.reply_text("ɪɢɴɪᴛᴇ ᴀᴄᴄᴇss ᴍᴀᴋᴇ ᴛʜᴇᴍ ʙᴀɴ ɪᴍᴍᴜɴᴇ!") + else: + message.reply_text("⚠️ ᴄᴀɴɴᴏᴛ ʙᴀɴɴᴇᴅ ᴀᴅᴍɪɴ.") + return log_message + if message.text.startswith("/s"): + silent = True + if not can_delete(chat, context.bot.id): + return "" + else: + silent = False + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#{'S' if silent else ''}ʙᴀɴɴᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}" + ) + if reason: + log += f"<b>ʀᴇᴀsᴏɴ:</b> {reason}" + try: + chat.ban_member(user_id) + if silent: + if message.reply_to_message: + message.reply_to_message.delete() + message.delete() + return log + # bot.send_sticker(chat.id, BAN_STICKER) # banhammer marie sticker + reply = ( + f"<code>❕</code><b>Ban Event</b>\n\n" + f"<b>• ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}\n" + f"<b>• ᴜsᴇʀ 𝙸𝙳:</b> <code>{member.user.id}</code>\n" + f"<b>• ʙᴀɴɴᴇᴅ ʙʏ:</b> {mention_html(user.id, html.escape(user.first_name))}" + ) + if reason: + reply += f"\n<b>• ʀᴇᴀsᴏɴ:</b> {html.escape(reason)}" + bot.sendMessage( + chat.id, + reply, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴜɴʙᴀɴ ❗", callback_data=f"unbanb_unban={user_id}" + ), + InlineKeyboardButton( + text="ᴅᴇʟᴇᴛᴇ ❗", callback_data="unbanb_del" + ), + ] + ] + ), + parse_mode=ParseMode.HTML, + ) + return log + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + if silent: + return log + message.reply_text("ʙᴀɴɴᴇᴅ ❗!", quote=False) + return log + else: + LOGGER.warning(update) + LOGGER.exception( + "ERROR ʙᴀɴɴɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴜʜᴍ...ᴛʜᴀᴛ ᴅɪᴅɴ'ᴛ ᴡᴏʀᴋ...") + return log_message + + +@connection_status +@bot_admin +@can_restrict +@user_admin +@user_can_ban +@loggable +def temp_ban(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + log_message = "" + bot, args = context.bot, context.args + user_id, reason = extract_user_and_text(message, args) + if not user_id: + message.reply_text("⚠️ ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ.") + return log_message + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message != "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return log_message + if user_id == bot.id: + message.reply_text("I'ᴍ ɴᴏᴛ ɢᴏɴɴᴀ BAN ᴍʏsᴇʟғ, ᴀʀᴇ ʏᴏᴜ ɴᴏᴏʙ ?") + return log_message + if is_user_ban_protected(chat, user_id, member): + message.reply_text("I ᴅᴏɴ'ᴛ ғᴇᴇʟ ʟɪᴋᴇ ɪᴛ.") + return log_message + if not reason: + message.reply_text("ʏᴏᴜ ʜᴀᴠᴇɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴀ ᴛɪᴍᴇ ᴛᴏ ʙᴀɴ ᴛʜɪs ᴜsᴇʀ ғᴏʀ!") + return log_message + split_reason = reason.split(None, 1) + time_val = split_reason[0].lower() + reason = split_reason[1] if len(split_reason) > 1 else "" + bantime = extract_time(message, time_val) + if not bantime: + return log_message + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + "#ᴛᴇᴍᴘ ʙᴀɴɴᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}\n" + f"<b>ᴛɪᴍᴇ:</b> {time_val}" + ) + if reason: + log += f"\nʀᴇᴀsᴏɴ: {reason}" + try: + chat.ban_member(user_id, until_date=bantime) + # bot.send_sticker(chat.id, BAN_STICKER) # banhammer marie sticker + reply_msg = ( + f"<code>❕</code><b>Temporarily Banned</b>\n\n" + f"<b>• ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}\n" + f"<b>• ᴜsᴇʀ ɪᴅ:</b> <code>{member.user.id}</code>\n" + f"<b>• ʙᴀɴɴᴇᴅ ғᴏʀ:</b> {time_val}\n" + f"<b>• ʙᴀɴɴᴇᴅ ʙʏ:</b> {mention_html(user.id, html.escape(user.first_name))}" + ) + if reason: + reply_msg += f"\n<b>• ʀᴇᴀsᴏɴ:</b> {html.escape(reason)}" + bot.sendMessage( + chat.id, + reply_msg, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴜɴʙᴀɴ ❗", callback_data=f"unbanb_unban={user_id}" + ), + InlineKeyboardButton( + text="ᴅᴇʟᴇᴛᴇ ❗", callback_data="unbanb_del" + ), + ] + ] + ), + parse_mode=ParseMode.HTML, + ) + return log + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text( + f"{mention_html(member.user.id, html.escape(member.user.first_name))} [<code>{member.user.id}</code>] ʙᴀɴɴᴇᴅ ғᴏʀ {time_val}.", + quote=False, + ) + return log + else: + LOGGER.warning(update) + LOGGER.exception( + "ᴇʀʀᴏʀ ʙᴀɴɴɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, ɪ ᴄᴀɴ'ᴛ ʙᴀɴ ᴛʜᴀᴛ ᴜsᴇʀ.") + return log_message + + +@connection_status +@bot_admin +@can_restrict +@user_admin_no_reply +@user_can_ban +@loggable +def unbanb_btn(update: Update, context: CallbackContext) -> str: + bot = context.bot + query = update.callback_query + chat = update.effective_chat + user = update.effective_user + if query.data != "unbanb_del": + splitter = query.data.split("=") + query_match = splitter[0] + if query_match == "unbanb_unban": + user_id = splitter[1] + if not is_user_admin(chat, int(user.id)): + bot.answer_callback_query( + query.id, + text="⚠️ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ᴜɴᴍᴜᴛᴇ ᴘᴇᴏᴘʟᴇ", + show_alert=True, + ) + return "" + try: + member = chat.get_member(user_id) + except BadRequest: + pass + chat.unban_member(user_id) + query.message.edit_text( + f"{mention_html(member.user.id, html.escape(member.user.first_name))} [<code>{member.user.id}</code>] ᴜɴʙᴀɴɴᴇᴅ ʙʏ {mention_html(user.id, html.escape(user.first_name))}", + parse_mode=ParseMode.HTML, + ) + bot.answer_callback_query(query.id, text="Unbanned!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴʙᴀɴɴᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + else: + if not is_user_admin(chat, int(user.id)): + bot.answer_callback_query( + query.id, + text="⚠️ ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴛʜɪs ᴍᴇssᴀɢᴇ.", + show_alert=True, + ) + return "" + query.message.delete() + bot.answer_callback_query(query.id, text="ᴅᴇʟᴇᴛᴇᴅ !") + return "" + + +@connection_status +@bot_admin +@can_restrict +@user_admin +@user_can_ban +@loggable +def punch(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + log_message = "" + bot, args = context.bot, context.args + user_id, reason = extract_user_and_text(message, args) + if not user_id: + message.reply_text("⚠️ ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ") + return log_message + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message != "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text("⚠️ I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return log_message + if user_id == bot.id: + message.reply_text("ʏᴇᴀʜʜʜ I'ᴍ ɴᴏᴛ ɢᴏɴɴᴀ ᴅᴏ ᴛʜᴀᴛ.") + return log_message + if is_user_ban_protected(chat, user_id): + message.reply_text("I ʀᴇᴀʟʟʏ ᴡɪsʜ ɪ ᴄᴏᴜʟᴅ ᴘᴜɴᴄʜ ᴛʜɪs ᴜsᴇʀ....") + return log_message + if res := chat.unban_member(user_id): + # bot.send_sticker(chat.id, BAN_STICKER) # banhammer marie sticker + bot.sendMessage( + chat.id, + f"{mention_html(member.user.id, html.escape(member.user.first_name))} [<code>{member.user.id}</code>] Kicked by {mention_html(user.id, html.escape(user.first_name))}", + parse_mode=ParseMode.HTML, + ) + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴋɪᴄᴋᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}" + ) + if reason: + log += f"\n<b>ʀᴇᴀsᴏɴ:</b> {reason}" + return log + else: + message.reply_text("⚠️ ᴡᴇʟʟ ᴅᴀᴍɴ, ɪ ᴄᴀɴ'ᴛ ᴘᴜɴᴄʜ ᴛʜᴀᴛ ᴜsᴇʀ.") + return log_message + + +@bot_admin +@can_restrict +def punchme(update: Update, context: CallbackContext): + user_id = update.effective_message.from_user.id + if is_user_admin(update.effective_chat, user_id): + update.effective_message.reply_text("I ᴡɪsʜ I ᴄᴏᴜʟᴅ... ʙᴜᴛ ʏᴏᴜ'ʀᴇ ᴀɴ ᴀᴅᴍɪɴ .") + return + if res := update.effective_chat.unban_member(user_id): + update.effective_message.reply_text( + "ᴘᴜɴᴄʜᴇs ʏᴏᴜ ᴏᴜᴛ ᴏғ ᴛʜᴇ ɢʀᴏᴜᴘ !!", + ) + else: + update.effective_message.reply_text("ʜᴜʜ? I ᴄᴀɴ'ᴛ :/") + + +@connection_status +@bot_admin +@can_restrict +@user_admin +@user_can_ban +@loggable +def unban(update: Update, context: CallbackContext) -> Optional[str]: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + log_message = "" + bot, args = context.bot, context.args + if message.reply_to_message and message.reply_to_message.sender_chat: + if r := bot.unban_chat_sender_chat( + chat_id=chat.id, + sender_chat_id=message.reply_to_message.sender_chat.id, + ): + message.reply_text( + f"ᴄʜᴀɴɴᴇʟ {html.escape(message.reply_to_message.sender_chat.title)} ᴡᴀs ᴜɴʙᴀɴɴᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ ғʀᴏᴍ {html.escape(chat.title)}", + parse_mode="html", + ) + + else: + message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ᴜɴʙᴀɴ ᴄʜᴀɴɴᴇʟ") + return + user_id, reason = extract_user_and_text(message, args) + if not user_id: + message.reply_text("⚠️ ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ.") + return log_message + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message != "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return log_message + if user_id == bot.id: + message.reply_text("ʜᴏᴡ ᴡᴏᴜʟᴅ ɪ ᴜɴʙᴀɴ ᴍʏsᴇʟғ ɪғ ɪ ᴡᴀsɴ'ᴛ ʜᴇʀᴇ...?") + return log_message + if is_user_in_chat(chat, user_id): + message.reply_text("⚠️ ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ.") + return log_message + chat.unban_member(user_id) + message.reply_text( + f"{mention_html(member.user.id, html.escape(member.user.first_name))} [<code>{member.user.id}</code>] ᴡᴀs ᴜɴʙᴀɴɴᴇᴅ ʙʏ {mention_html(user.id, user.first_name)}", + parse_mode=ParseMode.HTML, + ) + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴʙᴀɴɴᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}" + ) + if reason: + log += f"\n<b>ʀᴇᴀsᴏɴ:</b> {reason}" + return log + + +@connection_status +@bot_admin +@can_restrict +@gloggable +def selfunban(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + bot, args = context.bot, context.args + if user.id not in DRAGONS or user.id not in TIGERS: + return + try: + chat_id = int(args[0]) + except: + message.reply_text("ɢɪᴠᴇ ᴀ ᴠᴀʟɪᴅ ᴄʜᴀᴛ ɪᴅ.") + return + chat = bot.getChat(chat_id) + try: + member = chat.get_member(user.id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return + else: + raise + if is_user_in_chat(chat, user.id): + message.reply_text("Aren't you already in the chat??") + return + chat.unban_member(user.id) + message.reply_text(f"ʏᴇᴘ, ɪ ʜᴀᴠᴇ ᴜɴʙᴀɴɴᴇᴅ ᴛʜᴇ ᴜsᴇʀ.") + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴʙᴀɴɴᴇᴅ\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, html.escape(member.user.first_name))}" + ) + return log + + +@bot_admin +@can_restrict +@loggable +def banme(update: Update, context: CallbackContext): + user_id = update.effective_message.from_user.id + chat = update.effective_chat + user = update.effective_user + if is_user_admin(update.effective_chat, user_id): + update.effective_message.reply_text("⚠️ I ᴄᴀɴɴᴏᴛ ʙᴀɴɴᴇᴅ ᴀᴅᴍɪɴ.") + return + if res := update.effective_chat.ban_member(user_id): + update.effective_message.reply_text("ʏᴇs, ʏᴏᴜ'ʀᴇ ʀɪɢʜᴛ! ɢᴛғᴏ..") + return f"<b>{html.escape(chat.title)}:</b>\n#ʙᴀɴᴍᴇ\n<b>ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n<b>ɪᴅ:</b> <code>{user_id}</code>" + + else: + update.effective_message.reply_text("Huh? I can't :/") + + +@dev_plus +def abishnoi(update: Update, context: CallbackContext): + args = context.args + bot = context.bot + try: + chat_id = str(args[0]) + del args[0] + except TypeError: + update.effective_message.reply_text("ᴘʟᴇᴀsᴇ ɢɪᴠᴇ ᴍᴇ ᴀ ᴄʜᴀᴛ ᴛᴏ ᴇᴄʜᴏ ᴛᴏ!") + to_send = " ".join(args) + if len(to_send) >= 2: + try: + bot.sendMessage(int(chat_id), to_send) + except TelegramError: + LOGGER.warning("ᴄᴏᴜʟᴅɴ'ᴛ sᴇɴᴅ ᴛᴏ ɢʀᴏᴜᴘ %s", chat_id) + update.effective_message.reply_text( + "ᴄᴏᴜʟᴅɴ'ᴛ sᴇɴᴅ ᴛʜᴇ ᴍᴇssᴀɢᴇ. ᴘᴇʀʜᴀᴘs ɪ'ᴍ ɴᴏᴛ ᴘᴀʀᴛ ᴏғ ᴛʜᴀᴛ ɢʀᴏᴜᴘ?" + ) + + +__help__ = """ +*ᴜsᴇʀ ᴄᴏᴍᴍᴀɴᴅs:* + +• /kickme*:* `ᴋɪᴄᴋs ᴛʜᴇ ᴜsᴇʀ ᴡʜᴏ ɪssᴜᴇᴅ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ` + +• /banme*:* `ʙᴀɴs ᴛʜᴇ ᴜsᴇʀ ᴡʜᴏ ɪssᴜᴇᴅ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ` + +*ᴀᴅᴍɪɴs ᴏɴʟʏ:* + +• /ban <userhandle>*:*` ʙᴀɴs ᴀ ᴜsᴇʀ. (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ ` +) +• /sban <ᴜsᴇʀʜᴀɴᴅʟᴇ>*:* `sɪʟᴇɴᴛʟʏ ʙᴀɴ ᴀ ᴜsᴇʀ. ᴅᴇʟᴇᴛᴇs ᴄᴏᴍᴍᴀɴᴅ, ʀᴇᴘʟɪᴇᴅ ᴍᴇssᴀɢᴇ ᴀɴᴅ ᴅᴏᴇsɴ'ᴛ ʀᴇᴘʟʏ. (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ)` + +• /tban <ᴜsᴇʀʜᴀɴᴅʟᴇ> x(m/h/d)*:* `ʙᴀɴs ᴀ ᴜsᴇʀ ғᴏʀ x ᴛɪᴍᴇ. (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ). ᴍ = ᴍɪɴᴜᴛᴇs, h = ʜᴏᴜʀs, d = ᴅᴀʏs.` + +• /unban <userhandle>*:* `ᴜɴʙᴀɴs ᴀ ᴜsᴇʀ. (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ )` + +• /kick <userhandle>*:* `ᴋɪᴄᴋs ᴀ ᴜsᴇʀ ᴏᴜᴛ ᴏғ ᴛʜᴇ ɢʀᴏᴜᴘ, (via ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ)` + +• /mute <userhandle>*:* `sɪʟᴇɴᴄᴇs ᴀ ᴜsᴇʀ. ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ, ᴍᴜᴛɪɴɢ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴜsᴇʀ.` + +• /tmute <userhandle> x(m/h/d)*:* `ᴍᴜᴛᴇs a ᴜsᴇʀᴛ for x ᴛɪᴍᴇ. (ᴠɪᴀ ʜᴀɴᴅʟᴇ, ᴏʀ ʀᴇᴘʟʏ). ᴍ = ᴍɪɴᴜᴛᴇs, h = ʜᴏᴜʀs, d = ᴅᴀʏs ` +. +• /unmute <userhandle>*:* `ᴜɴᴍᴜᴛᴇs ᴀ ~ user. ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs a ʀᴇᴘʟʏ, ᴍᴜᴛɪɴɢ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ ᴜsᴇʀ ` +. +• /zombies*:* `sᴇᴀʀᴄʜᴇs ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛ ` + +• /zombies clean*:* `ʀᴇᴍᴏᴠᴇs ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs ғʀᴏᴍ ᴛʜᴇ ɢʀᴏᴜᴘ ` +. +• /abishnoi <chatid> <ᴍsɢ>*:* `ᴍᴀᴋᴇ ᴍᴇ sᴇɴᴅ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ ᴀ sᴘᴇᴄɪғɪᴄ ᴄʜᴀᴛ `. +""" + +__mod_name__ = "𝙱ᴀɴs" + +BAN_HANDLER = CommandHandler(["ban", "sban"], ban, run_async=True) +TEMPBAN_HANDLER = CommandHandler(["tban"], temp_ban, run_async=True) +KICK_HANDLER = CommandHandler(["kick", "punch"], punch, run_async=True) +UNBAN_HANDLER = CommandHandler("unban", unban, run_async=True) +##ROAR_HANDLER = CommandHandler("roar", selfunban, run_async=True) +UNBAN_BUTTON_HANDLER = CallbackQueryHandler(unbanb_btn, pattern=r"unbanb_") +KICKME_HANDLER = DisableAbleCommandHandler( + ["kickme", "punchme"], punchme, filters=Filters.chat_type.groups, run_async=True +) +ABISHNOI_HANDLER = CommandHandler( + "abishnoi", + abishnoi, + pass_args=True, + filters=CustomFilters.sudo_filter, + run_async=True, +) +BANME_HANDLER = CommandHandler("banme", banme, run_async=True) + +dispatcher.add_handler(BAN_HANDLER) +dispatcher.add_handler(TEMPBAN_HANDLER) +dispatcher.add_handler(KICK_HANDLER) +dispatcher.add_handler(UNBAN_HANDLER) +# dispatcher.add_handler(ROAR_HANDLER) +dispatcher.add_handler(KICKME_HANDLER) +dispatcher.add_handler(UNBAN_BUTTON_HANDLER) +dispatcher.add_handler(ABISHNOI_HANDLER) +dispatcher.add_handler(BANME_HANDLER) + +__handlers__ = [ + BAN_HANDLER, + TEMPBAN_HANDLER, + KICK_HANDLER, + UNBAN_HANDLER, + # ROAR_HANDLER, + KICKME_HANDLER, + UNBAN_BUTTON_HANDLER, + ABISHNOI_HANDLER, + BANME_HANDLER, +] diff --git a/Exon/modules/blacklist.py b/Exon/modules/blacklist.py new file mode 100644 index 00000000..d775e466 --- /dev/null +++ b/Exon/modules/blacklist.py @@ -0,0 +1,508 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import re + +from telegram import ChatPermissions, ParseMode +from telegram.error import BadRequest +from telegram.ext import CommandHandler, Filters, MessageHandler +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.blacklist_sql as sql +from Exon import LOGGER, dispatcher +from Exon.modules.connection import connected +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_message, typing_action +from Exon.modules.helper_funcs.chat_status import user_admin, user_not_admin +from Exon.modules.helper_funcs.extraction import extract_text +from Exon.modules.helper_funcs.misc import split_message +from Exon.modules.helper_funcs.string_handling import extract_time +from Exon.modules.log_channel import loggable +from Exon.modules.sql.approve_sql import is_approved +from Exon.modules.warns import warn + +BLACKLIST_GROUP = 11 + + +@user_admin +@typing_action +def blacklist(update, context): + chat = update.effective_chat + user = update.effective_user + args = context.args + + if conn := connected(context.bot, update, chat, user.id, need_admin=False): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if chat.type == "private": + return + chat_id = update.effective_chat.id + chat_name = chat.title + + filter_list = f"ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs ɪɴ <b>{chat_name}</b>:\n" + + all_blacklisted = sql.get_chat_blacklist(chat_id) + + if len(args) > 0 and args[0].lower() == "copy": + for trigger in all_blacklisted: + filter_list += f"<code>{html.escape(trigger)}</code>\n" + else: + for trigger in all_blacklisted: + filter_list += f" - <code>{html.escape(trigger)}</code>\n" + + # for trigger in all_blacklisted: + # filter_list += " - <code>{}</code>\n".format(html.escape(trigger)) + + split_text = split_message(filter_list) + for text in split_text: + if ( + filter_list + == f"ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs ɪɴ <b>{html.escape(chat_name)}</b>:\n" + ): + send_message( + update.effective_message, + f"ɴᴏ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + return + send_message(update.effective_message, text, parse_mode=ParseMode.HTML) + + +@user_admin +@typing_action +def add_blacklist(update, context): + msg = update.effective_message + chat = update.effective_chat + user = update.effective_user + words = msg.text.split(None, 1) + + if conn := connected(context.bot, update, chat, user.id): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + if chat.type == "private": + return + chat_name = chat.title + + if len(words) > 1: + text = words[1] + to_blacklist = list( + {trigger.strip() for trigger in text.split("\n") if trigger.strip()} + ) + for trigger in to_blacklist: + sql.add_to_blacklist(chat_id, trigger.lower()) + + if len(to_blacklist) == 1: + send_message( + update.effective_message, + f"ᴀᴅᴅᴇᴅ ʙʟᴀᴄᴋʟɪsᴛ <code>{html.escape(to_blacklist[0])}</code> ɪɴ ᴄʜᴀᴛ: <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + f"ᴀᴅᴅᴇᴅ ʙʟᴀᴄᴋʟɪsᴛ ᴛʀɪɢɢᴇʀ: <code>{len(to_blacklist)}</code> ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + "ᴛᴇʟʟ ᴍᴇ ᴡʜɪᴄʜ ᴡᴏʀᴅs ʏᴏᴜ ᴡᴏᴜʟᴅ ʟɪᴋᴇ ᴛᴏ ᴀᴅᴅ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ.", + ) + + +@user_admin +@typing_action +def unblacklist(update, context): + msg = update.effective_message + chat = update.effective_chat + user = update.effective_user + words = msg.text.split(None, 1) + + if conn := connected(context.bot, update, chat, user.id): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + if chat.type == "private": + return + chat_name = chat.title + + if len(words) > 1: + text = words[1] + to_unblacklist = list( + {trigger.strip() for trigger in text.split("\n") if trigger.strip()} + ) + successful = 0 + for trigger in to_unblacklist: + success = sql.rm_from_blacklist(chat_id, trigger.lower()) + if success: + successful += 1 + + if len(to_unblacklist) == 1: + if successful: + send_message( + update.effective_message, + f"ʀᴇᴍᴏᴠᴇᴅ <code>{html.escape(to_unblacklist[0])}</code> ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, "ᴛʜɪs ɪs ɴᴏᴛ ᴀ ʙʟᴀᴄᴋʟɪsᴛ ᴛʀɪɢɢᴇʀ!" + ) + + elif successful == len(to_unblacklist): + send_message( + update.effective_message, + f"ʀᴇᴍᴏᴠᴇᴅ <code>{successful}</code> ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + elif not successful: + send_message( + update.effective_message, + "ɴᴏɴᴇ ᴏғ ᴛʜᴇsᴇ ᴛʀɪɢɢᴇʀs ᴇxɪsᴛ sᴏ ɪᴛ ᴄᴀɴ'ᴛ ʙᴇ ʀᴇᴍᴏᴠᴇᴅ.".format( + successful, len(to_unblacklist) - successful + ), + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + f"ʀᴇᴍᴏᴠᴇᴅ <code>{successful}</code> ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ. {len(to_unblacklist) - successful} ᴅɪᴅ ɴᴏᴛ ᴇxɪsᴛ, sᴏ ᴡᴇʀᴇ ɴᴏᴛ ʀᴇᴍᴏᴠᴇᴅ.", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + "ᴛᴇʟʟ ᴍᴇ ᴡʜɪᴄʜ ᴡᴏʀᴅs ʏᴏᴜ ᴡᴏᴜʟᴅ ʟɪᴋᴇ ᴛᴏ ʀᴇᴍᴏᴠᴇ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ!", + ) + + +@loggable +@user_admin +@typing_action +def blacklist_mode(update, context): + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + args = context.args + + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ᴄᴀɴ ʙᴇ ᴏɴʟʏ ᴜsᴇᴅ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ ᴘᴍ", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + + if args: + if args[0].lower() in ("off", "nothing", "no"): + settypeblacklist = "ᴅᴏ ɴᴏᴛʜɪɴɢ" + sql.set_blacklist_strength(chat_id, 0, "0") + elif args[0].lower() in ("del", "delete"): + settypeblacklist = "ᴡɪʟʟ ᴅᴇʟᴇᴛᴇ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴍᴇssᴀɢᴇ" + sql.set_blacklist_strength(chat_id, 1, "0") + elif args[0].lower() == "warn": + settypeblacklist = "ᴡᴀʀɴ ᴛʜᴇ sᴇɴᴅᴇʀ" + sql.set_blacklist_strength(chat_id, 2, "0") + elif args[0].lower() == "mute": + settypeblacklist = "ᴍᴜᴛᴇ ᴛʜᴇ sᴇɴᴅᴇʀ" + sql.set_blacklist_strength(chat_id, 3, "0") + elif args[0].lower() == "kick": + settypeblacklist = "ᴋɪᴄᴋ ᴛʜᴇ sᴇɴᴅᴇʀ" + sql.set_blacklist_strength(chat_id, 4, "0") + elif args[0].lower() == "ban": + settypeblacklist = "ʙᴀɴ ᴛʜᴇ sᴇɴᴅᴇʀ" + sql.set_blacklist_strength(chat_id, 5, "0") + elif args[0].lower() == "tban": + if len(args) == 1: + teks = """ɪᴛ ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ ғᴏʀ ʙʟᴀᴄᴋʟɪsᴛ ʙᴜᴛ ʏᴏᴜ ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴛɪᴍᴇ; ᴛʀʏ :, `/blacklistmode tban <timevalue>`. + + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4ᴍ = 4 ᴍɪɴᴜᴛᴇs, 3ʜ = 3 ʜᴏᴜʀs, 6ᴅ = 6 ᴅᴀʏs, 5ᴡ = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return "" + restime = extract_time(msg, args[1]) + if not restime: + teks = """ɪɴᴠᴀʟɪᴅ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ! + ᴇxᴀᴍᴘʟᴇ ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4ᴍ = 4 ᴍɪɴᴜᴛᴇs, 3ʜ = 3 ʜᴏᴜʀs, 6ᴅ = 6 ᴅᴀʏs, 5ᴡ = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return "" + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ʙᴀɴ ғᴏʀ {args[1]}" + sql.set_blacklist_strength(chat_id, 6, str(args[1])) + elif args[0].lower() == "tmute": + if len(args) == 1: + teks = """It ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ ғᴏʀ ʙʟᴀᴄᴋʟɪsᴛ ʙᴜᴛ ʏᴏᴜ ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴛɪᴍᴇ; ᴛʀʏ, `/blacklistmode tmute <timevalue>`. + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4m = 4 ᴍɪɴᴜᴛᴇs, 3h = 3 ʜᴏᴜʀs, 6d = 6 ᴅᴀʏs, 5w = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return "" + restime = extract_time(msg, args[1]) + if not restime: + teks = """ɪɴᴠᴀʟɪᴅ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ! + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇ: 4ᴍ = 4 ᴍɪɴᴜᴛᴇs, 3ʜ = 3 ʜᴏᴜʀs, 6ᴅ = 6 ᴅᴀʏs, 5w = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return "" + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ᴍᴜᴛᴇ ғᴏʀ {args[1]}" + sql.set_blacklist_strength(chat_id, 7, str(args[1])) + else: + send_message( + update.effective_message, + "I ᴏɴʟʏ ᴜɴᴅᴇʀsᴛᴀɴᴅ: off/del/warn/ban/kick/mute/tban/tmute!", + ) + return "" + if conn: + text = f"ᴄʜᴀɴɢᴇᴅ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴏᴅᴇ: `{settypeblacklist}` in *{chat_name}*!" + else: + text = f"ᴄʜᴀɴɢᴇᴅ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴏᴅᴇ: `{settypeblacklist}`!" + send_message(update.effective_message, text, parse_mode="markdown") + return f"<b>{html.escape(chat.title)}:</b>\n<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\nᴄʜᴀɴɢᴇᴅ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴏᴅᴇ. ᴡɪʟʟ {settypeblacklist}." + + getmode, getvalue = sql.get_blacklist_setting(chat.id) + if getmode == 0: + settypeblacklist = "ᴅᴏ ɴᴏᴛʜɪɴɢ" + elif getmode == 1: + settypeblacklist = "ᴅᴇʟᴇᴛᴇ" + elif getmode == 2: + settypeblacklist = "ᴡᴀʀɴ" + elif getmode == 3: + settypeblacklist = "ᴍᴜᴛᴇ" + elif getmode == 4: + settypeblacklist = "ᴋɪᴄᴋ" + elif getmode == 5: + settypeblacklist = "ʙᴀɴ" + elif getmode == 6: + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ʙᴀɴ ғᴏʀ {getvalue}" + elif getmode == 7: + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ᴍᴜᴛᴇ ғᴏʀ {getvalue}" + if conn: + text = f"ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪsᴛᴍᴏᴅᴇ: *{settypeblacklist}* in *{chat_name}*." + else: + text = f"ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪsᴛᴍᴏᴅᴇ: *{settypeblacklist}*." + send_message(update.effective_message, text, parse_mode=ParseMode.MARKDOWN) + return "" + + +def findall(p, s): + i = s.find(p) + while i != -1: + yield i + i = s.find(p, i + 1) + + +@user_not_admin +def del_blacklist(update, context): + chat = update.effective_chat + message = update.effective_message + user = update.effective_user + bot = context.bot + to_match = extract_text(message) + + if not to_match: + return + + if is_approved(chat.id, user.id): + return + + getmode, value = sql.get_blacklist_setting(chat.id) + + chat_filters = sql.get_chat_blacklist(chat.id) + for trigger in chat_filters: + pattern = r"( |^|[^\w])" + re.escape(trigger) + r"( |$|[^\w])" + if re.search(pattern, to_match, flags=re.IGNORECASE): + try: + if getmode == 0: + return + if getmode == 1: + message.delete() + elif getmode == 2: + message.delete() + warn( + update.effective_user, + chat, + f"ᴜsɪɴɢ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴛʀɪɢɢᴇʀ: {trigger}", + message, + update.effective_user, + ) + + return + elif getmode == 3: + message.delete() + bot.restrict_chat_member( + chat.id, + update.effective_user.id, + permissions=ChatPermissions(can_send_messages=False), + ) + bot.sendMessage( + chat.id, + f"ᴍᴜᴛᴇᴅ {user.first_name} ғᴏʀ ᴜsɪɴɢ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅ: {trigger}!", + ) + return + elif getmode == 4: + message.delete() + if res := chat.unban_member(update.effective_user.id): + bot.sendMessage( + chat.id, + f"ᴋɪᴄᴋᴇᴅ {user.first_name} ғᴏʀ ᴜsɪɴɢ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅ: {trigger}!", + ) + return + elif getmode == 5: + message.delete() + chat.ban_member(user.id) + bot.sendMessage( + chat.id, + f"ʙᴀɴɴᴇᴅ {user.first_name} ғᴏʀ ᴜsɪɴɢ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅ: {trigger}", + ) + return + elif getmode == 6: + message.delete() + bantime = extract_time(message, value) + chat.ban_member(user.id, until_date=bantime) + bot.sendMessage( + chat.id, + f"ʙᴀɴɴᴇᴅ {user.first_name} ᴜɴᴛɪʟ '{value}' ғᴏʀ ᴜsɪɴɢ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅ: {trigger}!", + ) + return + elif getmode == 7: + message.delete() + mutetime = extract_time(message, value) + bot.restrict_chat_member( + chat.id, + user.id, + until_date=mutetime, + permissions=ChatPermissions(can_send_messages=False), + ) + bot.sendMessage( + chat.id, + f"ᴍᴜᴛᴇᴅ {user.first_name} ᴜɴᴛɪʟ '{value}' for using Blacklisted word: {trigger}!", + ) + return + except BadRequest as excp: + if excp.message != "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ not ғᴏᴜɴᴅ": + LOGGER.exception("ᴇʀʀᴏʀ ᴡʜɪʟᴇ ᴅᴇʟᴇᴛɪɴɢ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴇssᴀɢᴇ.") + break + + +def __import_data__(chat_id, data): + # set chat blacklist + blacklist = data.get("blacklist", {}) + for trigger in blacklist: + sql.add_to_blacklist(chat_id, trigger) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + blacklisted = sql.num_blacklist_chat_filters(chat_id) + return f"ᴛʜᴇʀᴇ ᴀʀᴇ {blacklisted} ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs." + + +def __stats__(): + return f"⍟ {sql.num_blacklist_filters()} ʙʟᴀᴄᴋʟɪsᴛ ᴛʀɪɢɢᴇʀs, ᴀᴄʀᴏss {sql.num_blacklist_filter_chats()} ᴄʜᴀᴛs." + + +__mod_name__ = "𝙱ʟᴀᴄᴋʟɪsᴛs" + +__help__ = """ + +*ʙʟᴀᴄᴋʟɪꜱᴛꜱ ᴀʀᴇ ᴜꜱᴇᴅ ᴛᴏ ꜱᴛᴏᴘ ᴄᴇʀᴛᴀɪɴ ᴛʀɪɢɢᴇʀꜱ ғʀᴏᴍ ʙᴇɪɴɢ ꜱᴀɪᴅ ɪɴ ᴀ ɢʀᴏᴜᴘ. ᴀɴʏ ᴛɪᴍᴇ ᴛʜᴇ ᴛʀɪɢɢᴇʀ ɪꜱ ᴍᴇɴᴛɪᴏɴᴇᴅ, ᴛʜᴇ ᴍᴇꜱꜱᴀɢᴇ ᴡɪʟʟ ɪᴍᴍᴇᴅɪᴀᴛᴇʟʏ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ. ᴀ ɢᴏᴏᴅ ᴄᴏᴍʙᴏ ɪs sᴏᴍᴇᴛɪᴍᴇs ᴛᴏ ᴘᴀɪʀ ᴛʜɪs ᴜᴘ ᴡɪᴛʜ ᴡᴀʀɴ ғɪʟᴛᴇʀs!* + +*ɴᴏᴛᴇ*: `ʙʟᴀᴄᴋʟɪsᴛs ᴅᴏ ɴᴏᴛ ᴀғғᴇᴄᴛ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴs.` + +✪ /blacklist*:* `ᴠɪᴇᴡ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs.` + +*ᴀᴅᴍɪɴ ᴏɴʟʏ:* +✪ /addblacklist <ᴛʀɪɢɢᴇʀs>*:* `ᴀᴅᴅ ᴀ ᴛʀɪɢɢᴇʀ ᴛᴏ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ. ᴇᴀᴄʜ ʟɪɴᴇ is ᴄᴏɴsɪᴅᴇʀᴇᴅ ᴏɴᴇ ᴛʀɪɢɢᴇʀ, sᴏ ᴜsɪɴɢ ᴅɪғғᴇʀᴇɴᴛ ʟɪɴᴇs ᴡɪʟʟ ᴀʟʟᴏᴡ ʏᴏᴜ ᴛᴏ ᴀᴅᴅ ᴍᴜʟᴛɪᴘʟᴇ ᴛʀɪɢɢᴇʀs.` + +✪ /unblacklist <ᴛʀɪɢɢᴇʀs>*:* `ʀᴇᴍᴏᴠᴇ ᴛʀɪɢɢᴇʀs ғʀᴏᴍ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ. sᴀᴍᴇ ɴᴇᴡʟɪɴᴇ ʟᴏɢɪᴄ ᴀᴘᴘʟɪᴇs ʜᴇʀᴇ, sᴏ ʏᴏᴜ ᴄᴀɴ ʀᴇᴍᴏᴠᴇ ᴍᴜʟᴛɪᴘʟᴇ ᴛʀɪɢɢᴇʀs ᴀᴛ ᴏɴᴄᴇ.` + +✪ /blacklistmode <off/del/warn/ban/kick/mute/tban/tmute>*:* `ᴀᴄᴛɪᴏɴ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴡʜᴇɴ sᴏᴍᴇᴏɴᴇ sᴇɴᴅs ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴡᴏʀᴅs.` + +`ʀʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ɪs ᴜsᴇᴅ ᴛᴏ sᴛᴏᴘ ᴄᴇʀᴛᴀɪɴ sᴛɪᴄᴋᴇʀs. ᴡʜᴇɴᴇᴠᴇʀ a sᴛɪᴄᴋᴇʀ ɪs sᴇɴᴛ, ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴡɪʟʟ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ ɪᴍᴍᴇᴅɪᴀᴛᴇʟʏ.` + +*ɴᴏᴛᴇ:* `ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs ᴅᴏ ɴᴏᴛ ᴀғғᴇᴄᴛ ᴛʜᴇ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴ` + +✪ /blsticker*:* `ꜱᴇᴇ ᴄᴜʀʀᴇɴᴛ ʙʟᴀᴄᴋʟɪꜱᴛᴇᴅ ꜱᴛɪᴄᴋᴇʀ` + + +✪ /addblsticker <sticker link>*:* `ᴀᴅᴅ ᴛʜᴇ ꜱᴛɪᴄᴋᴇʀ ᴛʀɪɢɢᴇʀ ᴛᴏ ᴛʜᴇ ʙʟᴀᴄᴋ ʟɪꜱᴛ. ᴄᴀɴ ʙᴇ ᴀᴅᴅᴇᴅ ᴠɪᴀ ʀᴇᴘʟʏ ꜱᴛɪᴄᴋᴇʀ` + +✪ /unblsticker <sticker link>*:* `ʀᴇᴍᴏᴠᴇ ᴛʀɪɢɢᴇʀꜱ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪꜱᴛ. ᴛʜᴇ ꜱᴀᴍᴇ ɴᴇᴡʟɪɴᴇ ʟᴏɢɪᴄ ᴀᴘᴘʟɪᴇꜱ ʜᴇʀᴇ, ꜱᴏ ʏᴏᴜ ᴄᴀɴ ᴅᴇʟᴇᴛᴇ ᴍᴜʟᴛɪᴘʟᴇ ᴛʀɪɢɢᴇʀꜱ ᴀᴛ ᴏɴᴄᴇ` + +✪ /rmblsticker <sticker link>*:* `ꜱᴀᴍᴇ ᴀꜱ ᴀʙᴏᴠᴇ` + +✪ /blstickermode <delete/ban/tban/mute/tmute>*:* `ꜱᴇᴛꜱ ᴜᴘ ᴀ ᴅᴇғᴀᴜʟᴛ ᴀᴄᴛɪᴏɴ ᴏɴ ᴡʜᴀᴛ ᴛᴏ ᴅᴏ ɪғ ᴜꜱᴇʀꜱ ᴜꜱᴇ ʙʟᴀᴄᴋʟɪꜱᴛᴇᴅ ꜱᴛɪᴄᴋᴇʀꜱ` + +ɴᴏᴛᴇ: +✪ <sticker link> `ᴄᴀɴ ʙᴇ` `https://t.me/addstickers/<sticker>` `ᴏʀ ᴊᴜꜱᴛ` `<sticker>` `ᴏʀ ʀᴇᴘʟʏ ᴛᴏ ᴛʜᴇ ꜱᴛɪᴄᴋᴇʀ ᴍᴇꜱꜱᴀɢᴇ` + +""" + +BLACKLIST_HANDLER = DisableAbleCommandHandler( + "blacklist", blacklist, pass_args=True, admin_ok=True, run_async=True +) +ADD_BLACKLIST_HANDLER = CommandHandler("addblacklist", add_blacklist, run_async=True) +UNBLACKLIST_HANDLER = CommandHandler("unblacklist", unblacklist, run_async=True) +BLACKLISTMODE_HANDLER = CommandHandler( + "blacklistmode", blacklist_mode, pass_args=True, run_async=True +) +BLACKLIST_DEL_HANDLER = MessageHandler( + (Filters.text | Filters.command | Filters.sticker | Filters.photo) + & Filters.chat_type.groups, + del_blacklist, + allow_edit=True, + run_async=True, +) + +dispatcher.add_handler(BLACKLIST_HANDLER) +dispatcher.add_handler(ADD_BLACKLIST_HANDLER) +dispatcher.add_handler(UNBLACKLIST_HANDLER) +dispatcher.add_handler(BLACKLISTMODE_HANDLER) +dispatcher.add_handler(BLACKLIST_DEL_HANDLER, group=BLACKLIST_GROUP) + +__handlers__ = [ + BLACKLIST_HANDLER, + ADD_BLACKLIST_HANDLER, + UNBLACKLIST_HANDLER, + BLACKLISTMODE_HANDLER, + (BLACKLIST_DEL_HANDLER, BLACKLIST_GROUP), +] diff --git a/Exon/modules/blacklist_stickers.py b/Exon/modules/blacklist_stickers.py new file mode 100644 index 00000000..856c976d --- /dev/null +++ b/Exon/modules/blacklist_stickers.py @@ -0,0 +1,515 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +from typing import Optional + +from telegram import Chat, ChatPermissions, Message, ParseMode, Update, User +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CommandHandler, Filters, MessageHandler +from telegram.utils.helpers import mention_html, mention_markdown + +import Exon.modules.sql.blsticker_sql as sql +from Exon import LOGGER, dispatcher +from Exon.modules.connection import connected +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_message +from Exon.modules.helper_funcs.chat_status import user_admin, user_not_admin +from Exon.modules.helper_funcs.misc import split_message +from Exon.modules.helper_funcs.string_handling import extract_time +from Exon.modules.log_channel import loggable +from Exon.modules.sql.approve_sql import is_approved +from Exon.modules.warns import warn + + +def blackliststicker(update: Update, context: CallbackContext): + msg = update.effective_message # type: Optional[Message] + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + bot, args = context.bot, context.args + if conn := connected(bot, update, chat, user.id, need_admin=False): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if chat.type == "private": + return + chat_id = update.effective_chat.id + chat_name = chat.title + + sticker_list = f"<b>ʟɪsᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ sᴛɪᴄᴋᴇʀs ᴄᴜʀʀᴇɴᴛʟʏ ɪɴ {chat_name}:</b>\n" + + all_stickerlist = sql.get_chat_stickers(chat_id) + + if len(args) > 0 and args[0].lower() == "copy": + for trigger in all_stickerlist: + sticker_list += f"<code>{html.escape(trigger)}</code>\n" + elif len(args) == 0: + for trigger in all_stickerlist: + sticker_list += f" - <code>{html.escape(trigger)}</code>\n" + + split_text = split_message(sticker_list) + for text in split_text: + if ( + sticker_list + == f"<b>ʟɪsᴛ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ sᴛɪᴄᴋᴇʀs ᴄᴜʀʀᴇɴᴛʟʏ ɪɴ {chat_name}:</b>\n".format( + html.escape(chat_name) + ) + ): + send_message( + update.effective_message, + f"ᴛʜᴇʀᴇ ᴀʀᴇ ɴᴏ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + return + send_message(update.effective_message, text, parse_mode=ParseMode.HTML) + + +@user_admin +def add_blackliststicker(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message # type: Optional[Message] + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + words = msg.text.split(None, 1) + bot = context.bot + if conn := connected(bot, update, chat, user.id): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + if chat.type == "private": + return + chat_name = chat.title + + if len(words) > 1: + text = words[1].replace("https://t.me/addstickers/", "") + to_blacklist = list( + {trigger.strip() for trigger in text.split("\n") if trigger.strip()}, + ) + + added = 0 + for trigger in to_blacklist: + try: + bot.getStickerSet(trigger) + sql.add_to_stickers(chat_id, trigger.lower()) + added += 1 + except BadRequest: + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ `{trigger}` ᴄᴀɴ ɴᴏᴛ ʙᴇ ғᴏᴜɴᴅ!", + parse_mode="markdown", + ) + + if added == 0: + return + + if len(to_blacklist) == 1: + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ <code>{html.escape(to_blacklist[0])}</code> ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪʏᴄᴋᴇʀs ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + f"<code>{added}</code> sᴛɪᴄᴋᴇʀs ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + elif msg.reply_to_message: + added = 0 + trigger = msg.reply_to_message.sticker.set_name + if trigger is None: + send_message(update.effective_message, "sᴛɪᴄᴋᴇʀ ɪs ɪɴᴠᴀʟɪᴅ!") + return + try: + bot.getStickerSet(trigger) + sql.add_to_stickers(chat_id, trigger.lower()) + added += 1 + except BadRequest: + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ `{trigger}` ᴄᴀɴ ɴᴏᴛ ʙᴇ ғᴏᴜɴᴅ!", + parse_mode="markdown", + ) + + if added == 0: + return + + send_message( + update.effective_message, + f"Sticker <code>{trigger}</code> ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + "ᴛᴇʟʟ ᴍᴇ ᴡʜᴀᴛ sᴛɪᴄᴋᴇʀs ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴀᴅᴅ ᴛᴏ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ.", + ) + + +@user_admin +def unblackliststicker(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message # type: Optional[Message] + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + words = msg.text.split(None, 1) + bot = context.bot + if conn := connected(bot, update, chat, user.id): + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + if chat.type == "private": + return + chat_name = chat.title + + if len(words) > 1: + text = words[1].replace("https://t.me/addstickers/", "") + to_unblacklist = list( + {trigger.strip() for trigger in text.split("\n") if trigger.strip()}, + ) + + successful = 0 + for trigger in to_unblacklist: + success = sql.rm_from_stickers(chat_id, trigger.lower()) + if success: + successful += 1 + + if len(to_unblacklist) == 1: + if successful: + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ <code>{html.escape(to_unblacklist[0])}</code> ᴅᴇʟᴇᴛᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + "ᴛʜɪs sᴛɪᴄᴋᴇʀ ɪs ɴᴏᴛ ᴏɴ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ...!", + ) + + elif successful == len(to_unblacklist): + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ <code>{successful}</code> ᴅᴇʟᴇᴛᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ ɪɴ <b>{html.escape(chat_name)}</b>!", + parse_mode=ParseMode.HTML, + ) + + elif not successful: + send_message( + update.effective_message, + "ɴᴏɴᴇ ᴏғ ᴛʜᴇsᴇ sᴛɪᴄᴋᴇʀs ᴇxɪsᴛ, sᴏ ᴛʜᴇʏ ᴄᴀɴɴᴏᴛ ʙᴇ ʀᴇᴍᴏᴠᴇᴅ.", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ <code>{successful}</code> ᴅᴇʟᴇᴛᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ. {len(to_unblacklist) - successful} ᴅɪᴅ ɴᴏᴛ ᴇxɪsᴛ, sᴏ ɪᴛ's ɴᴏᴛ ᴅᴇʟᴇᴛᴇᴅ.", + parse_mode=ParseMode.HTML, + ) + + elif msg.reply_to_message: + trigger = msg.reply_to_message.sticker.set_name + if trigger is None: + send_message(update.effective_message, "sᴛɪᴄᴋᴇʀ ɪs ɪɴᴠᴀʟɪᴅ!") + return + if success := sql.rm_from_stickers(chat_id, trigger.lower()): + send_message( + update.effective_message, + f"sᴛɪᴄᴋᴇʀ <code>{trigger}</code> ᴅᴇʟᴇᴛᴇᴅ ғʀᴏᴍ ʙʟᴀᴄᴋʟɪsᴛ ɪɴ <b>{chat_name}</b>!", + parse_mode=ParseMode.HTML, + ) + + else: + send_message( + update.effective_message, + f"{trigger} ɴᴏᴛ ғᴏᴜɴᴅ ᴏɴ ʙʟᴀᴄᴋʟɪsᴛᴇᴅ sᴛɪᴄᴋᴇʀs...!", + ) + + else: + send_message( + update.effective_message, + "ᴛᴇʟʟ ᴍᴇ ᴡʜᴀᴛ sᴛɪᴄᴋᴇʀs ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ʀᴇᴍᴏᴠᴇ ғʀᴏᴍ ᴛʜᴇ ʙʟᴀᴄᴋʟɪsᴛ.", + ) + + +@loggable +@user_admin +def blacklist_mode(update: Update, context: CallbackContext): + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + msg = update.effective_message # type: Optional[Message] + bot, args = context.bot, context.args + conn = connected(bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ʏᴏᴜ ᴄᴀɴ ᴅᴏ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪɴ ɢʀᴏᴜᴘ's, ɴᴏᴛ PM", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + + if args: + if args[0].lower() in ["off", "nothing", "no"]: + settypeblacklist = "ᴛᴜʀɴ ᴏғғ" + sql.set_blacklist_strength(chat_id, 0, "0") + elif args[0].lower() in ["del", "delete"]: + settypeblacklist = "ʟᴇғᴛ, ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴡɪʟʟ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ" + sql.set_blacklist_strength(chat_id, 1, "0") + elif args[0].lower() == "warn": + settypeblacklist = "ᴡᴀʀɴᴇᴅ" + sql.set_blacklist_strength(chat_id, 2, "0") + elif args[0].lower() == "mute": + settypeblacklist = "ᴍᴜᴛᴇᴅ" + sql.set_blacklist_strength(chat_id, 3, "0") + elif args[0].lower() == "kick": + settypeblacklist = "ᴋɪᴄᴋᴇᴅ" + sql.set_blacklist_strength(chat_id, 4, "0") + elif args[0].lower() == "ban": + settypeblacklist = "ʙᴀɴɴᴇᴅ" + sql.set_blacklist_strength(chat_id, 5, "0") + elif args[0].lower() == "ᴛʙᴀɴ": + if len(args) == 1: + teks = """ɪᴛ ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴀʀᴇ ᴛʀʏɪɴɢ ᴛᴏ sᴇᴛ ᴀ ᴛᴇᴍᴘᴏʀᴀʀʏ ᴠᴀʟᴜᴇ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛ, ʙᴜᴛ ʜᴀs ɴᴏᴛ ᴅᴇᴛᴇʀᴍɪɴᴇᴅ ᴛʜᴇ ᴛɪᴍᴇ; ᴜsᴇ `/blstickermode tban <timevalue>`. + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇs : 4ᴍ = 4 ᴍɪɴᴜᴛᴇ, 3ʜ = 3 ʜᴏᴜʀs, 6ᴅ = 6 ᴅᴀʏs, 5w = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀʏ ʙᴀɴɴᴇᴅ ғᴏʀ {args[1]}" + sql.set_blacklist_strength(chat_id, 6, str(args[1])) + elif args[0].lower() == "tmute": + if len(args) == 1: + teks = """ɪᴛ ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴀʀᴇ ᴛʀʏɪɴɢ ᴛᴏ sᴇᴛ ᴀ ᴛᴇᴍᴘᴏʀᴀʀʏ ᴠᴀʟᴜᴇ ᴛᴏ ʙʟᴀᴄᴋʟɪsᴛ, ʙᴜᴛ ʜᴀs ɴᴏᴛ ᴅᴇᴛᴇʀᴍɪɴᴇᴅ ᴛʜᴇ ᴛɪᴍᴇ; ᴜsᴇ `/blstickermode tmute <timevalue>`. + ᴇxᴀᴍᴘʟᴇs ᴏғ ᴛɪᴍᴇ ᴠᴀʟᴜᴇs: 4ᴍ = 4 ᴍɪɴᴜᴛᴇ, 3ʜ = 3 ʜᴏᴜʀs, 6ᴅ = 6 days, 5ᴡ = 5 ᴡᴇᴇᴋs.""" + send_message(update.effective_message, teks, parse_mode="markdown") + return + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀʏ ᴍᴜᴛᴇᴅ ғᴏʀ {args[1]}" + sql.set_blacklist_strength(chat_id, 7, str(args[1])) + else: + send_message( + update.effective_message, + "I ᴏɴʟʏ ᴜɴᴅᴇʀsᴛᴀɴᴅ : off/del/warn/ban/kick/mute/tban/tmute!", + ) + return + if conn: + text = f"ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ᴍᴏᴅᴇ ᴄʜᴀɴɢᴇᴅ, ᴜsᴇʀs ᴡɪʟʟ ʙᴇ `{settypeblacklist}` ᴀᴛ *{chat_name}*!" + + else: + text = ( + f"ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ᴍᴏᴅᴇ ᴄʜᴀɴɢᴇᴅ, ᴜsᴇʀs ᴡɪʟʟ ʙᴇ `{settypeblacklist}`!" + ) + send_message(update.effective_message, text, parse_mode="markdown") + return f"<b>{html.escape(chat.title)}:</b>\n<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\nᴄʜᴀɴɢᴇᴅ sᴛɪᴄᴋᴇʀ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴏᴅᴇ. ᴜsᴇʀs ᴡɪʟʟ ʙᴇ {settypeblacklist}." + + getmode, getvalue = sql.get_blacklist_setting(chat.id) + if getmode == 0: + settypeblacklist = "ɴᴏᴛ ᴀᴄᴛɪᴠᴇ" + elif getmode == 1: + settypeblacklist = "ᴅᴇʟᴇᴛᴇ" + elif getmode == 2: + settypeblacklist = "ᴡᴀʀɴ" + elif getmode == 3: + settypeblacklist = "ᴍᴜᴛᴇ" + elif getmode == 4: + settypeblacklist = "ᴋɪᴄᴋ" + elif getmode == 5: + settypeblacklist = "ʙᴀɴ" + elif getmode == 6: + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ʙᴀɴɴᴇᴅ ғᴏʀ {getvalue}" + elif getmode == 7: + settypeblacklist = f"ᴛᴇᴍᴘᴏʀᴀʀɪʟʏ ᴍᴜᴛᴇᴅ ғᴏʀ {getvalue}" + if conn: + text = f"ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ *{settypeblacklist}* ɪɴ *{chat_name}*." + + else: + text = f"ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ *{settypeblacklist}*." + send_message(update.effective_message, text, parse_mode=ParseMode.MARKDOWN) + return "" + + +@user_not_admin +def del_blackliststicker(update: Update, context: CallbackContext): + bot = context.bot + chat = update.effective_chat # type: Optional[Chat] + message = update.effective_message # type: Optional[Message] + user = update.effective_user + to_match = message.sticker + + if not to_match or not to_match.set_name: + return + + if is_approved(chat.id, user.id): # ignore approved users + return + + getmode, value = sql.get_blacklist_setting(chat.id) + + chat_filters = sql.get_chat_stickers(chat.id) + for trigger in chat_filters: + if to_match.set_name.lower() == trigger.lower(): + try: + if getmode == 0: + return + if getmode == 1: + message.delete() + elif getmode == 2: + message.delete() + warn( + update.effective_user, + chat, + f"ᴜsɪɴɢ sᴛɪᴄᴋᴇʀ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + message, + update.effective_user, + ) + + return + elif getmode == 3: + message.delete() + bot.restrict_chat_member( + chat.id, + update.effective_user.id, + permissions=ChatPermissions(can_send_messages=False), + ) + bot.sendMessage( + chat.id, + f"{mention_markdown(user.id, user.first_name)} ᴍᴜᴛᴇᴅ ʙᴇᴄᴀᴜsᴇ ᴜsɪɴɢ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + parse_mode="markdown", + ) + + return + elif getmode == 4: + message.delete() + if res := chat.unban_member(update.effective_user.id): + bot.sendMessage( + chat.id, + f"{mention_markdown(user.id, user.first_name)} ᴋɪᴄᴋᴇᴅ ʙᴇᴄᴀᴜsᴇ ᴜsɪɴɢ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + parse_mode="markdown", + ) + + return + elif getmode == 5: + message.delete() + chat.ban_member(user.id) + bot.sendMessage( + chat.id, + f"{mention_markdown(user.id, user.first_name)} ʙᴀɴɴᴇᴅ ʙᴇᴄᴀᴜsᴇ ᴜsɪɴɢ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + parse_mode="markdown", + ) + + return + elif getmode == 6: + message.delete() + bantime = extract_time(message, value) + chat.ban_member(user.id, until_date=bantime) + bot.sendMessage( + chat.id, + f"{mention_markdown(user.id, user.first_name)} ʙᴀɴɴᴇᴅ ғᴏʀ {value} ʙᴇᴄᴀᴜsᴇ ᴜsɪɴɢ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + parse_mode="markdown", + ) + + return + elif getmode == 7: + message.delete() + mutetime = extract_time(message, value) + bot.restrict_chat_member( + chat.id, + user.id, + permissions=ChatPermissions(can_send_messages=False), + until_date=mutetime, + ) + bot.sendMessage( + chat.id, + f"{mention_markdown(user.id, user.first_name)} ᴍᴜᴛᴇᴅ ғᴏʀ {value} ʙᴇᴄᴀᴜsᴇ ᴜsɪɴɢ '{trigger}' ᴡʜɪᴄʜ ɪɴ ʙʟᴀᴄᴋʟɪsᴛ sᴛɪᴄᴋᴇʀs", + parse_mode="markdown", + ) + + return + except BadRequest as excp: + if excp.message != "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + LOGGER.exception("ᴇʀʀᴏʀ ᴡʜɪʟᴇ ᴅᴇʟᴇᴛɪɴɢ ʙʟᴀᴄᴋʟɪsᴛ ᴍᴇssᴀɢᴇ.") + break + + +def __import_data__(chat_id, data): + # set chat blacklist + blacklist = data.get("sticker_blacklist", {}) + for trigger in blacklist: + sql.add_to_stickers(chat_id, trigger) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + blacklisted = sql.num_stickers_chat_filters(chat_id) + return f"ᴛʜᴇʀᴇ ᴀʀᴇ `{blacklisted} `ʙʟᴀᴄᴋʟɪsᴛᴇᴅ sᴛɪᴄᴋᴇʀs." + + +def __stats__(): + return f"•➥ {sql.num_stickers_filters()} blacklist stickers, across {sql.num_stickers_filter_chats()} ᴄʜᴀᴛs." + + +__mod_name__ = "𝚂ᴛɪᴄᴋᴇʀs ʙʟᴀᴄᴋʟɪsᴛ" + +BLACKLIST_STICKER_HANDLER = DisableAbleCommandHandler( + "blsticker", + blackliststicker, + admin_ok=True, + run_async=True, +) +ADDBLACKLIST_STICKER_HANDLER = DisableAbleCommandHandler( + "addblsticker", + add_blackliststicker, + run_async=True, +) +UNBLACKLIST_STICKER_HANDLER = CommandHandler( + ["unblsticker", "rmblsticker"], + unblackliststicker, + run_async=True, +) +BLACKLISTMODE_HANDLER = CommandHandler("blstickermode", blacklist_mode, run_async=True) +BLACKLIST_STICKER_DEL_HANDLER = MessageHandler( + Filters.sticker & Filters.chat_type.groups, + del_blackliststicker, + run_async=True, +) + +dispatcher.add_handler(BLACKLIST_STICKER_HANDLER) +dispatcher.add_handler(ADDBLACKLIST_STICKER_HANDLER) +dispatcher.add_handler(UNBLACKLIST_STICKER_HANDLER) +dispatcher.add_handler(BLACKLISTMODE_HANDLER) +dispatcher.add_handler(BLACKLIST_STICKER_DEL_HANDLER) diff --git a/Exon/modules/blacklistusers.py b/Exon/modules/blacklistusers.py new file mode 100644 index 00000000..80f9945a --- /dev/null +++ b/Exon/modules/blacklistusers.py @@ -0,0 +1,171 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import ParseMode, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CommandHandler +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.blacklistusers_sql as sql +from Exon import DEMONS, DEV_USERS, DRAGONS, OWNER_ID, TIGERS, WOLVES, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus +from Exon.modules.helper_funcs.extraction import extract_user, extract_user_and_text +from Exon.modules.log_channel import gloggable + +BLACKLISTWHITELIST = [OWNER_ID] + DEV_USERS + DRAGONS + WOLVES + DEMONS +BLABLEUSERS = [OWNER_ID] + DEV_USERS + + +@dev_plus +@gloggable +def bl_user(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + bot, args = context.bot, context.args + user_id, reason = extract_user_and_text(message, args) + + if not user_id: + message.reply_text("I ᴅᴏᴜʙᴛ ᴛʜᴀᴛ's ᴀ ᴜsᴇʀ.") + return "" + + if user_id == bot.id: + message.reply_text("ʜᴏᴡ ᴀᴍ ɪ sᴜᴘᴘᴏsᴇᴅ ᴛᴏ ᴅᴏ ᴍʏ ᴡᴏʀᴋ ɪғ ɪ ᴀᴍ ɪɢɴᴏʀɪɴɢ ᴍʏsᴇʟғ?") + return "" + + if user_id in BLACKLISTWHITELIST: + message.reply_text("ɴᴏ!\nɴᴏᴛɪᴄɪɴɢ ᴅɪsᴀsᴛᴇʀs ɪs ᴍʏ ᴊᴏʙ.") + return "" + + try: + target_user = bot.get_chat(user_id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return "" + raise + + sql.blacklist_user(user_id, reason) + message.reply_text("I sʜᴀʟʟ ɪɢɴᴏʀᴇ ᴛʜᴇ ᴇxɪsᴛᴇɴᴄᴇ ᴏғ ᴛʜɪs ᴜsᴇʀ!") + log_message = ( + f"#ʙʟᴀᴄᴋʟɪsᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(target_user.id, html.escape(target_user.first_name))}" + ) + if reason: + log_message += f"\n<b>ʀᴇᴀsᴏɴ:</b> {reason}" + + return log_message + + +@dev_plus +@gloggable +def unbl_user(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + bot, args = context.bot, context.args + user_id = extract_user(message, args) + + if not user_id: + message.reply_text("I ᴅᴏᴜʙᴛ ᴛʜᴀᴛ's ᴀ ᴜsᴇʀ.") + return "" + + if user_id == bot.id: + message.reply_text("I ᴀʟᴡᴀʏs ɴᴏᴛɪᴄᴇ ᴍʏsᴇʟғ.") + return "" + + try: + target_user = bot.get_chat(user_id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return "" + raise + + if sql.is_user_blacklisted(user_id): + + sql.unblacklist_user(user_id) + message.reply_text("*notices user*") + log_message = ( + f"#ᴜɴʙʟᴀᴄᴋʟɪsᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(target_user.id, html.escape(target_user.first_name))}" + ) + + return log_message + message.reply_text("I ᴀᴍ ɴᴏᴛ ɪɢɴᴏʀɪɴɢ ᴛʜᴇᴍ ᴀᴛ ᴀʟʟ ᴛʜᴏᴜɢʜ!") + return "" + + +@dev_plus +def bl_users(update: Update, context: CallbackContext): + users = [] + bot = context.bot + for each_user in sql.BLACKLIST_USERS: + user = bot.get_chat(each_user) + if reason := sql.get_reason(each_user): + users.append( + f"• {mention_html(user.id, html.escape(user.first_name))} :- {reason}", + ) + else: + users.append(f"• {mention_html(user.id, html.escape(user.first_name))}") + + message = "<b>ʙʟᴀᴄᴋʟɪsᴛᴇᴅ ᴜsᴇʀs</b>\n" + ( + "\n".join(users) if users else "ɴᴏᴏɴᴇ ɪs ʙᴇɪɴɢ ɪɢɴᴏʀᴇᴅ ᴀs ᴏғ ʏᴇᴛ." + ) + + update.effective_message.reply_text(message, parse_mode=ParseMode.HTML) + + +def __user_info__(user_id): + is_blacklisted = sql.is_user_blacklisted(user_id) + + text = "ʙʟᴀᴄᴋʟɪsᴛᴇᴅ: <b>{}</b>" + if user_id in [777000, 1087968824]: + return "" + if user_id == dispatcher.bot.id: + return "" + if int(user_id) in DRAGONS + TIGERS + WOLVES: + return "" + if is_blacklisted: + text = text.format("Yes") + if reason := sql.get_reason(user_id): + text += f"\nʀᴇᴀsᴏɴ: <code>{reason}</code>" + else: + text = text.format("No") + + return text + + +BL_HANDLER = CommandHandler("ignore", bl_user, run_async=True) +UNBL_HANDLER = CommandHandler("notice", unbl_user, run_async=True) +BLUSERS_HANDLER = CommandHandler("ignoredlist", bl_users, run_async=True) + +dispatcher.add_handler(BL_HANDLER) +dispatcher.add_handler(UNBL_HANDLER) +dispatcher.add_handler(BLUSERS_HANDLER) + +__mod_name__ = "Blacklisting Users" +__handlers__ = [BL_HANDLER, UNBL_HANDLER, BLUSERS_HANDLER] diff --git a/Exon/modules/books.py b/Exon/modules/books.py new file mode 100644 index 00000000..a5ee278a --- /dev/null +++ b/Exon/modules/books.py @@ -0,0 +1,82 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import os +import re + +import requests +from bs4 import BeautifulSoup +from telethon import events + +from Exon import BOT_USERNAME, SUPPORT_CHAT, telethn + + +@telethn.on(events.NewMessage(pattern="^/book (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + KkK = await event.reply("sᴇᴀʀᴄʜɪɴɢ ғᴏʀ ᴛʜᴇ ʙᴏᴏᴋ...") + lin = "https://b-ok.cc/s/" + text = input_str + link = lin + text + + headers = [ + "User-Agent", + "Arsh 5.0 (Macintosh; Intel Mac OS X 10.15; rv:74.0) Gecko/20100101 Firefox/74.0", + ] + page = requests.get(link) + soup = BeautifulSoup(page.content, "html.parser") + f = open("book.txt", "w") + total = soup.find(class_="totalCounter") + for nb in total.descendants: + nbx = nb.replace("(", "").replace(")", "") + if nbx == "0": + await event.reply("ɴᴏ ʙᴏᴏᴋs ғᴏᴜɴᴅ ᴡɪᴛʜ ᴛʜᴀᴛ ɴᴀᴍᴇ.") + else: + + lool = 0 + for tr in soup.find_all("td"): + for td in tr.find_all("h3"): + for ts in td.find_all("a"): + title = ts.get_text() + lool += 1 + for ts in td.find_all("a", attrs={"href": re.compile("^/book/")}): + ref = ts.get("href") + link = f"https://b-ok.cc{ref}" + + f.write("\n" + title) + f.write("\nʙᴏᴏᴋ ʟɪɴᴋ:- " + link + "\n\n") + + f.write(f"ʙʏ @{BOT_USERNAME}.") + f.close() + caption = f"ᴇxᴏɴ \nᴊᴏɪɴ sᴜᴘᴘᴏʀᴛ @{SUPPORT_CHAT} " + + await telethn.send_file( + event.chat_id, + "book.txt", + caption=f"**BOOKS GATHERED SUCCESSFULLY!\n\nBY @ABISHNOIMF **", + ) + os.remove("book.txt") + await KkK.delete() diff --git a/Exon/modules/callback.py b/Exon/modules/callback.py new file mode 100644 index 00000000..679097a7 --- /dev/null +++ b/Exon/modules/callback.py @@ -0,0 +1,202 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +from pyrogram.types import CallbackQuery + +from Exon import pgram as bot + + +@bot.on_callback_query() +async def close(Client, cb: CallbackQuery): + if cb.data == "close_h": + await cb.answer() + await cb.message.delete() + + +import time + +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.ext import CallbackContext, CallbackQueryHandler + +from Exon import ( + BOT_NAME, + OWNER_ID, + SUPPORT_CHAT, + UPDATES_CHANNEL, + StartTime, + dispatcher, +) + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += f"{time_list.pop()}, " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +def Exon_about_callback(update: Update, context: CallbackContext): + query = update.callback_query + if query.data == "about_": + get_readable_time((time.time() - StartTime)) + query.message.edit_text( + text=f"*ʜᴇʏ,*🥀\n *ᴛʜɪs ɪs {BOT_NAME}*" + "\n*ᴀ ᴘᴏᴡᴇʀꜰᴜʟ ɢʀᴏᴜᴘ ᴍᴀɴᴀɢᴇᴍᴇɴᴛ ʙᴏᴛ ʙᴜɪʟᴛ ᴛᴏ ʜᴇʟᴘ ʏᴏᴜ ᴍᴀɴᴀɢᴇ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴇᴀꜱɪʟʏ ᴀɴᴅ ᴛᴏ ᴘʀᴏᴛᴇᴄᴛ ʏᴏᴜʀ ɢʀᴏᴜᴘ ꜰʀᴏᴍ ꜱᴄᴀᴍᴍᴇʀꜱ ᴀɴᴅ ꜱᴘᴀᴍᴍᴇʀꜱ.*" + "\n*ᴡʀɪᴛᴛᴇɴ ɪɴ ᴩʏᴛʜᴏɴ ᴡɪᴛʜ sǫʟᴀʟᴄʜᴇᴍʏ ᴀɴᴅ ᴍᴏɴɢᴏᴅʙ ᴀs ᴅᴀᴛᴀʙᴀsᴇ.*" + "\n\n➲ ɪ ᴄᴀɴ ʀᴇꜱᴛʀɪᴄᴛ ᴜꜱᴇʀꜱ." + "\n➲ ɪ ʜᴀᴠᴇ ᴀɴ ᴀᴅᴠᴀɴᴄᴇᴅ ᴀɴᴛɪ-ꜰʟᴏᴏᴅ ꜱʏꜱᴛᴇᴍ." + "\n➲ ɪ ᴄᴀɴ ɢʀᴇᴇᴛ ᴜꜱᴇʀꜱ ᴡɪᴛʜ ᴄᴜꜱᴛᴏᴍɪᴢᴀʙʟᴇ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇꜱꜱᴀɢᴇꜱ ᴀɴᴅ ᴇᴠᴇɴ ꜱᴇᴛ ᴀ ɢʀᴏᴜᴘ'ꜱ ʀᴜʟᴇꜱ." + "\n➲ ɪ ᴄᴀɴ ᴡᴀʀɴ ᴜꜱᴇʀꜱ ᴜɴᴛɪʟ ᴛʜᴇʏ ʀᴇᴀᴄʜ ᴍᴀx ᴡᴀʀɴꜱ, ᴡɪᴛʜ ᴇᴀᴄʜ ᴘʀᴇᴅᴇꜰɪɴᴇᴅ ᴀᴄᴛɪᴏɴꜱ ꜱᴜᴄʜ ᴀꜱ ʙᴀɴ, ᴍᴜᴛᴇ, ᴋɪᴄᴋ, ᴇᴛᴄ." + "\n➲ ɪ ʜᴀᴠᴇ ᴀ ɴᴏᴛᴇ ᴋᴇᴇᴘɪɴɢ ꜱʏꜱᴛᴇᴍ, ʙʟᴀᴄᴋʟɪꜱᴛꜱ, ᴀɴᴅ ᴇᴠᴇɴ ᴘʀᴇᴅᴇᴛᴇʀᴍɪɴᴇᴅ ʀᴇᴘʟɪᴇꜱ ᴏɴ ᴄᴇʀᴛᴀɪɴ ᴋᴇʏᴡᴏʀᴅꜱ." + f"\n\n➻ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ɢɪᴠᴇɴ ʙᴇʟᴏᴡ ғᴏʀ ɢᴇᴛᴛɪɴɢ ʙᴀsɪᴄ ʜᴇʟᴩ ᴀɴᴅ ɪɴғᴏ ᴀʙᴏᴜᴛ {BOT_NAME}.", + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="sᴜᴩᴩᴏʀᴛ", callback_data="Exon_support" + ), + InlineKeyboardButton( + text="ᴄᴏᴍᴍᴀɴᴅs", callback_data="help_back" + ), + ], + [ + InlineKeyboardButton( + text="ᴅᴇᴠᴇʟᴏᴩᴇʀ", url=f"tg://user?id={OWNER_ID}" + ), + InlineKeyboardButton( + text="sᴏᴜʀᴄᴇ", + callback_data="source_", + ), + ], + [ + InlineKeyboardButton(text="◁", callback_data="Exon_back"), + ], + ] + ), + ) + + +def Exon_support_callback(update: Update, context: CallbackContext): + query = update.callback_query + if query.data == "Exon_support": + query.message.edit_text( + text="*๏ ᴄʟɪᴄᴋ ᴏɴ ᴛʜᴇ ʙᴜᴛᴛᴏɴs ɢɪᴠᴇɴ ʙᴇʟᴏᴡ ᴛᴏ ɢᴇᴛ ʜᴇʟᴩ ᴀɴᴅ ᴍᴏʀᴇ ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴍᴇ.*" + f"\n\nɪғ ʏᴏᴜ ғᴏᴜɴᴅ ᴀɴʏ ʙᴜɢ ɪɴ {BOT_NAME} ᴏʀ ɪғ ʏᴏᴜ ᴡᴀɴɴᴀ ɢɪᴠᴇ ғᴇᴇᴅʙᴀᴄᴋ ᴀʙᴏᴜᴛ ᴛʜᴇ {BOT_NAME}, ᴩʟᴇᴀsᴇ ʀᴇᴩᴏʀᴛ ɪᴛ ᴀᴛ sᴜᴩᴩᴏʀᴛ ᴄʜᴀᴛ.", + parse_mode=ParseMode.MARKDOWN, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="sᴜᴩᴩᴏʀᴛ", url=f"https://t.me/{SUPPORT_CHAT}" + ), + InlineKeyboardButton( + text="ᴜᴩᴅᴀᴛᴇs", url=f"https://t.me/{UPDATES_CHANNEL}" + ), + ], + [ + InlineKeyboardButton( + text="ᴅᴇᴠᴇʟᴏᴩᴇʀ", url=f"tg://user?id={OWNER_ID}" + ), + InlineKeyboardButton( + text="ɢɪᴛʜᴜʙ", + callback_data="source_", + ), + ], + [ + InlineKeyboardButton(text="◁", callback_data="Exon_back"), + ], + ] + ), + ) + + +def Source_about_callback(update: Update, context: CallbackContext): + query = update.callback_query + if query.data == "source_": + query.message.edit_text( + text=f""" +*ʜᴇʏ, + ᴛʜɪs ɪs {BOT_NAME}, +ᴀɴ ᴏᴩᴇɴ sᴏᴜʀᴄᴇ ᴛᴇʟᴇɢʀᴀᴍ ɢʀᴏᴜᴩ ᴍᴀɴᴀɢᴇᴍᴇɴᴛ ʙᴏᴛ.* + +ᴡʀɪᴛᴛᴇɴ ɪɴ ᴩʏᴛʜᴏɴ ᴡɪᴛʜ ᴛʜᴇ ʜᴇʟᴩ ᴏғ : [ᴛᴇʟᴇᴛʜᴏɴ](https://github.com/LonamiWebs/Telethon) +[ᴩʏʀᴏɢʀᴀᴍ](https://github.com/pyrogram/pyrogram) +[ᴩʏᴛʜᴏɴ-ᴛᴇʟᴇɢʀᴀᴍ-ʙᴏᴛ](https://github.com/python-telegram-bot/python-telegram-bot) +ᴀɴᴅ ᴜsɪɴɢ [sǫʟᴀʟᴄʜᴇᴍʏ](https://www.sqlalchemy.org) ᴀɴᴅ [ᴍᴏɴɢᴏ](https://cloud.mongodb.com) ᴀs ᴅᴀᴛᴀʙᴀsᴇ. + + +*ʜᴇʀᴇ ɪs ᴍʏ sᴏᴜʀᴄᴇ ᴄᴏᴅᴇ :* [ɢɪᴛʜᴜʙ](https://github.com/TEAM-ABG/ExonRobot) + + +{BOT_NAME} ɪs ʟɪᴄᴇɴsᴇᴅ ᴜɴᴅᴇʀ ᴛʜᴇ [ᴍɪᴛ ʟɪᴄᴇɴsᴇ](https://github.com/TEAM-ABG/ExonRobot/blob/master/LICENSE). +© 2022 - 2023 [@ᴀʙɪsʜɴᴏɪᴍғ](https://t.me/{SUPPORT_CHAT}), ᴀʟʟ ʀɪɢʜᴛs ʀᴇsᴇʀᴠᴇᴅ. +""", + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton(text="◁", callback_data="help_back")]] + ), + ) + + +Exon_about_callback = CallbackQueryHandler( + Exon_about_callback, pattern=r"about_", run_async=True +) +Source_about_callback = CallbackQueryHandler( + Source_about_callback, pattern=r"source_", run_async=True +) +Exon_support_callback = CallbackQueryHandler( + Exon_support_callback, pattern=r"Exon_support", run_async=True +) + + +dispatcher.add_handler(Exon_about_callback) +dispatcher.add_handler(Source_about_callback) +dispatcher.add_handler(Exon_support_callback) diff --git a/Exon/modules/carbon.py b/Exon/modules/carbon.py new file mode 100644 index 00000000..ca7d521a --- /dev/null +++ b/Exon/modules/carbon.py @@ -0,0 +1,50 @@ +import asyncio +from io import BytesIO + +from pyrogram import filters + +from Exon import aiohttpsession as aiosession +from Exon import pgram +from Exon.events import register +from Exon.utils.errors import capture_err + + +async def make_carbon(code): + url = "https://carbonara.vercel.app/api/cook" + async with aiosession.post(url, json={"code": code}) as resp: + image = BytesIO(await resp.read()) + image.name = "carbon.png" + return image + + +@pgram.on_message(filters.command("carbon")) +@capture_err +async def carbon_func(_, message): + if not message.reply_to_message: + return await message.reply_text("`ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴄᴀʀʙᴏɴ`") + if not message.reply_to_message.text: + return await message.reply_text("`ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇxᴛ ᴛᴏ ɢᴇɴᴇʀᴀᴛᴇ ᴄᴀʀʙᴏɴ`") + m = await message.reply_text("`ɢᴇɴᴇʀᴀᴛɪɴɢ ᴄᴀʀʙᴏɴ...`") + carbon = await make_carbon(message.reply_to_message.text) + await m.edit("`waitoo...`") + await pgram.send_photo(message.chat.id, carbon) + await m.delete() + carbon.close() + + +@register(pattern="^/repo$") +async def _(event): + loda = "➥ [EXON](https://github.com/TEAM-ABG/ExonRobot)" + lund = await event.reply(loda) + await asyncio.sleep(10) + await event.delete() + await lund.delete() + + +__mod_name__ = "𝙲ᴀʀʙᴏɴ" + +__help__ = """ + +/carbon *:* ᴍᴀᴋᴇs ᴄᴀʀʙᴏɴ ғᴏʀ ʀᴇᴘʟɪᴇᴅ ᴛᴇxᴛ +/repo *:*🌟 + """ diff --git a/Exon/modules/chatbot.py b/Exon/modules/chatbot.py new file mode 100644 index 00000000..d408d4e5 --- /dev/null +++ b/Exon/modules/chatbot.py @@ -0,0 +1,205 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import json +import re +from time import sleep + +import requests +from telegram import ( + CallbackQuery, + Chat, + InlineKeyboardButton, + InlineKeyboardMarkup, + ParseMode, + Update, + User, +) +from telegram.error import BadRequest, RetryAfter, Unauthorized +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + Filters, + MessageHandler, +) +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.kuki_sql as sql +from Exon import dispatcher +from Exon.modules.helper_funcs.chat_status import user_admin, user_admin_no_reply +from Exon.modules.helper_funcs.filters import CustomFilters +from Exon.modules.log_channel import gloggable + + +@user_admin_no_reply +@gloggable +def kukirm(update: Update, context: CallbackContext) -> str: + query: Optional[CallbackQuery] = update.callback_query + user: Optional[User] = update.effective_user + if match := re.match(r"rm_chat\((.+?)\)", query.data): + user_id = match[1] + chat: Optional[Chat] = update.effective_chat + if is_kuki := sql.rem_kuki(chat.id): + sql.rem_kuki(user_id) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"AI_ᴅɪsᴀʙʟᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + ) + else: + query.answer("ᴄʜᴀᴛʙᴏᴛ ᴜɴᴀᴄᴛɪᴠᴇ") + query.message.delete() + + return "" + + +@user_admin_no_reply +@gloggable +def kukiadd(update: Update, context: CallbackContext) -> str: + query: Optional[CallbackQuery] = update.callback_query + user: Optional[User] = update.effective_user + if match := re.match(r"add_chat\((.+?)\)", query.data): + user_id = match[1] + chat: Optional[Chat] = update.effective_chat + if is_kuki := sql.set_kuki(chat.id): + sql.set_kuki(user_id) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"ᴀɪ_ᴇɴᴀʙʟᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + ) + else: + query.answer("ᴄʜᴀᴛʙᴏᴛ ᴀᴄᴛɪᴠᴇ") + query.message.delete() + + return "" + + +@user_admin +@gloggable +def kuki(update: Update, context: CallbackContext): + update.effective_user + message = update.effective_message + msg = "ᴄʜᴏᴏsᴇ ᴀɴ ᴏᴘᴛɪᴏɴ ʙᴀʙʏ " + keyboard = InlineKeyboardMarkup( + [ + [InlineKeyboardButton(text="ᴇɴᴀʙʟᴇ", callback_data="add_chat({})")], + [InlineKeyboardButton(text="ᴅɪsᴀʙʟᴇ", callback_data="rm_chat({})")], + ] + ) + message.reply_text( + msg, + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + + +def kuki_message(context: CallbackContext, message): + reply_message = message.reply_to_message + if message.text.lower() == "Exon": + return True + if reply_message: + if reply_message.from_user.id == context.bot.get_me().id: + return True + else: + return False + + +def chatbot(update: Update, context: CallbackContext): + message = update.effective_message + chat_id = update.effective_chat.id + bot = context.bot + is_kuki = sql.is_kuki(chat_id) + if not is_kuki: + return + + if message.text and not message.document: + if not kuki_message(context, message): + return + Message = message.text + bot.send_chat_action(chat_id, action="typing") + kukiurl = requests.get( + f"https://kukiapi.xyz/api/apikey=5281955434-KUKIyq4NCB2Ca8/Himawari/@nekoarsh/message={Message}" + ) + + Kuki = json.loads(kukiurl.text) + kuki = Kuki["reply"] + sleep(0.3) + message.reply_text(kuki, timeout=60) + + +def list_all_chats(update: Update, context: CallbackContext): + chats = sql.get_all_kuki_chats() + text = "<b>ᴋᴜᴋɪ-ᴇɴᴀʙʟᴇᴅ ᴄʜᴀᴛs</b>\n" + for chat in chats: + try: + x = context.bot.get_chat(int(*chat)) + name = x.title or x.first_name + text += f"• <code>{name}</code>\n" + except (BadRequest, Unauthorized): + sql.rem_kuki(*chat) + except RetryAfter as e: + sleep(e.retry_after) + update.effective_message.reply_text(text, parse_mode="HTML") + + +__help__ = """ +ᴄʜᴀᴛʙᴏᴛ ᴜᴛɪʟɪᴢᴇs ᴛʜᴇ ᴋᴜᴋɪ's API ᴡʜɪᴄʜ ᴀʟʟᴏᴡs ᴇxᴏɴ ᴛᴏ ᴛᴀʟᴋ ᴀɴᴅ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴍᴏʀᴇ ɪɴᴛᴇʀᴀᴄᴛɪᴠᴇ ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴇxᴘᴇʀɪᴇɴᴄᴇ. +*ᴀᴅᴍɪɴs ᴏɴʟʏ ᴄᴏᴍᴍᴀɴᴅs*: + +✪ /Chatbot*:* sʜᴏᴡs ᴄʜᴀᴛʙᴏᴛ ᴄᴏɴᴛʀᴏʟ ᴘᴀɴᴇʟ + +""" + +__mod_name__ = "𝙲ʜᴀᴛʙᴏᴛ" + + +CHATBOTK_HANDLER = CommandHandler("chatbot", kuki, run_async=True) +ADD_CHAT_HANDLER = CallbackQueryHandler(kukiadd, pattern=r"add_chat", run_async=True) +RM_CHAT_HANDLER = CallbackQueryHandler(kukirm, pattern=r"rm_chat", run_async=True) +CHATBOT_HANDLER = MessageHandler( + Filters.text + & (~Filters.regex(r"^#[^\s]+") & ~Filters.regex(r"^!") & ~Filters.regex(r"^\/")), + chatbot, + run_async=True, +) +LIST_ALL_CHATS_HANDLER = CommandHandler( + "allchats", list_all_chats, filters=CustomFilters.dev_filter, run_async=True +) + +dispatcher.add_handler(ADD_CHAT_HANDLER) +dispatcher.add_handler(CHATBOTK_HANDLER) +dispatcher.add_handler(RM_CHAT_HANDLER) +dispatcher.add_handler(LIST_ALL_CHATS_HANDLER) +dispatcher.add_handler(CHATBOT_HANDLER) + +__handlers__ = [ + ADD_CHAT_HANDLER, + CHATBOTK_HANDLER, + RM_CHAT_HANDLER, + LIST_ALL_CHATS_HANDLER, + CHATBOT_HANDLER, +] diff --git a/Exon/modules/cleaner.py b/Exon/modules/cleaner.py new file mode 100644 index 00000000..2c0c0611 --- /dev/null +++ b/Exon/modules/cleaner.py @@ -0,0 +1,285 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import ParseMode, Update +from telegram.ext import CallbackContext, CommandHandler, Filters, MessageHandler + +from Exon import ALLOW_EXCL, BOT_NAME, CustomCommandHandler, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import ( + bot_can_delete, + connection_status, + dev_plus, + user_admin, +) +from Exon.modules.sql import cleaner_sql as sql + +CMD_STARTERS = ("/", "!") if ALLOW_EXCL else "/" +BLUE_TEXT_CLEAN_GROUP = 13 +CommandHandlerList = (CommandHandler, CustomCommandHandler, DisableAbleCommandHandler) +command_list = [ + "cleanblue", + "ignoreblue", + "unignoreblue", + "listblue", + "ungignoreblue", + "gignoreblue", + "start", + "help", + "settings", + "donate", + "stalk", + "aka", + "leaderboard", +] + +for handler_list in dispatcher.handlers: + for handler in dispatcher.handlers[handler_list]: + if any(isinstance(handler, cmd_handler) for cmd_handler in CommandHandlerList): + command_list += handler.command + + +def clean_blue_text_must_click(update: Update, context: CallbackContext): + bot = context.bot + chat = update.effective_chat + message = update.effective_message + if chat.get_member(bot.id).can_delete_messages and sql.is_enabled(chat.id): + fst_word = message.text.strip().split(None, 1)[0] + + if len(fst_word) > 1 and any( + fst_word.startswith(start) for start in CMD_STARTERS + ): + + command = fst_word[1:].split("@") + chat = update.effective_chat + + if ignored := sql.is_command_ignored(chat.id, command[0]): + return + + if command[0] not in command_list: + message.delete() + + +@connection_status +@bot_can_delete +@user_admin +def set_blue_text_must_click(update: Update, context: CallbackContext): + chat = update.effective_chat + message = update.effective_message + bot, args = context.bot, context.args + if len(args) >= 1: + val = args[0].lower() + if val in ("off", "no"): + sql.set_cleanbt(chat.id, False) + reply = f"ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ғᴏʀ <b>{html.escape(chat.title)}</b>" + + message.reply_text(reply, parse_mode=ParseMode.HTML) + + elif val in ("yes", "on"): + sql.set_cleanbt(chat.id, True) + reply = f"ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ ʜᴀs ʙᴇᴇɴ ᴇɴᴀʙʟᴇᴅ ғᴏʀ <b>{html.escape(chat.title)}</b>" + + message.reply_text(reply, parse_mode=ParseMode.HTML) + + else: + reply = "ɪɴᴠᴀʟɪᴅ ᴀʀɢᴜᴍᴇɴᴛ.ᴀᴄᴄᴇᴘᴛᴇᴅ ᴠᴀʟᴜᴇs ᴀʀᴇ 'yes', 'on', \ 'no', 'off'" + message.reply_text(reply) + else: + clean_status = sql.is_enabled(chat.id) + clean_status = "Enabled" if clean_status else "Disabled" + reply = f"ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ ғᴏʀ <b>{html.escape(chat.title)}</b> : <b>{clean_status}</b>" + + message.reply_text(reply, parse_mode=ParseMode.HTML) + + +@user_admin +def add_bluetext_ignore(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + args = context.args + if len(args) >= 1: + val = args[0].lower() + if added := sql.chat_ignore_command(chat.id, val): + reply = f"<b>{args[0]}</b> ʜᴀs ʙᴇᴇɴ ᴀᴅᴅᴇᴅ ᴛᴏ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴᴇʀ ɪɢɴᴏʀᴇ ʟɪsᴛ." + else: + reply = "ᴄᴏᴍᴍᴀɴᴅ ɪs ᴀʟʀᴇᴀᴅʏ ɪɢɴᴏʀᴇᴅ." + message.reply_text(reply, parse_mode=ParseMode.HTML) + + else: + reply = "ɴᴏ ᴄᴏᴍᴍᴀɴᴅ sᴜᴘᴘʟɪᴇᴅ ᴛᴏ ʙᴇ ɪɢɴᴏʀᴇᴅ." + message.reply_text(reply) + + +@user_admin +def remove_bluetext_ignore(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + args = context.args + if len(args) >= 1: + val = args[0].lower() + if removed := sql.chat_unignore_command(chat.id, val): + reply = ( + f"<b>{args[0]}</b> ʜᴀs ʙᴇᴇɴ ʀᴇᴍᴏᴠᴇᴅ ғʀᴏᴍ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴᴇʀ ɪɢɴᴏʀᴇ ʟɪsᴛ." + ) + else: + reply = "ᴄᴏᴍᴍᴀɴᴅ ɪsɴ'ᴛ ɪɢɴᴏʀᴇᴅ ᴄᴜʀʀᴇɴᴛʟʏ." + message.reply_text(reply, parse_mode=ParseMode.HTML) + + else: + reply = "ɴᴏ ᴄᴏᴍᴍᴀɴᴅ sᴜᴘᴘʟɪᴇᴅ ᴛᴏ ʙᴇ ᴜɴɪɢɴᴏʀᴇᴅ." + message.reply_text(reply) + + +@user_admin +def add_bluetext_ignore_global(update: Update, context: CallbackContext): + message = update.effective_message + args = context.args + if len(args) >= 1: + val = args[0].lower() + if added := sql.global_ignore_command(val): + reply = f"<b>{args[0]}</b> ʜᴀs ʙᴇᴇɴ ᴀᴅᴅᴇᴅ ᴛᴏ ɢʟᴏʙᴀʟ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴᴇʀ ɪɢɴᴏʀᴇ ʟɪsᴛ." + + else: + reply = "ᴄᴏᴍᴍᴀɴᴅ ɪs ᴀʟʀᴇᴀᴅʏ ɪɢɴᴏʀᴇᴅ." + message.reply_text(reply, parse_mode=ParseMode.HTML) + + else: + reply = "ɴᴏ ᴄᴏᴍᴍᴀɴᴅ sᴜᴘᴘʟɪᴇᴅ ᴛᴏ ʙᴇ ɪɢɴᴏʀᴇᴅ." + message.reply_text(reply) + + +@dev_plus +def remove_bluetext_ignore_global(update: Update, context: CallbackContext): + message = update.effective_message + args = context.args + if len(args) >= 1: + val = args[0].lower() + if removed := sql.global_unignore_command(val): + reply = f"<b>{args[0]}</b> ʜᴀs ʙᴇᴇɴ ʀᴇᴍᴏᴠᴇᴅ ғʀᴏᴍ ɢʟᴏʙᴀʟ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴᴇʀ ɪɢɴᴏʀᴇ ʟɪsᴛ." + + else: + reply = "ᴄᴏᴍᴍᴀɴᴅ ɪsɴ'ᴛ ɪɢɴᴏʀᴇᴅ ᴄᴜʀʀᴇɴᴛʟʏ." + message.reply_text(reply, parse_mode=ParseMode.HTML) + + else: + reply = "No ᴄᴏᴍᴍᴀɴᴅ sᴜᴘᴘʟɪᴇᴅ ᴛᴏ ʙᴇ ᴜɴɪɢɴᴏʀᴇᴅ." + message.reply_text(reply) + + +@dev_plus +def bluetext_ignore_list(update: Update, context: CallbackContext): + + message = update.effective_message + chat = update.effective_chat + + global_ignored_list, local_ignore_list = sql.get_all_ignored(chat.id) + text = "" + + if global_ignored_list: + text = "The ғᴏʟʟᴏᴡɪɴɢ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ɪɢɴᴏʀᴇᴅ ɢʟᴏʙʏᴀʟʟʏ ғʀᴏᴍ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ :\n" + + for x in global_ignored_list: + text += f" - <code>{x}</code>\n" + + if local_ignore_list: + text += "\nᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ɪɢɴᴏʀᴇᴅ ʟᴏᴄᴀʟʟʏ ғʀᴏᴍ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ :\n" + + for x in local_ignore_list: + text += f" - <code>{x}</code>\n" + + if text == "": + text = "ɴᴏ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ɪɢɴᴏʀᴇᴅ ғʀᴏᴍ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ." + message.reply_text(text) + return + + message.reply_text(text, parse_mode=ParseMode.HTML) + return + + +SET_CLEAN_BLUE_TEXT_HANDLER = CommandHandler( + "cleanblue", set_blue_text_must_click, run_async=True +) +ADD_CLEAN_BLUE_TEXT_HANDLER = CommandHandler( + "ignoreblue", add_bluetext_ignore, run_async=True +) +REMOVE_CLEAN_BLUE_TEXT_HANDLER = CommandHandler( + "unignoreblue", remove_bluetext_ignore, run_async=True +) +ADD_CLEAN_BLUE_TEXT_GLOBAL_HANDLER = CommandHandler( + "gignoreblue", + add_bluetext_ignore_global, + run_async=True, +) +REMOVE_CLEAN_BLUE_TEXT_GLOBAL_HANDLER = CommandHandler( + "ungignoreblue", + remove_bluetext_ignore_global, + run_async=True, +) +LIST_CLEAN_BLUE_TEXT_HANDLER = CommandHandler( + "listblue", bluetext_ignore_list, run_async=True +) +CLEAN_BLUE_TEXT_HANDLER = MessageHandler( + Filters.command & Filters.chat_type.groups, + clean_blue_text_must_click, + run_async=True, +) + +dispatcher.add_handler(SET_CLEAN_BLUE_TEXT_HANDLER) +dispatcher.add_handler(ADD_CLEAN_BLUE_TEXT_HANDLER) +dispatcher.add_handler(REMOVE_CLEAN_BLUE_TEXT_HANDLER) +dispatcher.add_handler(ADD_CLEAN_BLUE_TEXT_GLOBAL_HANDLER) +dispatcher.add_handler(REMOVE_CLEAN_BLUE_TEXT_GLOBAL_HANDLER) +dispatcher.add_handler(LIST_CLEAN_BLUE_TEXT_HANDLER) +dispatcher.add_handler(CLEAN_BLUE_TEXT_HANDLER, BLUE_TEXT_CLEAN_GROUP) + +__mod_name__ = "𝙲ʟᴇᴀɴɪɴɢ" +__handlers__ = [ + SET_CLEAN_BLUE_TEXT_HANDLER, + ADD_CLEAN_BLUE_TEXT_HANDLER, + REMOVE_CLEAN_BLUE_TEXT_HANDLER, + ADD_CLEAN_BLUE_TEXT_GLOBAL_HANDLER, + REMOVE_CLEAN_BLUE_TEXT_GLOBAL_HANDLER, + LIST_CLEAN_BLUE_TEXT_HANDLER, + (CLEAN_BLUE_TEXT_HANDLER, BLUE_TEXT_CLEAN_GROUP), +] + +__help__ = f""" +ʙʟᴜᴇ ᴛᴇxᴛ ᴄʟᴇᴀɴᴇʀ ʀᴇᴍᴏᴠᴇᴅ ᴀɴʏ ᴍᴀᴅᴇ ᴜᴘ ᴄᴏᴍᴍᴀɴᴅs ᴛʜᴀᴛ ᴘᴇᴏᴘʟᴇ sᴇɴᴅ ɪɴ ʏᴏᴜʀ ᴄʜᴀᴛ. + +• /cleanblue <on/off/yes/no>*:* `ᴄʟᴇᴀɴ ᴄᴏᴍᴍᴀɴᴅs ᴀғᴛᴇʀ sᴇɴᴅɪɴɢ` + +• /ignoreblue <word>*:* `ᴘʀᴇᴠᴇɴᴛ ᴀᴜᴛᴏ ᴄʟᴇᴀɴɪɴɢ ᴏғ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ` + +• /unignoreblue <word>*:* `ʀᴇᴍᴏᴠᴇ ᴘʀᴇᴠᴇɴᴛ ᴀᴜᴛᴏ ᴄʟᴇᴀɴɪɴɢ ᴏғ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅ ` + +• /listblue*:* `ʟɪsᴛ ᴄᴜʀʀᴇɴᴛʟʏ ᴡʜɪᴛᴇʟɪsᴛᴇᴅ ᴄᴏᴍᴍᴀɴᴅs ` + +*ᴏɴʟʏ ᴄᴏᴍᴍᴀɴᴅs, ᴀᴅᴍɪɴs ᴄᴀɴɴᴏᴛ ᴜsᴇ ᴛʜᴇsᴇ:* + +• /gignoreblue <word>*:* `ɢʟᴏʙᴀʟʟʏ ɪɢɴᴏʀᴇᴀ ʙʟᴜᴇᴛᴇxᴛ ᴄʟᴇᴀɴɪɴɢ ᴏғ sᴀᴠᴇᴅ ᴡᴏʀᴅ ᴀᴄʀᴏss` {BOT_NAME}. + +• /ungignoreblue <word>*:* `ʀᴇᴍᴏᴠᴇ sᴀɪᴅ ᴄᴏᴍᴍᴀɴᴅ ғʀᴏᴍ ɢʟᴏʙᴀʟ ᴄʟᴇᴀɴɪɴɢ ʟɪsᴛ ` +""" diff --git a/Exon/modules/connection.py b/Exon/modules/connection.py new file mode 100644 index 00000000..1beb49c4 --- /dev/null +++ b/Exon/modules/connection.py @@ -0,0 +1,463 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 +import time + +from telegram import Bot, InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.error import BadRequest, Unauthorized +from telegram.ext import CallbackQueryHandler, CommandHandler + +import Exon.modules.sql.connection_sql as sql +from Exon import DEV_USERS, DRAGONS, dispatcher +from Exon.modules.helper_funcs import chat_status +from Exon.modules.helper_funcs.alternate import send_message, typing_action + +user_admin = chat_status.user_admin + + +@user_admin +@typing_action +def allow_connections(update, context) -> str: + + chat = update.effective_chat + args = context.args + + if chat.type == chat.PRIVATE: + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ғᴏʀ ɢʀᴏᴜᴘ ᴏɴʟʏ. ɴᴏᴛ ɪɴ ᴘᴍ!", + ) + + elif len(args) >= 1: + var = args[0] + if var == "no": + sql.set_allow_connect_to_chat(chat.id, False) + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ", + ) + elif var == "yes": + sql.set_allow_connect_to_chat(chat.id, True) + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ʜᴀs ʙᴇᴇɴ ᴇɴᴀʙʟᴇᴅ ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ", + ) + else: + send_message( + update.effective_message, + "ᴘʟᴇᴀsᴇ ᴇɴᴛᴇʀ `yes` ᴏʀ `no`!", + parse_mode=ParseMode.MARKDOWN, + ) + elif get_settings := sql.allow_connect_to_chat(chat.id): + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴs ᴛᴏ ᴛʜɪs ɢʀᴏᴜᴘ ᴀʀᴇ *ᴀʟʟᴏᴡᴇᴅ* ғᴏʀ ᴍᴇᴍʙᴇʀs!", + parse_mode=ParseMode.MARKDOWN, + ) + else: + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴛᴏ ᴛʜɪs ɢʀᴏᴜᴘ ᴀʀᴇ *ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ* ғᴏʀ ᴍᴇᴍʙᴇʀs!", + parse_mode=ParseMode.MARKDOWN, + ) + + +@typing_action +def connection_chat(update, context): + + chat = update.effective_chat + user = update.effective_user + + conn = connected(context.bot, update, chat, user.id, need_admin=True) + + if conn: + chat = dispatcher.bot.getChat(conn) + chat_name = dispatcher.bot.getChat(conn).title + else: + if update.effective_message.chat.type != "private": + return + chat = update.effective_chat + chat_name = update.effective_message.chat.title + + if conn: + message = f"ʏᴏᴜ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ {chat_name}.\n" + else: + message = "ʏᴏᴜ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ɴᴏᴛ ᴄᴏɴɴᴇᴄᴛᴇᴅ ɪɴ ᴀɴʏ ɢʀᴏᴜᴘ.\n" + send_message(update.effective_message, message, parse_mode="markdown") + + +@typing_action +def connect_chat(update, context): + + chat = update.effective_chat + user = update.effective_user + args = context.args + + if update.effective_chat.type == "private": + if args and len(args) >= 1: + try: + connect_chat = int(args[0]) + getstatusadmin = context.bot.get_chat_member( + connect_chat, + update.effective_message.from_user.id, + ) + except ValueError: + try: + connect_chat = str(args[0]) + get_chat = context.bot.getChat(connect_chat) + connect_chat = get_chat.id + getstatusadmin = context.bot.get_chat_member( + connect_chat, + update.effective_message.from_user.id, + ) + except BadRequest: + send_message(update.effective_message, "ɪɴᴠᴀʟɪᴅ ᴄʜᴀᴛ ID!") + return + except BadRequest: + send_message(update.effective_message, "ɪɴᴠᴀʟɪᴅ ᴄʜᴀᴛ ID!") + return + + isadmin = getstatusadmin.status in ("administrator", "creator") + ismember = getstatusadmin.status in ("member") + isallow = sql.allow_connect_to_chat(connect_chat) + + if (isadmin) or (isallow and ismember) or (user.id in DRAGONS): + if connection_status := sql.connect( + update.effective_message.from_user.id, + connect_chat, + ): + conn_chat = dispatcher.bot.getChat( + connected(context.bot, update, chat, user.id, need_admin=False), + ) + chat_name = conn_chat.title + send_message( + update.effective_message, + f"sᴜᴄᴄᴇssғᴜʟʟʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ *{chat_name}*. \nᴜsᴇ /helpconnect ᴛᴏ ᴄʜᴇᴄᴋ ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs.", + parse_mode=ParseMode.MARKDOWN, + ) + + sql.add_history_conn(user.id, str(conn_chat.id), chat_name) + else: + send_message(update.effective_message, "Connection failed!") + else: + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴛᴏ ᴛʜɪs ᴄʜᴀᴛ ɪs ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ!", + ) + else: + gethistory = sql.get_history_conn(user.id) + if gethistory: + buttons = [ + InlineKeyboardButton( + text="⛔ ᴄʟᴏsᴇ ʙᴜᴛᴛᴏɴ", + callback_data="connect_close", + ), + InlineKeyboardButton( + text="🧹 ᴄʟᴇᴀʀ ʜɪsᴛᴏʀʏ", + callback_data="connect_clear", + ), + ] + else: + buttons = [] + if conn := connected(context.bot, update, chat, user.id, need_admin=False): + connectedchat = dispatcher.bot.getChat(conn) + text = ( + f"ғ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ *{connectedchat.title}* (`{conn}`)" + ) + buttons.append( + InlineKeyboardButton( + text="🔌 ᴅɪsᴄᴏɴɴᴇᴄᴛ", + callback_data="connect_disconnect", + ), + ) + else: + text = "ᴡʀɪᴛᴇ ᴛʜᴇ ᴄʜᴀᴛ ɪᴅ ᴏʀ ᴛᴀɢ ᴛᴏ ᴄᴏɴɴᴇᴄᴛ!" + if gethistory: + text += "\n\n*Connection history:*\n" + text += "╒═══「 *ɪɴғᴏ* 」\n" + text += "│ sᴏʀᴛᴇᴅ: `ɴᴇᴡᴇsᴛ`\n" + text += "│\n" + buttons = [buttons] + for x in sorted(gethistory.keys(), reverse=True): + htime = time.strftime("%ᴅ/%ᴍ/%ʏ", time.localtime(x)) + text += f'╞═「 *{gethistory[x]["chat_name"]}* 」\n│ `{gethistory[x]["chat_id"]}`\n│ `{htime}`\n' + + text += "│\n" + buttons.append( + [ + InlineKeyboardButton( + text=gethistory[x]["chat_name"], + callback_data=f'connect({gethistory[x]["chat_id"]})', + ) + ] + ) + + text += "╘══「 ᴛᴏᴛᴀʟ {} ᴄʜᴀᴛs 」".format( + f"{len(gethistory)} (max)" + if len(gethistory) == 5 + else str(len(gethistory)) + ) + + conn_hist = InlineKeyboardMarkup(buttons) + elif buttons: + conn_hist = InlineKeyboardMarkup([buttons]) + else: + conn_hist = None + send_message( + update.effective_message, + text, + parse_mode="markdown", + reply_markup=conn_hist, + ) + + else: + getstatusadmin = context.bot.get_chat_member( + chat.id, + update.effective_message.from_user.id, + ) + isadmin = getstatusadmin.status in ("administrator", "creator") + ismember = getstatusadmin.status in ("member") + isallow = sql.allow_connect_to_chat(chat.id) + if (isadmin) or (isallow and ismember) or (user.id in DRAGONS): + if connection_status := sql.connect( + update.effective_message.from_user.id, + chat.id, + ): + chat_name = dispatcher.bot.getChat(chat.id).title + send_message( + update.effective_message, + f"sᴜᴄᴄᴇssғᴜʟʟʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ *{chat_name}*.", + parse_mode=ParseMode.MARKDOWN, + ) + + try: + sql.add_history_conn(user.id, str(chat.id), chat_name) + context.bot.send_message( + update.effective_message.from_user.id, + f"ʏᴏᴜ ᴀʀᴇ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ *{chat_name}*. \nᴜsᴇ `/helpconnect` ᴛᴏ ᴄʜᴇᴄᴋ ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs.", + parse_mode="markdown", + ) + + except (BadRequest, Unauthorized): + pass + else: + send_message(update.effective_message, "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ғᴀɪʟᴇᴅ!") + else: + send_message( + update.effective_message, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴛᴏ ᴛʜɪs ᴄʜᴀᴛ ɪs ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ!", + ) + + +def disconnect_chat(update, context): + + if update.effective_chat.type == "private": + if disconnection_status := sql.disconnect( + update.effective_message.from_user.id + ): + sql.disconnected_chat = send_message( + update.effective_message, + "ᴅɪsᴄᴏɴɴᴇᴄᴛᴇᴅ ғʀᴏᴍ ᴄʜᴀᴛ!", + ) + else: + send_message(update.effective_message, "ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴄᴏɴɴᴇᴄᴛᴇᴅ!") + else: + send_message(update.effective_message, "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴏɴʟʏ ᴀᴠᴀɪʟᴀʙʟᴇ ɪɴ PM.") + + +def connected(bot: Bot, update: Update, chat, user_id, need_admin=True): + user = update.effective_user + + if chat.type == chat.PRIVATE and sql.get_connected_chat(user_id): + + conn_id = sql.get_connected_chat(user_id).chat_id + getstatusadmin = bot.get_chat_member( + conn_id, + update.effective_message.from_user.id, + ) + isadmin = getstatusadmin.status in ("administrator", "creator") + ismember = getstatusadmin.status in ("member") + isallow = sql.allow_connect_to_chat(conn_id) + + if ( + (isadmin) + or (isallow and ismember) + or (user.id in DRAGONS) + or (user.id in DEV_USERS) + ): + if need_admin is True: + if ( + getstatusadmin.status in ("administrator", "creator") + or user_id in DRAGONS + or user.id in DEV_USERS + ): + return conn_id + send_message( + update.effective_message, + "ʏᴏᴜ ᴍᴜsᴛ ʙᴇ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜᴇ ᴄᴏɴɴᴇᴄᴛᴇᴅ ɢʀᴏᴜᴘ!", + ) + else: + return conn_id + else: + send_message( + update.effective_message, + "ᴛʜᴇ ɢʀᴏᴜᴘ ᴄʜᴀɴɢᴇᴅ ᴛʜᴇ ᴄᴏɴɴᴇᴄᴛɪᴏɴ ʀɪɢʜᴛs ᴏʀ ʏᴏᴜ ᴀʀᴇ ɴᴏ ʟᴏɴɢᴇʀ ᴀɴ ᴀᴅᴍɪɴ.\nI'ᴠᴇ ᴅɪsᴄᴏɴɴᴇᴄᴛᴇᴅ ʏᴏᴜ.", + ) + disconnect_chat(update, bot) + else: + return False + + +CONN_HELP = """ +ᴀᴄᴛɪᴏɴs ᴡʜɪᴄʜ ᴀʀᴇ ᴀᴠᴀɪʟᴀʙʟᴇ ᴡɪᴛʜ ᴄᴏɴɴᴇᴄᴛᴇᴅ ɢʀᴏᴜᴘs:- +*ᴜsᴇʀ ᴀᴄᴛɪᴏɴs:* +• ᴠɪᴇᴡ ɴᴏᴛᴇs +• ᴠɪᴇᴡ ғɪʟᴛᴇʀs +• ᴠɪᴇᴡ ʙʟᴀᴄᴋʟɪsᴛ +• ᴠɪᴇᴡ ᴀɴᴛɪғʟᴏᴏᴅ sᴇᴛᴛɪɴɢs +• ᴠɪᴇᴡ ᴅɪsᴀʙʟᴇᴅ ᴄᴏᴍᴍᴀɴᴅs +• ᴍᴀɴʏ ᴍᴏʀᴇ ɪɴ ғᴜᴛᴜʀᴇ +! +*ᴀᴅᴍɪɴ ᴀᴄᴛɪᴏɴs:* + • View ᴀɴᴅ ᴇᴅɪᴛ ɴᴏᴛᴇs + • ᴠɪᴇᴡ ᴀɴᴅ ᴇᴅɪᴛ ғɪʟᴛᴇʀs. + • ɢᴇᴛ ɪɴᴠɪᴛᴇ ʟɪɴᴋ ᴏғ ᴄʜᴀᴛ. + • sᴇᴛ ᴀɴᴅ ᴄᴏɴᴛʀᴏʟ ᴀɴᴛɪғʟᴏᴏᴅ sᴇᴛᴛɪɴɢs. + • sᴇᴛ ᴀɴᴅ ᴄᴏɴᴛʀᴏʟ ʙʟᴀᴄᴋʟɪsᴛ sᴇᴛᴛɪɴɢs. + • Set ʟᴏᴄᴋs ᴀɴᴅ ᴜɴʟᴏᴄᴋs ɪɴ ᴄʜᴀᴛ. + • ᴇɴᴀʙʟᴇ and ᴅɪsᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs in chat. + • ᴇxᴘᴏʀᴛ ᴀɴᴅ Imports ᴏғ ᴄʜᴀᴛ ʙᴀᴄᴋᴜᴘ. + • ᴍᴏʀᴇ ɪɴ ғᴜᴛᴜʀᴇ! +""" + + +def help_connect_chat(update, context): + + context.args + + if update.effective_message.chat.type != "private": + send_message(update.effective_message, "PM ᴍᴇ ᴡɪᴛʜ ᴛʜᴀᴛ ᴄᴏᴍᴍᴀɴᴅ ᴛᴏ ɢᴇᴛ ʜᴇʟᴘ.") + return + send_message(update.effective_message, CONN_HELP, parse_mode="markdown") + + +def connect_button(update, context): + + query = update.callback_query + chat = update.effective_chat + user = update.effective_user + + connect_match = re.match(r"connect\((.+?)\)", query.data) + disconnect_match = query.data == "connect_disconnect" + clear_match = query.data == "connect_clear" + connect_close = query.data == "connect_close" + + if connect_match: + target_chat = connect_match[1] + getstatusadmin = context.bot.get_chat_member(target_chat, query.from_user.id) + isadmin = getstatusadmin.status in ("administrator", "creator") + ismember = getstatusadmin.status in ("member") + isallow = sql.allow_connect_to_chat(target_chat) + + if (isadmin) or (isallow and ismember) or (user.id in DRAGONS): + if connection_status := sql.connect(query.from_user.id, target_chat): + conn_chat = dispatcher.bot.getChat( + connected(context.bot, update, chat, user.id, need_admin=False), + ) + chat_name = conn_chat.title + query.message.edit_text( + f"sᴜᴄᴄᴇssғᴜʟʟʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴛᴏ *{chat_name}*. \nᴜsᴇ `/helpconnect` ᴛᴏ ᴄʜᴇᴄᴋ ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs.", + parse_mode=ParseMode.MARKDOWN, + ) + + sql.add_history_conn(user.id, str(conn_chat.id), chat_name) + else: + query.message.edit_text("ᴄᴏɴɴᴇᴄᴛɪᴏɴ ғᴀɪʟᴇᴅ!") + else: + context.bot.answer_callback_query( + query.id, + "ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴛᴏ ᴛʜɪs ᴄʜᴀᴛ ɪs ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ!", + show_alert=True, + ) + elif disconnect_match: + if disconnection_status := sql.disconnect(query.from_user.id): + sql.disconnected_chat = query.message.edit_text("Disconnected from chat!") + else: + context.bot.answer_callback_query( + query.id, + "ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴄᴏɴɴᴇᴄᴛᴇᴅ!", + show_alert=True, + ) + elif clear_match: + sql.clear_history_conn(query.from_user.id) + query.message.edit_text("ʜɪsᴛᴏʀʏ ᴄᴏɴɴᴇᴄᴛᴇᴅ ʜᴀs ʙᴇᴇɴ ᴄʟᴇᴀʀᴇᴅ!") + elif connect_close: + query.message.edit_text("ᴄʟᴏsᴇᴅ.\nᴛᴏ ᴏᴘᴇɴ ᴀɢᴀɪɴ, ᴛʏᴘᴇ /connect") + else: + connect_chat(update, context) + + +__mod_name__ = "𝙲ᴏɴɴᴇᴄᴛs" + +__help__ = """ +*sᴏᴍᴇᴛɪᴍᴇs, ʏᴏᴜ ᴊᴜsᴛ ᴡᴀɴᴛ ᴛᴏ ᴀᴅᴅ sᴏᴍᴇ ɴᴏᴛᴇs ᴀɴᴅ ғɪʟᴛᴇʀs ᴛᴏ ᴀ ɢʀᴏᴜᴘ ᴄʜᴀᴛ, ʙᴜᴛ ʏᴏᴜ ᴅᴏɴ'ᴛ ᴡᴀɴᴛ ᴇᴠᴇʀʏᴏɴᴇ ᴛᴏ sᴇᴇ; ᴛʜɪs ɪs ᴡʜᴇʀᴇ ᴄᴏɴɴᴇᴄᴛɪᴏɴs ᴄᴏᴍᴇ ɪɴ... +ᴛʜɪs ᴀʟʟᴏᴡs ʏᴏᴜ ᴛᴏ ᴄᴏɴɴᴇᴄᴛ ᴛᴏ ᴀ ᴄʜᴀᴛ's ᴅᴀᴛᴀʙᴀsᴇ, ᴀɴᴅ ᴀᴅᴅ ᴛʜɪɴɢs ᴛᴏ ɪᴛ ᴡɪᴛʜᴏᴜᴛ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅs ᴀᴘᴘᴇᴀʀɪɴɢ ɪɴ ᴄʜᴀᴛ! ғᴏʀ ᴏʙᴠɪᴏᴜs ʀᴇᴀsᴏɴs, ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴀɴ ᴀᴅᴍɪɴ ᴛᴏ ᴀᴅᴅ ᴛʜɪɴɢs; ʙᴜᴛ ᴀɴʏ ᴍᴇᴍʙᴇʀ ɪɴ ᴛʜᴇ ɢʀᴏᴜᴘ ᴄᴀɴ ᴠɪᴇᴡ ʏᴏᴜʀ ᴅᴀᴛᴀ.* + + +❂ /connect: `ᴄᴏɴɴᴇᴄᴛꜱ ᴛᴏ ᴄʜᴀᴛ` (ᴄᴀɴ ʙᴇ ᴅᴏɴᴇ ɪɴ ᴀ ɢʀᴏᴜᴘ ʙʏ /connect ᴏʀ /connect <chat id> ɪɴ ᴘᴍ) + +❂ /connection: `ʟɪꜱᴛ ᴄᴏɴɴᴇᴄᴛᴇᴅ ᴄʜᴀᴛꜱ` + +❂ /disconnect: `ᴅɪꜱᴄᴏɴɴᴇᴄᴛ ғʀᴏᴍ ᴀ ᴄʜᴀᴛ` + +❂ /helpconnect: `ʟɪꜱᴛ ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅꜱ ᴛʜᴀᴛ ᴄᴀɴ ʙᴇ ᴜꜱᴇᴅ ʀᴇᴍᴏᴛᴇʟʏ` + +*ᴀᴅᴍɪɴ ᴏɴʟʏ:* + +❂ /allowconnect <yes/no>: `ᴀʟʟᴏᴡ ᴀ ᴜꜱᴇʀ ᴛᴏ ᴄᴏɴɴᴇᴄᴛ ᴛᴏ ᴀ ᴄʜᴀᴛ` + +""" + +CONNECT_CHAT_HANDLER = CommandHandler( + "connect", connect_chat, pass_args=True, run_async=True +) +CONNECTION_CHAT_HANDLER = CommandHandler("connection", connection_chat, run_async=True) +DISCONNECT_CHAT_HANDLER = CommandHandler("disconnect", disconnect_chat, run_async=True) +ALLOW_CONNECTIONS_HANDLER = CommandHandler( + "allowconnect", allow_connections, pass_args=True, run_async=True +) +HELP_CONNECT_CHAT_HANDLER = CommandHandler( + "helpconnect", help_connect_chat, run_async=True +) +CONNECT_BTN_HANDLER = CallbackQueryHandler( + connect_button, pattern=r"connect", run_async=True +) + +dispatcher.add_handler(CONNECT_CHAT_HANDLER) +dispatcher.add_handler(CONNECTION_CHAT_HANDLER) +dispatcher.add_handler(DISCONNECT_CHAT_HANDLER) +dispatcher.add_handler(ALLOW_CONNECTIONS_HANDLER) +dispatcher.add_handler(HELP_CONNECT_CHAT_HANDLER) +dispatcher.add_handler(CONNECT_BTN_HANDLER) diff --git a/Exon/modules/cust_filters.py b/Exon/modules/cust_filters.py new file mode 100644 index 00000000..daa6da96 --- /dev/null +++ b/Exon/modules/cust_filters.py @@ -0,0 +1,608 @@ +""" +MIT License +Copyright (c) 2022 Aʙɪsʜɴᴏɪ +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 html import escape +from typing import Optional + +import telegram +from telegram import ( + Chat, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, + ParseMode, +) +from telegram.error import BadRequest +from telegram.ext import DispatcherHandlerStop, Filters +from telegram.utils.helpers import escape_markdown, mention_html + +from Exon import DRAGONS as SUDO_USERS +from Exon import LOGGER as log +from Exon import dispatcher +from Exon.modules.connection import connected +from Exon.modules.helper_funcs.alternate import send_message, typing_action +from Exon.modules.helper_funcs.decorators import Exoncallback, Exoncmd, Exonmsg +from Exon.modules.helper_funcs.extraction import extract_text +from Exon.modules.helper_funcs.filters import CustomFilters +from Exon.modules.helper_funcs.misc import build_keyboard_parser +from Exon.modules.helper_funcs.msg_types import get_filter_type +from Exon.modules.helper_funcs.string_handling import ( + button_markdown_parser, + escape_invalid_curly_brackets, + markdown_to_html, + split_quotes, +) +from Exon.modules.sql import cust_filters_sql as sql + +from ..modules.helper_funcs.anonymous import AdminPerms, user_admin + +HANDLER_GROUP = 10 + +ENUM_FUNC_MAP = { + sql.Types.TEXT.value: dispatcher.bot.send_message, + sql.Types.BUTTON_TEXT.value: dispatcher.bot.send_message, + sql.Types.STICKER.value: dispatcher.bot.send_sticker, + sql.Types.DOCUMENT.value: dispatcher.bot.send_document, + sql.Types.PHOTO.value: dispatcher.bot.send_photo, + sql.Types.AUDIO.value: dispatcher.bot.send_audio, + sql.Types.VOICE.value: dispatcher.bot.send_voice, + sql.Types.VIDEO.value: dispatcher.bot.send_video, + # sql.Types.VIDEO_NOTE.value: dispatcher.bot.send_video_note +} + + +@typing_action +@Exoncmd(command="filters", admin_ok=True) +def list_handlers(update, context): + chat = update.effective_chat + user = update.effective_user + + conn = connected(context.bot, update, chat, user.id, need_admin=False) + if conn is not False: + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + filter_list = "*Filter in {}:*\n" + else: + chat_id = update.effective_chat.id + if chat.type == "private": + chat_name = "Local filters" + filter_list = "*local filters:*\n" + else: + chat_name = chat.title + filter_list = "*Filters in {}*:\n" + + all_handlers = sql.get_chat_triggers(chat_id) + + if not all_handlers: + send_message( + update.effective_message, "No filters saved in {}!".format(chat_name) + ) + return + + for keyword in all_handlers: + entry = " • `{}`\n".format(escape_markdown(keyword)) + if len(entry) + len(filter_list) > telegram.MAX_MESSAGE_LENGTH: + send_message( + update.effective_message, + filter_list.format(chat_name), + parse_mode=telegram.ParseMode.MARKDOWN, + ) + filter_list = entry + else: + filter_list += entry + + send_message( + update.effective_message, + filter_list.format(chat_name), + parse_mode=telegram.ParseMode.MARKDOWN, + ) + + +# NOT ASYNC BECAUSE DISPATCHER HANDLER RAISED +@Exoncmd(command="filter", run_async=False) +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@typing_action +def filters(update, context): # sourcery no-metrics + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + args = msg.text.split( + None, 1 + ) # use python's maxsplit to separate Cmd, keyword, and reply_text + + conn = connected(context.bot, update, chat, user.id) + if conn is not False: + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + chat_name = "local filters" if chat.type == "private" else chat.title + if not msg.reply_to_message and len(args) < 2: + send_message( + update.effective_message, + "Please provide keyboard keyword for this filter to reply with!", + ) + return + + if msg.reply_to_message: + if len(args) < 2: + send_message( + update.effective_message, + "Please provide keyword for this filter to reply with!", + ) + return + else: + keyword = args[1] + else: + extracted = split_quotes(args[1]) + if len(extracted) < 1: + return + # set trigger -> lower, so as to avoid adding duplicate filters with different cases + keyword = extracted[0].lower() + + # Add the filter + # Note: perhaps handlers can be removed somehow using sql.get_chat_filters + for handler in dispatcher.handlers.get(HANDLER_GROUP, []): + if handler.filters == (keyword, chat_id): + dispatcher.remove_handler(handler, HANDLER_GROUP) + + text, file_type, file_id = get_filter_type(msg) + if not msg.reply_to_message and len(extracted) >= 2: + offset = len(extracted[1]) - len( + msg.text + ) # set correct offset relative to command + notename + text, buttons = button_markdown_parser( + extracted[1], entities=msg.parse_entities(), offset=offset + ) + text = text.strip() + if not text: + send_message( + update.effective_message, + "There is no filter message - You can't JUST have buttons, you need a message to go with it!", + ) + return + + elif msg.reply_to_message and len(args) >= 2: + if msg.reply_to_message.text: + text_to_parsing = msg.reply_to_message.text + elif msg.reply_to_message.caption: + text_to_parsing = msg.reply_to_message.caption + else: + text_to_parsing = "" + offset = len( + text_to_parsing + ) # set correct offset relative to command + notename + text, buttons = button_markdown_parser( + text_to_parsing, entities=msg.parse_entities(), offset=offset + ) + text = text.strip() + + elif not text and not file_type: + send_message( + update.effective_message, + "Please provide keyword for this filter reply with!", + ) + return + + elif msg.reply_to_message: + if msg.reply_to_message.text: + text_to_parsing = msg.reply_to_message.text + elif msg.reply_to_message.caption: + text_to_parsing = msg.reply_to_message.caption + else: + text_to_parsing = "" + offset = len( + text_to_parsing + ) # set correct offset relative to command + notename + text, buttons = button_markdown_parser( + text_to_parsing, entities=msg.parse_entities(), offset=offset + ) + text = text.strip() + if (msg.reply_to_message.text or msg.reply_to_message.caption) and not text: + send_message( + update.effective_message, + "There is no filter message - You can't JUST have buttons, you need a message to go with it!", + ) + return + + else: + send_message(update.effective_message, "Invalid filter!") + return + + add = addnew_filter(update, chat_id, keyword, text, file_type, file_id, buttons) + # This is an old method + # sql.add_filter(chat_id, keyword, content, is_sticker, is_document, is_image, is_audio, is_voice, is_video, buttons) + + if add is True: + send_message( + update.effective_message, + "Saved filter '{}' in *{}*!".format(keyword, chat_name), + parse_mode=telegram.ParseMode.MARKDOWN, + ) + raise DispatcherHandlerStop + + +# NOT ASYNC BECAUSE DISPATCHER HANDLER RAISED +@Exoncmd(command="stop", run_async=False) +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@typing_action +def stop_filter(update, context): + chat = update.effective_chat + user = update.effective_user + args = update.effective_message.text.split(None, 1) + + conn = connected(context.bot, update, chat, user.id) + if conn is not False: + chat_id = conn + chat_name = dispatcher.bot.getChat(conn).title + else: + chat_id = update.effective_chat.id + chat_name = "Local filters" if chat.type == "private" else chat.title + if len(args) < 2: + send_message(update.effective_message, "What should i stop?") + return + + chat_filters = sql.get_chat_triggers(chat_id) + + if not chat_filters: + send_message(update.effective_message, "No filters active here!") + return + + for keyword in chat_filters: + if keyword == args[1]: + sql.remove_filter(chat_id, args[1]) + send_message( + update.effective_message, + "Okay, I'll stop replying to that filter in *{}*.".format(chat_name), + parse_mode=telegram.ParseMode.MARKDOWN, + ) + raise DispatcherHandlerStop + + send_message( + update.effective_message, + "That's not a filter - Click: /filters to get currently active filters.", + ) + + +@Exonmsg((CustomFilters.has_text & ~Filters.update.edited_message)) +def reply_filter(update, context): # sourcery no-metrics + chat = update.effective_chat # type: Optional[Chat] + message = update.effective_message # type: Optional[Message] + + if not update.effective_user or update.effective_user.id == 777000: + return + to_match = extract_text(message) + if not to_match: + return + + chat_filters = sql.get_chat_triggers(chat.id) + for keyword in chat_filters: + pattern = r"( |^|[^\w])" + re.escape(keyword) + r"( |$|[^\w])" + if re.search(pattern, to_match, flags=re.IGNORECASE): + filt = sql.get_filter(chat.id, keyword) + if filt.reply == "there is should be a new reply": + buttons = sql.get_buttons(chat.id, filt.keyword) + keyb = build_keyboard_parser(context.bot, chat.id, buttons) + keyboard = InlineKeyboardMarkup(keyb) + + VALID_WELCOME_FORMATTERS = [ + "first", + "last", + "fullname", + "username", + "id", + "chatname", + "mention", + ] + if filt.reply_text: + valid_format = escape_invalid_curly_brackets( + markdown_to_html(filt.reply_text), VALID_WELCOME_FORMATTERS + ) + if valid_format: + filtext = valid_format.format( + first=escape(message.from_user.first_name), + last=escape( + message.from_user.last_name + or message.from_user.first_name + ), + fullname=" ".join( + [ + escape(message.from_user.first_name), + escape(message.from_user.last_name), + ] + if message.from_user.last_name + else [escape(message.from_user.first_name)] + ), + username="@" + escape(message.from_user.username) + if message.from_user.username + else mention_html( + message.from_user.id, message.from_user.first_name + ), + mention=mention_html( + message.from_user.id, message.from_user.first_name + ), + chatname=escape(message.chat.title) + if message.chat.type != "private" + else escape(message.from_user.first_name), + id=message.from_user.id, + ) + else: + filtext = "" + else: + filtext = "" + + if filt.file_type in (sql.Types.BUTTON_TEXT, sql.Types.TEXT): + try: + context.bot.send_message( + chat.id, + filtext, + reply_to_message_id=message.message_id, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + except BadRequest as excp: + error_catch = get_exception(excp, filt, chat) + if error_catch == "noreply": + try: + context.bot.send_message( + chat.id, + filtext, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + except BadRequest as excp: + log.exception("Error in filters: " + excp.message) + send_message( + update.effective_message, + get_exception(excp, filt, chat), + ) + else: + try: + send_message( + update.effective_message, + get_exception(excp, filt, chat), + ) + except BadRequest as excp: + log.exception("Failed to send message: " + excp.message) + elif ENUM_FUNC_MAP[filt.file_type] == dispatcher.bot.send_sticker: + ENUM_FUNC_MAP[filt.file_type]( + chat.id, + filt.file_id, + reply_to_message_id=message.message_id, + reply_markup=keyboard, + ) + else: + ENUM_FUNC_MAP[filt.file_type]( + chat.id, + filt.file_id, + caption=filtext, + reply_to_message_id=message.message_id, + parse_mode=ParseMode.HTML, + reply_markup=keyboard, + ) + elif filt.is_sticker: + message.reply_sticker(filt.reply) + elif filt.is_document: + message.reply_document(filt.reply) + elif filt.is_image: + message.reply_photo(filt.reply) + elif filt.is_audio: + message.reply_audio(filt.reply) + elif filt.is_voice: + message.reply_voice(filt.reply) + elif filt.is_video: + message.reply_video(filt.reply) + elif filt.has_markdown: + buttons = sql.get_buttons(chat.id, filt.keyword) + keyb = build_keyboard_parser(context.bot, chat.id, buttons) + keyboard = InlineKeyboardMarkup(keyb) + + try: + send_message( + update.effective_message, + filt.reply, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + except BadRequest as excp: + if excp.message == "Unsupported url protocol": + try: + send_message( + update.effective_message, + "You seem to be trying to use an unsupported url protocol. " + "Telegram doesn't support buttons for some protocols, such as tg://. Please try " + "again...", + ) + except BadRequest as excp: + log.exception("Error in filters: " + excp.message) + elif excp.message == "Reply message not found": + try: + context.bot.send_message( + chat.id, + filt.reply, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + except BadRequest as excp: + log.exception("Error in filters: " + excp.message) + else: + try: + send_message( + update.effective_message, + "This message couldn't be sent as it's incorrectly formatted.", + ) + except BadRequest as excp: + log.exception("Error in filters: " + excp.message) + log.warning("Message %s could not be parsed", str(filt.reply)) + log.exception( + "Could not parse filter %s in chat %s", + str(filt.keyword), + str(chat.id), + ) + + else: + # LEGACY - all new filters will have has_markdown set to True. + try: + send_message(update.effective_message, filt.reply) + except BadRequest as excp: + log.exception("Error in filters: " + excp.message) + break + + +@Exoncmd(command="removeallfilters", filters=Filters.chat_type.groups) +def rmall_filters(update, _): + chat = update.effective_chat + user = update.effective_user + member = chat.get_member(user.id) + if member.status != "creator" and user.id not in SUDO_USERS: + update.effective_message.reply_text( + "Only the chat owner can clear all notes at once." + ) + else: + buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Stop all filters", callback_data="filters_rmall" + ) + ], + [InlineKeyboardButton(text="Cancel", callback_data="filters_cancel")], + ] + ) + update.effective_message.reply_text( + f"Are you sure you would like to stop ALL filters in {chat.title}? This action cannot be undone.", + reply_markup=buttons, + parse_mode=ParseMode.MARKDOWN, + ) + + +@Exoncallback(pattern=r"filters_.*") +def rmall_callback(update, _): + query = update.callback_query + chat = update.effective_chat + msg = update.effective_message + member = chat.get_member(query.from_user.id) + if query.data == "filters_rmall": + if member.status == "creator" or query.from_user.id in SUDO_USERS: + allfilters = sql.get_chat_triggers(chat.id) + if not allfilters: + msg.edit_text("No filters in this chat, nothing to stop!") + return + + count = 0 + filterlist = [] + for x in allfilters: + count += 1 + filterlist.append(x) + + for i in filterlist: + sql.remove_filter(chat.id, i) + + msg.edit_text(f"Cleaned {count} filters in {chat.title}") + + if member.status == "administrator": + query.answer("Only owner of the chat can do this.") + + if member.status == "member": + query.answer("You need to be admin to do this.") + elif query.data == "filters_cancel": + if member.status == "creator" or query.from_user.id in SUDO_USERS: + msg.edit_text("Clearing of all filters has been cancelled.") + return + if member.status == "administrator": + query.answer("Only owner of the chat can do this.") + if member.status == "member": + query.answer("You need to be admin to do this.") + + +# NOT ASYNC NOT A HANDLER +def get_exception(excp, filt, chat): + if excp.message == "Unsupported url protocol": + return "You seem to be trying to use the URL protocol which is not supported. Telegram does not support key for multiple protocols, such as tg: //. Please try again!" + elif excp.message == "Reply message not found": + return "noreply" + else: + log.warning("Message %s could not be parsed", str(filt.reply)) + log.exception( + "Could not parse filter %s in chat %s", str(filt.keyword), str(chat.id) + ) + return "This data could not be sent because it is incorrectly formatted." + + +# NOT ASYNC NOT A HANDLER +def addnew_filter(update, chat_id, keyword, text, file_type, file_id, buttons): + msg = update.effective_message + totalfilt = sql.get_chat_triggers(chat_id) + if len(totalfilt) >= 1000: # Idk why i made this like function.... + msg.reply_text("This group has reached its max filters limit of 150.") + return False + else: + sql.new_add_filter(chat_id, keyword, text, file_type, file_id, buttons) + return True + + +def __stats__(): + return "•➥ {} ғɪʟᴛᴇʀs, ᴀᴄʀᴏss {} ᴄʜᴀᴛs.".format(sql.num_filters(), sql.num_chats()) + + +def __import_data__(chat_id, data): + # set chat filters + filters = data.get("filters", {}) + for trigger in filters: + sql.add_to_blacklist(chat_id, trigger) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, _): + cust_filters = sql.get_chat_triggers(chat_id) + return "ᴛʜᴇʀᴇ ᴀʀᴇ `{}` ᴄᴜsᴛᴏᴍ ғɪʟᴛᴇʀs ʜᴇʀᴇ.".format(len(cust_filters)) + + +__help__ = """ +❂ /filters*:* `ʟɪꜱᴛ ᴀʟʟ ᴀᴄᴛɪᴠᴇ ғɪʟᴛᴇʀꜱ ꜱᴀᴠᴇᴅ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ` +*ᴀᴅᴍɪɴ ᴏɴʟʏ:* +❂ /filter <keyword> <reply message>*:* ᴀᴅᴅ a ғɪʟᴛᴇʀ ᴛᴏ ᴛʜɪꜱ chat. ᴛʜᴇ ʙᴏᴛ ᴡɪʟʟ ɴᴏᴡ ʀᴇᴘʟʏ ᴛʜᴀᴛ ᴍᴇꜱꜱᴀɢᴇ ᴡʜᴇɴᴇᴠᴇʀ 'ᴋᴇʏᴡᴏʀᴅ +ɪꜱ ᴍᴇɴᴛɪᴏɴᴇᴅ. ɪғ ʏᴏᴜ ʀᴇᴘʟʏ ᴛᴏ ᴀ ꜱᴛɪᴄᴋᴇʀ ᴡɪᴛʜ ᴀ ᴋᴇʏᴡᴏʀᴅ, ᴛʜᴇ ʙᴏᴛ ᴡɪʟʟ ʀᴇᴘʟʏ ᴡɪᴛʜ ᴛʜᴀᴛ ꜱᴛɪᴄᴋᴇʀ. ɴᴏᴛᴇ: ᴀʟʟ ғɪʟᴛᴇʀ +ᴋᴇʏᴡᴏʀᴅꜱ ᴀʀᴇ ɪɴ ʟᴏᴡᴇʀᴄᴀꜱᴇ. ɪғ ʏᴏᴜ ᴡᴀɴᴛ ʏᴏᴜʀ ᴋᴇʏᴡᴏʀᴅ ᴛᴏ ʙᴇ ᴀ ꜱᴇɴᴛᴇɴᴄᴇꜱ, ᴜꜱᴇ ϙᴜᴏᴛᴇꜱ. ᴇɢ: /filter "hey there" ʜᴇʏ ʜᴇʟʟᴏ + ꜱᴇᴘᴀʀᴀᴛᴇ ᴅɪғғ ʀᴇᴘʟɪᴇꜱ ʙʏ `%%%` ᴛᴏ ɢᴇᴛ ʀᴀɴᴅᴏᴍ ʀᴇᴘʟɪᴇꜱ + + *ᴇxᴀᴍᴘʟᴇ:* + `/filter "filtername" + Reply 1 + %%% + Reply 2 + %%% + Reply 3` +❂ /stop <filter keyword>*:* `ꜱᴛᴏᴘ ᴛʜᴀᴛ ғɪʟᴛᴇʀ` +*ᴄʜᴀᴛ creator only:* +❂ /removeallfilters*:* `ʀᴇᴍᴏᴠᴇ ᴀʟʟ ᴄʜᴀᴛ ғɪʟᴛᴇʀꜱ ᴀᴛ ᴏɴᴄᴇ`. +*ɴᴏᴛᴇ*: ғɪʟᴛᴇʀꜱ ᴀʟꜱᴏ ꜱᴜᴘᴘᴏʀᴛ ᴍᴀʀᴋᴅᴏᴡɴ formatters like: {first}, {last} ᴇᴛᴄ.. ᴀɴᴅ ʙᴜᴛᴛᴏɴꜱ. +ᴄʜᴇᴄᴋ /markdownhelp ᴛᴏ ᴋɴᴏᴡ ᴍᴏʀᴇ! +""" +__mod_name__ = "𝙵ɪʟᴛᴇʀs" diff --git a/Exon/modules/dbcleanup.py b/Exon/modules/dbcleanup.py new file mode 100644 index 00000000..1d0d5c0d --- /dev/null +++ b/Exon/modules/dbcleanup.py @@ -0,0 +1,209 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 time import sleep + +from telegram import Bot, InlineKeyboardButton, InlineKeyboardMarkup, Update +from telegram.error import BadRequest, Unauthorized +from telegram.ext import CallbackContext, CallbackQueryHandler, CommandHandler + +import Exon.modules.sql.global_bans_sql as gban_sql +import Exon.modules.sql.users_sql as user_sql +from Exon import DEV_USERS, OWNER_ID, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus + + +def get_muted_chats(bot: Bot, update: Update, leave: bool = False): + chat_id = update.effective_chat.id + chats = user_sql.get_all_chats() + muted_chats, progress = 0, 0 + chat_list = [] + progress_message = None + + for chat in chats: + + if ((100 * chats.index(chat)) / len(chats)) > progress: + progress_bar = f"{progress}% ᴄᴏᴍᴘʟᴇᴛᴇᴅ ɪɴ ɢᴇᴛᴛɪɴɢ ᴍᴜᴛᴇᴅ ᴄʜᴀᴛs." + if progress_message: + try: + bot.editMessageText( + progress_bar, chat_id, progress_message.message_id + ) + except: + pass + else: + progress_message = bot.sendMessage(chat_id, progress_bar) + progress += 5 + + cid = chat.chat_id + sleep(0.1) + + try: + bot.send_chat_action(cid, "TYPING", timeout=120) + except (BadRequest, Unauthorized): + muted_chats += +1 + chat_list.append(cid) + try: + progress_message.delete() + except: + pass + + if not leave: + return muted_chats + for muted_chat in chat_list: + sleep(0.1) + try: + bot.leaveChat(muted_chat, timeout=120) + except: + pass + user_sql.rem_chat(muted_chat) + return muted_chats + + +def get_invalid_chats(update: Update, context: CallbackContext, remove: bool = False): + bot = context.bot + chat_id = update.effective_chat.id + chats = user_sql.get_all_chats() + kicked_chats, progress = 0, 0 + chat_list = [] + progress_message = None + + for chat in chats: + + if ((100 * chats.index(chat)) / len(chats)) > progress: + progress_bar = f"{progress}% ᴄᴏᴍᴘʟᴇᴛᴇᴅ ɪɴ ɢᴇᴛᴛɪɴɢ ɪɴᴠᴀʟɪᴅ ᴄʜᴀᴛs." + if progress_message: + try: + bot.editMessageText( + progress_bar, + chat_id, + progress_message.message_id, + ) + except: + pass + else: + progress_message = bot.sendMessage(chat_id, progress_bar) + progress += 5 + + cid = chat.chat_id + sleep(0.1) + try: + bot.get_chat(cid, timeout=60) + except (BadRequest, Unauthorized): + kicked_chats += 1 + chat_list.append(cid) + try: + progress_message.delete() + except: + pass + + if not remove: + return kicked_chats + for muted_chat in chat_list: + sleep(0.1) + user_sql.rem_chat(muted_chat) + return kicked_chats + + +def get_invalid_gban(update: Update, context: CallbackContext, remove: bool = False): + bot = context.bot + banned = gban_sql.get_gban_list() + ungbanned_users = 0 + ungban_list = [] + + for user in banned: + user_id = user["user_id"] + sleep(0.1) + try: + bot.get_chat(user_id) + except BadRequest: + ungbanned_users += 1 + ungban_list.append(user_id) + if not remove: + return ungbanned_users + for user_id in ungban_list: + sleep(0.1) + gban_sql.ungban_user(user_id) + return ungbanned_users + + +@dev_plus +def dbcleanup(update: Update, context: CallbackContext): + msg = update.effective_message + + msg.reply_text("ɢᴇᴛᴛɪɴɢ ɪɴᴠᴀʟɪᴅ ᴄʜᴀᴛ ᴄᴏᴜɴᴛ ...") + invalid_chat_count = get_invalid_chats(update, context) + + msg.reply_text("ɢᴇᴛᴛɪɴɢ ɪɴᴠᴀʟɪᴅ ɢʙᴀɴɴᴇᴅ ᴄᴏᴜɴᴛ ...") + invalid_gban_count = get_invalid_gban(update, context) + + reply = f"ᴛᴏᴛᴀʟ ɪɴᴠᴀʟɪᴅ ᴄʜᴀᴛs - {invalid_chat_count}\n" + reply += f"ᴛᴏᴛᴀʟ ɪɴᴠᴀʟɪᴅ ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs - {invalid_gban_count}" + + buttons = [[InlineKeyboardButton("✦ ᴄʟᴇᴀɴᴜᴘ ᴅʙ ✦", callback_data="db_cleanup")]] + + update.effective_message.reply_text( + reply, + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +def callback_button(update: Update, context: CallbackContext): + bot = context.bot + query = update.callback_query + message = query.message + chat_id = update.effective_chat.id + query_type = query.data + + admin_list = [OWNER_ID] + DEV_USERS + + bot.answer_callback_query(query.id) + + if query_type == "db_leave_chat" and query.from_user.id in admin_list: + bot.editMessageText("ʟᴇᴀᴠɪɴɢ ᴄʜᴀᴛs ...", chat_id, message.message_id) + chat_count = get_muted_chats(update, context, True) + bot.sendMessage(chat_id, f"ʟᴇғᴛ {chat_count} ᴄʜᴀᴛs.") + elif ( + query_type == "db_leave_chat" + or query_type == "db_cleanup" + and query.from_user.id not in admin_list + ): + query.answer("ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴜsᴇ ᴛʜɪs.") + elif query_type == "db_cleanup": + bot.editMessageText("ᴄʟᴇᴀɴɪɴɢ ᴜᴘ DB ...", chat_id, message.message_id) + invalid_chat_count = get_invalid_chats(update, context, True) + invalid_gban_count = get_invalid_gban(update, context, True) + reply = f"ᴄʟᴇᴀɴᴇᴅ ᴜᴘ {invalid_chat_count} ᴄʜᴀᴛs ᴀɴᴅ {invalid_gban_count} ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs ғʀᴏᴍ ᴅʙ." + + bot.sendMessage(chat_id, reply) + + +DB_CLEANUP_HANDLER = CommandHandler("dbcleanup", dbcleanup, run_async=True) +BUTTON_HANDLER = CallbackQueryHandler(callback_button, pattern="db_.*", run_async=True) + +dispatcher.add_handler(DB_CLEANUP_HANDLER) +dispatcher.add_handler(BUTTON_HANDLER) + +__mod_name__ = "DB ᴄʟᴇᴀɴᴜᴘ" +__handlers__ = [DB_CLEANUP_HANDLER, BUTTON_HANDLER] diff --git a/Exon/modules/debug.py b/Exon/modules/debug.py new file mode 100644 index 00000000..e889f948 --- /dev/null +++ b/Exon/modules/debug.py @@ -0,0 +1,86 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 datetime +import os + +from telegram import Update +from telegram.ext import CallbackContext, CommandHandler +from telethon import events + +from Exon import dispatcher, telethn +from Exon.modules.helper_funcs.chat_status import dev_plus + +DEBUG_MODE = False + + +@dev_plus +def debug(update: Update, context: CallbackContext): + global DEBUG_MODE + args = update.effective_message.text.split(None, 1) + message = update.effective_message + print(DEBUG_MODE) + if len(args) > 1: + if args[1] in ("yes", "on"): + DEBUG_MODE = True + message.reply_text("ᴅᴇʙᴜɢ ᴍᴏᴅᴇ ɪs ɴᴏᴡ ᴏɴ.") + elif args[1] in ("no", "off"): + DEBUG_MODE = False + message.reply_text("ᴅᴇʙᴜɢ ᴍᴏᴅᴇ ɪs ɴᴏᴡ ᴏғғ.") + elif DEBUG_MODE: + message.reply_text("ᴅᴇʙᴜɢ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ ᴏɴ.") + else: + message.reply_text("ᴅᴇʙᴜɢ ᴍᴏᴅᴇ is ᴄᴜʀʀᴇɴᴛʟʏ ᴏғғ.") + + +@telethn.on(events.NewMessage(pattern="[/!].*")) +async def i_do_nothing_yes(event): + global DEBUG_MODE + if DEBUG_MODE: + print(f"-{event.from_id} ({event.chat_id}) : {event.text}") + if os.path.exists("updates.txt"): + with open("updates.txt", "r") as f: + text = f.read() + with open("updates.txt", "w+") as f: + f.write(f"{text}\n-{event.from_id} ({event.chat_id}) : {event.text}") + else: + with open("updates.txt", "w+") as f: + f.write( + f"- {event.from_id} ({event.chat_id}) : {event.text} | {datetime.datetime.now()}", + ) + + +support_chat = os.getenv("SUPPORT_CHAT") +updates_channel = os.getenv("UPDATES_CHANNEL") + + +DEBUG_HANDLER = CommandHandler("debug", debug, run_async=True) + +dispatcher.add_handler(DEBUG_HANDLER) + +__mod_name__ = "Debug" + +__command_list__ = ["debug"] + +__handlers__ = [DEBUG_HANDLER] diff --git a/Exon/modules/dev.py b/Exon/modules/dev.py new file mode 100644 index 00000000..011f6f57 --- /dev/null +++ b/Exon/modules/dev.py @@ -0,0 +1,225 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 +import subprocess +import sys +from statistics import mean +from time import monotonic as time +from time import sleep + +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, TelegramError, Update +from telegram.ext import CallbackContext, CommandHandler +from telegram.ext.callbackqueryhandler import CallbackQueryHandler +from telethon import events + +from Exon import DEV_USERS, OWNER_ID, dispatcher, telethn +from Exon.modules.helper_funcs.chat_status import dev_plus + + +def leave_cb(update: Update, context: CallbackContext): + bot = context.bot + callback = update.callback_query + if callback.from_user.id not in DEV_USERS: + callback.answer(text="ᴛʜɪs ɪsɴ'ᴛ ғᴏʀ ʏᴏᴜ", show_alert=True) + return + + match = re.match(r"leavechat_cb_\((.+?)\)", callback.data) + chat = int(match[1]) + bot.leave_chat(chat_id=chat) + callback.answer(text="ʟᴇғᴛ ᴄʜᴀᴛ") + + +@dev_plus +def allow_groups(update: Update, context: CallbackContext): + args = context.args + if not args: + state = "off" if Exon.ALLOW_CHATS else "ʟᴏᴄᴋᴅᴏᴡɴ ɪs " + "on" + update.effective_message.reply_text(f"ᴄᴜʀʀᴇɴᴛ sᴛᴀᴛᴇ: {state}") + ʀᴇᴛᴜʀɴ + if args[0].lower() in ["off", "no"]: + Exon.ALLOW_CHATS = True + elif args[0].lower() in ["yes", "on"]: + Exon.ALLOW_CHATS = False + else: + update.effective_message.reply_text("ғᴏʀᴍᴀᴛ: /lockdown Yes/No ᴏʀ Off/On") + return + update.effective_message.reply_text("ᴅᴏɴᴇ! ʟᴏᴄᴋᴅᴏᴡɴ ᴠᴀʟᴜᴇ ᴛᴏɢɢʟᴇᴅ.") + + +class Store: + def __init__(self, func): + self.func = func + self.calls = [] + self.time = time() + self.lock = asyncio.Lock() + + def average(self): + return round(mean(self.calls), 2) if self.calls else 0 + + def __repr__(self): + return f"<Store func={self.func.__name__}, average={self.average()}>" + + async def __call__(self, event): + async with self.lock: + if not self.calls: + self.calls = [0] + if time() - self.time > 1: + self.time = time() + self.calls.append(1) + else: + self.calls[-1] += 1 + await self.func(event) + + +async def nothing(event): + pass + + +messages = Store(nothing) +inline_queries = Store(nothing) +callback_queries = Store(nothing) + +telethn.add_event_handler(messages, events.NewMessage()) +telethn.add_event_handler(inline_queries, events.InlineQuery()) +telethn.add_event_handler(callback_queries, events.CallbackQuery()) + + +@telethn.on(events.NewMessage(pattern=r"/getstats", from_users=OWNER_ID)) +async def getstats(event): + await event.reply( + f"**__ᴇᴠᴇɴᴛ sᴛᴀᴛɪsᴛɪᴄs__**\n**ᴀᴠᴇʀᴀɢᴇ ᴍᴇssᴀɢᴇs:** {messages.average()}/s\n**ᴀᴠᴇʀᴀɢᴇ ᴄᴀʟʟʙᴀᴄᴋ ǫᴜᴇʀɪᴇs:** {callback_queries.average()}/s\n**ᴀᴠᴇʀᴀɢᴇ ɪɴʟɪɴᴇ ǫᴜᴇʀɪᴇs:** {inline_queries.average()}/s", + parse_mode="md", + ) + + +@dev_plus +def pip_install(update: Update, context: CallbackContext): + message = update.effective_message + args = context.args + if not args: + message.reply_text("ᴇɴᴛᴇʀ ᴀ ᴘᴀᴄᴋᴀɢᴇ ɴᴀᴍᴇ.") + return + if len(args) >= 1: + cmd = f"py -m pip install {' '.join(args)}" + process = subprocess.Popen( + cmd.split(" "), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + ) + stdout, stderr = process.communicate() + reply = "" + stderr = stderr.decode() + if stdout := stdout.decode(): + reply += f"*sᴛᴅᴏᴜᴛ*\n`{stdout}`\n" + if stderr: + reply += f"*sᴛᴅᴇʀʀ*\n`{stderr}`\n" + + message.reply_text(text=reply, parse_mode=ParseMode.MARKDOWN) + + +@dev_plus +def leave(update: Update, context: CallbackContext): + bot = context.bot + if args := context.args: + chat_id = str(args[0]) + leave_msg = " ".join(args[1:]) + try: + context.bot.send_message(chat_id, leave_msg) + bot.leave_chat(int(chat_id)) + update.effective_message.reply_text("ʟᴇғᴛ ᴄʜᴀᴛ.") + except TelegramError: + update.effective_message.reply_text("ғᴀɪʟᴇᴅ ᴛᴏ ʟᴇᴀᴠᴇ ᴄʜᴀᴛ ғᴏʀ sᴏᴍᴇ ʀᴇᴀsᴏɴ.") + else: + chat = update.effective_chat + # user = update.effective_user + Exon_leave_bt = [ + [ + InlineKeyboardButton( + text="ɪ ᴀᴍ sᴜʀᴇ ᴏғ ᴛʜɪs ᴀᴄᴛɪᴏɴ.", + callback_data=f"leavechat_cb_({chat.id})", + ) + ] + ] + + update.effective_message.reply_text( + f"I'm ɢᴏɪɴɢ ᴛᴏ ʟᴇᴀᴠᴇ {chat.title}, ᴘʀᴇss ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ᴄᴏɴғɪʀᴍ", + reply_markup=InlineKeyboardMarkup(Exon_leave_bt), + ) + + +@dev_plus +def gitpull(update: Update, context: CallbackContext): + sent_msg = update.effective_message.reply_text( + "ᴘᴜʟʟɪɴɢ ᴀʟʟ ᴄʜᴀɴɢᴇs ғʀᴏᴍ ʀᴇᴍᴏᴛᴇ ᴀɴᴅ ᴛʜᴇɴ ᴀᴛᴛᴇᴍᴘᴛɪɴɢ ᴛᴏ ʀᴇsᴛᴀʀᴛ." + ) + subprocess.Popen("git pull", stdout=subprocess.PIPE, shell=True) + + sent_msg_text = sent_msg.text + "\n\nᴄʜᴀɴɢᴇs ᴘᴜʟʟᴇᴅ...I ɢᴜᴇss.. ʀᴇsᴛᴀʀᴛɪɴɢ ɪɴ " + + for i in reversed(range(5)): + sent_msg.edit_text(sent_msg_text + str(i + 1)) + sleep(1) + + sent_msg.edit_text("ʀᴇsᴛᴀʀᴛᴇᴅ..") + + os.system("restart.bat") + os.execv("start.bat", sys.argv) + + +@dev_plus +def restart(update: Update, context: CallbackContext): + update.effective_message.reply_text("ᴇxɪᴛɪɴɢ ᴀʟʟ ᴀʟʟ ᴀɴᴅ sᴛᴀʀᴛɪɴɢ ᴀ ɴᴇᴡ ɪɴsᴛᴀɴᴄᴇ!") + process = subprocess.run("pkill python3 && python3 -m Exon", shell=True, check=True) + process.communicate() + + +PIP_INSTALL_HANDLER = CommandHandler("install", pip_install, run_async=True) +LEAVE_HANDLER = CommandHandler("leave", leave, run_async=True) +GITPULL_HANDLER = CommandHandler("gitpull", gitpull, run_async=True) +RESTART_HANDLER = CommandHandler("reboot", restart, run_async=True) +ALLOWGROUPS_HANDLER = CommandHandler("lockdown", allow_groups, run_async=True) +LEAVE_CALLBACK_HANDLER = CallbackQueryHandler( + leave_cb, pattern=r"leavechat_cb_", run_async=True +) + +dispatcher.add_handler(PIP_INSTALL_HANDLER) +dispatcher.add_handler(ALLOWGROUPS_HANDLER) +dispatcher.add_handler(LEAVE_HANDLER) +dispatcher.add_handler(GITPULL_HANDLER) +dispatcher.add_handler(RESTART_HANDLER) +dispatcher.add_handler(LEAVE_CALLBACK_HANDLER) + +__mod_name__ = "𝙳ᴇᴠ" +__handlers__ = [ + LEAVE_HANDLER, + GITPULL_HANDLER, + RESTART_HANDLER, + ALLOWGROUPS_HANDLER, + LEAVE_CALLBACK_HANDLER, + PIP_INSTALL_HANDLER, +] diff --git a/Exon/modules/disable.py b/Exon/modules/disable.py new file mode 100644 index 00000000..076d04af --- /dev/null +++ b/Exon/modules/disable.py @@ -0,0 +1,375 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 importlib +from typing import Union + +from future.utils import string_types +from telegram import ParseMode, Update +from telegram.ext import ( + CallbackContext, + CommandHandler, + Filters, + MessageHandler, + RegexHandler, +) +from telegram.utils.helpers import escape_markdown + +from Exon import dispatcher +from Exon.modules.helper_funcs.handlers import CMD_STARTERS, SpamChecker +from Exon.modules.helper_funcs.misc import is_module_loaded + +FILENAME = __name__.rsplit(".", 1)[-1] + +# If module is due to be loaded, then setup all the magical handlers +if is_module_loaded(FILENAME): + + from Exon.modules.helper_funcs.chat_status import ( + connection_status, + is_user_admin, + user_admin, + ) + from Exon.modules.sql import disable_sql as sql + + DISABLE_CMDS = [] + DISABLE_OTHER = [] + ADMIN_CMDS = [] + + class DisableAbleCommandHandler(CommandHandler): + def __init__(self, command, callback, admin_ok=False, **kwargs): + super().__init__(command, callback, **kwargs) + self.admin_ok = admin_ok + if isinstance(command, string_types): + DISABLE_CMDS.append(command) + if admin_ok: + ADMIN_CMDS.append(command) + else: + DISABLE_CMDS.extend(command) + if admin_ok: + ADMIN_CMDS.extend(command) + + def check_update(self, update): + if not isinstance(update, Update) or not update.effective_message: + return + message = update.effective_message + + if message.text and len(message.text) > 1: + fst_word = message.text.split(None, 1)[0] + if len(fst_word) > 1 and any( + fst_word.startswith(start) for start in CMD_STARTERS + ): + args = message.text.split()[1:] + command = fst_word[1:].split("@") + command.append(message.bot.username) + + if not ( + command[0].lower() in self.command + and command[1].lower() == message.bot.username.lower() + ): + return None + chat = update.effective_chat + user = update.effective_user + user_id = chat.id if user.id == 1087968824 else user.id + if SpamChecker.check_user(user_id): + return None + if filter_result := self.filters(update): + # disabled, admincmd, user admin + if sql.is_command_disabled(chat.id, command[0].lower()): + # check if command was disabled + is_disabled = command[0] in ADMIN_CMDS and is_user_admin( + chat, user.id + ) + return (args, filter_result) if is_disabled else None + return args, filter_result + return False + + class DisableAbleMessageHandler(MessageHandler): + def __init__(self, filters, callback, friendly, **kwargs): + + super().__init__(filters, callback, **kwargs) + DISABLE_OTHER.append(friendly) + self.friendly = friendly + if filters: + self.filters = Filters.update.messages & filters + else: + self.filters = Filters.update.messages + + def check_update(self, update): + + chat = update.effective_chat + message = update.effective_message + filter_result = self.filters(update) + + try: + args = message.text.split()[1:] + except: + args = [] + + if super().check_update(update): + if sql.is_command_disabled(chat.id, self.friendly): + return False + return args, filter_result + + class DisableAbleRegexHandler(RegexHandler): + def __init__(self, pattern, callback, friendly="", filters=None, **kwargs): + super().__init__(pattern, callback, filters, **kwargs) + DISABLE_OTHER.append(friendly) + self.friendly = friendly + + def check_update(self, update): + chat = update.effective_chat + if super().check_update(update): + return not sql.is_command_disabled(chat.id, self.friendly) + + @connection_status + @user_admin + def disable(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + if len(args) >= 1: + disable_cmd = args[0] + if disable_cmd.startswith(CMD_STARTERS): + disable_cmd = disable_cmd[1:] + + if disable_cmd in set(DISABLE_CMDS + DISABLE_OTHER): + sql.disable_command(chat.id, str(disable_cmd).lower()) + update.effective_message.reply_text( + f"ᴅɪsᴀʙʟᴇᴅ ᴛʜᴇ ᴜsᴇ ᴏғ `{disable_cmd}`", + parse_mode=ParseMode.MARKDOWN, + ) + else: + update.effective_message.reply_text("ᴛʜᴀᴛ ᴄᴏᴍᴍᴀɴᴅ ᴄᴀɴ'ᴛ ʙᴇ ᴅɪsᴀʙʟᴇᴅ") + + else: + update.effective_message.reply_text("ᴡʜᴀᴛ sʜᴏᴜʟᴅ ɪ ᴅɪsᴀʙʟᴇ?") + + @connection_status + @user_admin + def disable_module(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + if len(args) >= 1: + disable_module = "Exon.modules." + args[0].rsplit(".", 1)[0] + + try: + module = importlib.import_module(disable_module) + except: + update.effective_message.reply_text("Does ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ᴇᴠᴇɴ ᴇxɪsᴛ?") + return + + try: + command_list = module.__command_list__ + except: + update.effective_message.reply_text( + "ᴍᴏᴅᴜʟᴇ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴄᴏᴍᴍᴀɴᴅ ʟɪsᴛ!", + ) + return + + disabled_cmds = [] + failed_disabled_cmds = [] + + for disable_cmd in command_list: + if disable_cmd.startswith(CMD_STARTERS): + disable_cmd = disable_cmd[1:] + + if disable_cmd in set(DISABLE_CMDS + DISABLE_OTHER): + sql.disable_command(chat.id, str(disable_cmd).lower()) + disabled_cmds.append(disable_cmd) + else: + failed_disabled_cmds.append(disable_cmd) + + if disabled_cmds: + disabled_cmds_string = ", ".join(disabled_cmds) + update.effective_message.reply_text( + f"ᴅɪsᴀʙʟᴇᴅ ᴛʜᴇ ᴜsᴇs ᴏғ `{disabled_cmds_string}`", + parse_mode=ParseMode.MARKDOWN, + ) + + if failed_disabled_cmds: + failed_disabled_cmds_string = ", ".join(failed_disabled_cmds) + update.effective_message.reply_text( + f"ᴄᴏᴍᴍᴀɴᴅs `{failed_disabled_cmds_string}` ᴄᴀɴ'ᴛ ʙᴇ ᴅɪsᴀʙʟᴇᴅ", + parse_mode=ParseMode.MARKDOWN, + ) + + else: + update.effective_message.reply_text("ᴡʜᴀᴛ sʜᴏᴜʟᴅ ɪ ᴅɪsᴀʙʟᴇ?") + + @connection_status + @user_admin + def enable(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + if len(args) >= 1: + enable_cmd = args[0] + if enable_cmd.startswith(CMD_STARTERS): + enable_cmd = enable_cmd[1:] + + if sql.enable_command(chat.id, enable_cmd): + update.effective_message.reply_text( + f"ᴇɴᴀʙʟᴇᴅ ᴛʜᴇ ᴜsᴇ ᴏғ `{enable_cmd}`", + parse_mode=ParseMode.MARKDOWN, + ) + else: + update.effective_message.reply_text("ɪs ᴛʜᴀᴛ ᴇᴠᴇɴ ᴅɪsᴀʙʟᴇᴅ?") + + else: + update.effective_message.reply_text("ᴡʜᴀᴛ sʜᴏᴜʟᴅ I ᴇɴᴀʙʟᴇ?") + + @connection_status + @user_admin + def enable_module(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + + if len(args) >= 1: + enable_module = "Exon.modules." + args[0].rsplit(".", 1)[0] + + try: + module = importlib.import_module(enable_module) + except: + update.effective_message.reply_text("ᴅᴏᴇs ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ᴇᴠᴇɴ ᴇxɪsᴛ ?") + return + + try: + command_list = module.__command_list__ + except: + update.effective_message.reply_text( + "ᴍᴏᴅᴜʟᴇ ᴅᴏᴇs ɴᴏᴛ ᴄᴏɴᴛᴀɪɴ ᴄᴏᴍᴍᴀɴᴅ ʟɪsᴛ!", + ) + return + + enabled_cmds = [] + failed_enabled_cmds = [] + + for enable_cmd in command_list: + if enable_cmd.startswith(CMD_STARTERS): + enable_cmd = enable_cmd[1:] + + if sql.enable_command(chat.id, enable_cmd): + enabled_cmds.append(enable_cmd) + else: + failed_enabled_cmds.append(enable_cmd) + + if enabled_cmds: + enabled_cmds_string = ", ".join(enabled_cmds) + update.effective_message.reply_text( + f"ᴇɴᴀʙʟᴇᴅ ᴛʜᴇ ᴜsᴇs ᴏғ `{enabled_cmds_string}`", + parse_mode=ParseMode.MARKDOWN, + ) + + if failed_enabled_cmds: + failed_enabled_cmds_string = ", ".join(failed_enabled_cmds) + update.effective_message.reply_text( + f"ᴀʀᴇ ᴛʜᴇ ᴄᴏᴍᴍᴀɴᴅs `{failed_enabled_cmds_string}` ᴇᴠᴇɴ ᴅɪsᴀʙʟᴇᴅ?", + parse_mode=ParseMode.MARKDOWN, + ) + + else: + update.effective_message.reply_text("ᴡʜᴀᴛ sʜᴏᴜʟᴅ I ᴇɴᴀʙʟᴇ?") + + @connection_status + @user_admin + def list_cmds(update: Update, context: CallbackContext): + if DISABLE_CMDS + DISABLE_OTHER: + result = "".join( + f" - `{escape_markdown(cmd)}`\n" + for cmd in set(DISABLE_CMDS + DISABLE_OTHER) + ) + + update.effective_message.reply_text( + f"ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴛᴏɢɢʟᴇᴀʙʟᴇ:\n{result}", + parse_mode=ParseMode.MARKDOWN, + ) + else: + update.effective_message.reply_text("ɴᴏ ᴄᴏᴍᴍᴀɴᴅs ᴄᴀɴ ʙᴇ ᴅɪsᴀʙʟᴇᴅ.") + + # do not async + def build_curr_disabled(chat_id: Union[str, int]) -> str: + disabled = sql.get_all_disabled(chat_id) + if not disabled: + return "No ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴅɪsᴀʙʟᴇᴅ!" + + result = "".join(f" - `{escape_markdown(cmd)}`\n" for cmd in disabled) + return f"ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ᴄᴏᴍᴍᴀɴᴅs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ʀᴇsᴛʀɪᴄᴛᴇᴅ:\n{result}" + + @connection_status + def commands(update: Update, context: CallbackContext): + chat = update.effective_chat + update.effective_message.reply_text( + build_curr_disabled(chat.id), + parse_mode=ParseMode.MARKDOWN, + ) + + def __stats__(): + return ( + f"•➥ {sql.num_disabled()} ᴅɪsᴀʙʟᴇᴅ ɪᴛᴇᴍs, ᴀᴄʀᴏss {sql.num_chats()} ᴄʜᴀᴛs." + ) + + def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + def __chat_settings__(chat_id, user_id): + return build_curr_disabled(chat_id) + + DISABLE_HANDLER = CommandHandler("disable", disable, run_async=True) + DISABLE_MODULE_HANDLER = CommandHandler( + "disablemodule", disable_module, run_async=True + ) + ENABLE_HANDLER = CommandHandler("enable", enable, run_async=True) + ENABLE_MODULE_HANDLER = CommandHandler( + "enablemodule", enable_module, run_async=True + ) + COMMANDS_HANDLER = CommandHandler(["cmds", "disabled"], commands, run_async=True) + TOGGLE_HANDLER = CommandHandler("listcmds", list_cmds, run_async=True) + + dispatcher.add_handler(DISABLE_HANDLER) + dispatcher.add_handler(DISABLE_MODULE_HANDLER) + dispatcher.add_handler(ENABLE_HANDLER) + dispatcher.add_handler(ENABLE_MODULE_HANDLER) + dispatcher.add_handler(COMMANDS_HANDLER) + dispatcher.add_handler(TOGGLE_HANDLER) + + __help__ = """ +• /cmds*:* ᴄʜᴇᴄᴋ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ sᴛᴀᴛᴜs ᴏғ ᴅɪsᴀʙʟᴇᴅ ᴄᴏᴍᴍᴀɴᴅs + +*ᴀᴅᴍɪɴs ᴏɴʟʏ:* + +• /enable <cmd name>*:* `ᴇɴᴀʙʟᴇ ᴛʜᴀᴛ ᴄᴏᴍᴍᴀɴᴅ ` + +• /disable <cmd name>*:* `ᴅɪsᴀʙʟᴇ ᴛʜᴀᴛ ᴄᴏᴍᴍᴀɴᴅ ` + +• /enablemodule <module name>*:* `ᴇɴᴀʙʟᴇ ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs ɪɴ ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ` + +• /disablemodule <module name>*:* `ᴅɪsᴀʙʟᴇ ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs ɪɴ ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ` + +• /listcmds*:* `ɪsᴛ ᴀʟʟ ᴘᴏssɪʙʟᴇ ᴛᴏɢɢʟᴇᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs ` + """ + + __mod_name__ = "𝙳ɪsᴀʙʟɪɴɢ" + +else: + DisableAbleCommandHandler = CommandHandler + DisableAbleRegexHandler = RegexHandler + DisableAbleMessageHandler = MessageHandler diff --git a/Exon/modules/disasters.py b/Exon/modules/disasters.py new file mode 100644 index 00000000..16bd0c7b --- /dev/null +++ b/Exon/modules/disasters.py @@ -0,0 +1,585 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import json +import os +from typing import Optional + +from telegram import ParseMode, TelegramError, Update +from telegram.ext import CallbackContext, CommandHandler +from telegram.utils.helpers import mention_html + +from Exon import DEMONS, DEV_USERS, DRAGONS, OWNER_ID, TIGERS, WOLVES, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus, sudo_plus, whitelist_plus +from Exon.modules.helper_funcs.extraction import extract_user +from Exon.modules.log_channel import gloggable + +ELEVATED_USERS_FILE = os.path.join(os.getcwd(), "Exon/elevated_users.json") + + +def check_user_id(user_id: int, context: CallbackContext) -> Optional[str]: + bot = context.bot + if not user_id: + return "ᴛʜᴀᴛ...ɪs a ᴄʜᴀᴛ! ʙᴀᴋᴀ ᴋᴀ ᴏᴍᴀᴇ?" + + return "ᴛʜɪs ᴅᴏᴇs ɴᴏᴛ ᴡᴏʀᴋ ᴛʜᴀᴛ ᴡᴀʏ." if user_id == bot.id else None + + +@dev_plus +@gloggable +def addsudo(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + rt = "" + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DRAGONS: + message.reply_text("ᴀʟʀᴇᴀᴅʏ ᴏᴜʀ ʙᴇsᴛᴏ ғʀɪᴇɴᴅᴏ :3") + return "" + + if user_id in DEMONS: + rt += "." + data["supports"].remove(user_id) + DEMONS.remove(user_id) + + if user_id in WOLVES: + rt += "ᴡᴇ ᴀʀᴇ ʙᴇsᴛ ғʀɪᴇɴᴅs ɴᴏᴡ 🌸" + data["whitelists"].remove(user_id) + WOLVES.remove(user_id) + + data["sudos"].append(user_id) + DRAGONS.append(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + update.effective_message.reply_text( + (rt + f"\nsᴜᴄᴄᴇssғᴜʟʟʏ ᴍᴀᴅᴇ ʙᴇsᴛ ғʀɪᴇɴᴅsʜɪᴘ ᴡɪᴛʜ {user_member.first_name} !") + ) + + log_message = ( + f"#sᴜᴅᴏ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + + +@sudo_plus +@gloggable +def addsupport( + update: Update, + context: CallbackContext, +) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + rt = "" + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DRAGONS: + rt += "I ᴅᴏɴᴛ ᴡᴀɴᴛ ᴛᴏ ʙᴇ ʏᴏᴜʀ ʙᴇsᴛ ғʀɪᴇɴᴅ 🥲" + data["sudos"].remove(user_id) + DRAGONS.remove(user_id) + + if user_id in DEMONS: + message.reply_text("ᴡᴇ ᴀʀᴇ ᴀʟʀᴇᴀᴅʏ ғʀɪᴇɴᴅs.") + return "" + + if user_id in WOLVES: + rt += "We are friends now :)" + data["whitelists"].remove(user_id) + WOLVES.remove(user_id) + + data["supports"].append(user_id) + DEMONS.append(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + update.effective_message.reply_text( + f"{rt}\n{user_member.first_name}, ᴡᴇ ᴄᴀɴ ʙᴇ ғʀɪᴇɴᴅs ;)" + ) + + log_message = ( + f"#sᴜᴘᴘᴏʀᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + + +@sudo_plus +@gloggable +def addwhitelist(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + rt = "" + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DRAGONS: + rt += "ᴛʜɪs ᴍᴇᴍʙᴇʀ ɪs ᴏᴜʀ ʙᴇsᴛғʀɪᴇɴᴅ ʙᴜᴛ ɪ ᴡɪʟʟ ʟɪᴋᴇ ᴡʜᴇɴ ᴏᴜʀ ʙᴇsᴛғʀɪᴇɴᴅ ʙᴇᴄᴏᴍᴇs ᴀ ɪɢɴɪᴛᴇ " + data["sudos"].remove(user_id) + DRAGONS.remove(user_id) + + if user_id in DEMONS: + rt += "ʏᴏᴜ ᴀʀᴇ ᴏᴜʀ ғʀɪᴇɴᴅ, ʙᴜᴛ it's ғᴏʀ ʏᴏᴜʀ ᴏᴡɴ ɢᴏᴏᴅ ɪғ ʏᴏᴜ ʙᴇᴄᴏᴍᴇ ᴀ ɪɢɴɪᴛᴇ ɪɴsᴛᴇᴀᴅ." + data["supports"].remove(user_id) + DEMONS.remove(user_id) + + if user_id in WOLVES: + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴀ ᴛʀᴜᴇ ᴇxᴏɴ") + return "" + + data["whitelists"].append(user_id) + WOLVES.append(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + update.effective_message.reply_text( + f"{rt}\nsᴜᴄᴄᴇssғᴜʟʟʏ ᴘʀᴏᴍᴏᴛᴇᴅ {user_member.first_name} ᴛᴏ ᴀ ʀᴀɴᴋᴇᴅ EXON!" + ) + + log_message = ( + f"#ᴡʜɪᴛᴇʟɪsᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))} \n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + + +@sudo_plus +@gloggable +def addtiger(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + rt = "" + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DRAGONS: + rt += "ʏᴏᴜ ᴡᴇʀᴇ ᴏᴜʀ ʙᴇsᴛᴏ ғʀɪᴇɴᴅᴏ, ʙᴜᴛ ɴᴏᴡ ʏᴏᴜ ᴀʀᴇ ᴊᴜsᴛ ᴀ ᴄʟᴀssᴍᴀᴛᴇ ᴛᴏ ᴜs ;(" + data["sudos"].remove(user_id) + DRAGONS.remove(user_id) + + if user_id in DEMONS: + rt += "Let's become classmates instead." + data["supports"].remove(user_id) + DEMONS.remove(user_id) + + if user_id in WOLVES: + rt += "ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ a ᴇxᴏɴ, ᴡᴇ ᴄᴀɴ ʙᴇ ᴄʟᴀssᴍᴀᴛᴇs ᴀs ᴡᴇʟʟ.." + data["whitelists"].remove(user_id) + WOLVES.remove(user_id) + + if user_id in TIGERS: + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴏᴜʀ ᴄʟᴀssᴍᴀᴛᴇ.") + return "" + + data["tigers"].append(user_id) + TIGERS.append(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + update.effective_message.reply_text( + f"{rt}\nʟᴇᴛ's ᴡᴇʟᴄᴏᴍᴇ ᴏᴜʀ ɴᴇᴡ ᴄʟᴀssᴍᴀᴛᴇ, {user_member.first_name}!" + ) + + log_message = ( + f"#sᴄᴏᴜᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))} \n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + + +@dev_plus +@gloggable +def removesudo(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DRAGONS: + message.reply_text("ᴡᴇ ᴀʀᴇ ɴᴏ ᴍᴏʀᴇ ʙᴇsᴛ ғʀɪᴇɴᴅs ʜᴍᴘʜ!") + DRAGONS.remove(user_id) + data["sudos"].remove(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + log_message = ( + f"#ᴜɴsᴜᴅᴏ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n" + log_message + + return log_message + message.reply_text( + "ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ᴀ ᴏᴜʀ ʙᴇsᴛᴏ ғʀɪᴇɴᴅᴏ, ʏᴏᴜ ᴍᴜsᴛ ʜᴀᴠᴇ ᴍɪsᴜɴᴅᴇʀsᴛᴏᴏᴅ sᴇɴᴘᴀɪ!" + ) + return "" + + +@sudo_plus +@gloggable +def removesupport(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in DEMONS: + message.reply_text("ᴏᴜʀ ғʀɪᴇɴᴅsʜɪᴘ ʜᴀs ʙᴇᴇɴ ʙʀᴏᴋᴇɴ 💔") + DEMONS.remove(user_id) + data["supports"].remove(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + log_message = ( + f"#ᴜɴsᴜᴘᴘᴏʀᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ᴏᴜʀ ғʀɪᴇɴᴅ, ʙᴀᴋᴀ ᴏɴɪᴄʜᴀɴ!") + return "" + + +@sudo_plus +@gloggable +def removewhitelist(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in WOLVES: + message.reply_text("ᴅᴇᴍᴏᴛɪɴɢ ᴛᴏ ɴᴏʀᴍᴀʟ ᴄɪᴛɪᴢᴇɴ") + WOLVES.remove(user_id) + data["whitelists"].remove(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + log_message = ( + f"#ᴜɴᴡʜɪᴛᴇʟɪsᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ᴀ ᴇxᴏɴ!") + return "" + + +@sudo_plus +@gloggable +def removetiger(update: Update, context: CallbackContext) -> str: + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + bot, args = context.bot, context.args + user_id = extract_user(message, args) + user_member = bot.getChat(user_id) + + if reply := check_user_id(user_id, bot): + message.reply_text(reply) + return "" + + with open(ELEVATED_USERS_FILE, "r") as infile: + data = json.load(infile) + + if user_id in TIGERS: + message.reply_text("ᴅᴇᴍᴏᴛɪɴɢ ᴛᴏ ɴᴏʀᴍᴀʟ ᴄɪᴛɪᴢᴇɴ") + TIGERS.remove(user_id) + data["Tigers"].remove(user_id) + + with open(ELEVATED_USERS_FILE, "w") as outfile: + json.dump(data, outfile, indent=4) + + log_message = ( + f"#ᴜɴsᴄᴏᴜᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, html.escape(user.first_name))}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(user_member.id, html.escape(user_member.first_name))}" + ) + + if chat.type != "private": + log_message = f"<b>{html.escape(chat.title)}:</b>\n{log_message}" + + return log_message + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ᴏᴜʀ ᴄʟᴀssᴍᴀᴛᴇ!") + return "" + + +@whitelist_plus +def whitelistlist(update: Update, context: CallbackContext): + reply = "<b>ᴇxᴏɴ:</b>\n\n" + m = update.effective_message.reply_text( + "<code>ɢᴀᴛʜᴇʀɪɴɢ ɪɴᴛᴇʟ ғʀᴏᴍ ᴇxᴏɴ..</code>", + parse_mode=ParseMode.HTML, + ) + bot = context.bot + for each_user in WOLVES: + user_id = int(each_user) + try: + user = bot.get_chat(user_id) + + reply += f"• {mention_html(user_id, html.escape(user.first_name))}\n" + except TelegramError: + pass + m.edit_text(reply, parse_mode=ParseMode.HTML) + + +@whitelist_plus +def tigerlist(update: Update, context: CallbackContext): + reply = "<b>Classmates:</b>\n\n" + m = update.effective_message.reply_text( + "<code>ɢᴀᴛʜᴇʀɪɴɢ ɪɴᴛᴇʟ ғʀᴏᴍ ᴇxᴏɴ ɪǫ.</code>", + parse_mode=ParseMode.HTML, + ) + bot = context.bot + for each_user in TIGERS: + user_id = int(each_user) + try: + user = bot.get_chat(user_id) + reply += f"• {mention_html(user_id, html.escape(user.first_name))}\n" + except TelegramError: + pass + m.edit_text(reply, parse_mode=ParseMode.HTML) + + +@whitelist_plus +def supportlist(update: Update, context: CallbackContext): + bot = context.bot + m = update.effective_message.reply_text( + "<code>ɢᴀᴛʜᴇʀɪɴɢ ɪɴᴛᴇʟ ғʀᴏᴍ .</code>", + parse_mode=ParseMode.HTML, + ) + reply = "<b>ғʀɪᴇɴᴅs:</b>\n\n" + for each_user in DEMONS: + user_id = int(each_user) + try: + user = bot.get_chat(user_id) + reply += f"• {mention_html(user_id, html.escape(user.first_name))}\n" + except TelegramError: + pass + m.edit_text(reply, parse_mode=ParseMode.HTML) + + +@whitelist_plus +def sudolist(update: Update, context: CallbackContext): + bot = context.bot + m = update.effective_message.reply_text( + "<code>ɢᴀᴛʜᴇʀɪɴɢ ɪɴᴛᴇʟ ғʀᴏᴍ ᴇxᴏɴ ʜǫ.</code>", + parse_mode=ParseMode.HTML, + ) + true_sudo = list(set(DRAGONS) - set(DEV_USERS)) + reply = "<b>ʙᴇsᴛᴏ ғʀɪᴇɴᴅᴏs:</b>\n\n" + for each_user in true_sudo: + user_id = int(each_user) + try: + user = bot.get_chat(user_id) + reply += f"• {mention_html(user_id, html.escape(user.first_name))}\n" + except TelegramError: + pass + m.edit_text(reply, parse_mode=ParseMode.HTML) + + +@whitelist_plus +def devlist(update: Update, context: CallbackContext): + bot = context.bot + m = update.effective_message.reply_text( + "<code>ɢᴀᴛʜᴇʀɪɴɢ ɪɴᴛᴇʟ ғʀᴏᴍ ᴀʙɪsʜɴᴏɪ HQ..</code>", + parse_mode=ParseMode.HTML, + ) + true_dev = list(set(DEV_USERS) - {OWNER_ID}) + reply = "<b>ғᴀᴍɪʟʏ ᴍᴇᴍʙᴇʀs:</b>\n\n" + for each_user in true_dev: + user_id = int(each_user) + try: + user = bot.get_chat(user_id) + reply += f"• {mention_html(user_id, html.escape(user.first_name))}\n" + except TelegramError: + pass + m.edit_text(reply, parse_mode=ParseMode.HTML) + + +SUDO_HANDLER = CommandHandler(("addsudo", "addbestfriend"), addsudo, run_async=True) +SUPPORT_HANDLER = CommandHandler( + ("addsupport", "addfriend"), addsupport, run_async=True +) +TIGER_HANDLER = CommandHandler(("addclassmate"), addtiger) +WHITELIST_HANDLER = CommandHandler( + ("EXON", "addwhitelist"), addwhitelist, run_async=True +) +UNSUDO_HANDLER = CommandHandler( + ("removesudo", "rmbestfriend"), removesudo, run_async=True +) +UNSUPPORT_HANDLER = CommandHandler( + ("removesupport", "rmfriend"), removesupport, run_async=True +) +UNTIGER_HANDLER = CommandHandler(("rmclassmate"), removetiger) +UNWHITELIST_HANDLER = CommandHandler( + ("removewhitelist", "rmIGNITE"), removewhitelist, run_async=True +) +WHITELISTLIST_HANDLER = CommandHandler( + ["whitelistlist", "EXONS"], whitelistlist, run_async=True +) +TIGERLIST_HANDLER = CommandHandler(["classmates"], tigerlist, run_async=True) +SUPPORTLIST_HANDLER = CommandHandler( + ["supportlist", "friends"], supportlist, run_async=True +) +SUDOLIST_HANDLER = CommandHandler(["sudolist", "bestfriends"], sudolist, run_async=True) +DEVLIST_HANDLER = CommandHandler(["devlist", "devs"], devlist, run_async=True) + + +dispatcher.add_handler(SUDO_HANDLER) +dispatcher.add_handler(SUPPORT_HANDLER) +dispatcher.add_handler(TIGER_HANDLER) +dispatcher.add_handler(WHITELIST_HANDLER) +dispatcher.add_handler(UNSUDO_HANDLER) +dispatcher.add_handler(UNSUPPORT_HANDLER) +dispatcher.add_handler(UNTIGER_HANDLER) +dispatcher.add_handler(UNWHITELIST_HANDLER) +dispatcher.add_handler(WHITELISTLIST_HANDLER) +dispatcher.add_handler(TIGERLIST_HANDLER) +dispatcher.add_handler(SUPPORTLIST_HANDLER) +dispatcher.add_handler(SUDOLIST_HANDLER) +dispatcher.add_handler(DEVLIST_HANDLER) + + +__mod_name__ = "Bot Owner" + +__handlers__ = [ + SUDO_HANDLER, + SUPPORT_HANDLER, + TIGER_HANDLER, + WHITELIST_HANDLER, + UNSUDO_HANDLER, + UNSUPPORT_HANDLER, + UNTIGER_HANDLER, + UNWHITELIST_HANDLER, + WHITELISTLIST_HANDLER, + TIGERLIST_HANDLER, + SUPPORTLIST_HANDLER, + SUDOLIST_HANDLER, + DEVLIST_HANDLER, +] diff --git a/Exon/modules/error_handling.py b/Exon/modules/error_handling.py new file mode 100644 index 00000000..307943d4 --- /dev/null +++ b/Exon/modules/error_handling.py @@ -0,0 +1,140 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import io +import random +import sys +import traceback + +import pretty_errors +import requests +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update +from telegram.ext import CallbackContext, CommandHandler + +from Exon import DEV_USERS, ERROR_LOGS, dispatcher + +pretty_errors.mono() + + +class ErrorsDict(dict): + "ᴀ ᴄᴜsᴛᴏᴍ ᴅɪᴄᴛ to sᴛᴏʀᴇ ᴇʀʀᴏʀs ᴀɴᴅ ᴛʜᴇɪʀ ᴄᴏᴜɴᴛ" + + def __init__(self, *args, **kwargs): + self.raw = [] + super().__init__(*args, **kwargs) + + def __contains__(self, error): + self.raw.append(error) + error.identifier = "".join(random.choices("ABCDEFGHIJKLMNOPQRSTUVWXYZ", k=5)) + for e in self: + if type(e) is type(error) and e.args == error.args: + self[e] += 1 + return True + self[error] = 0 + return False + + def __len__(self): + return len(self.raw) + + +errors = ErrorsDict() + + +def error_callback(update: Update, context: CallbackContext): + if not update: + return + if context.error in errors: + return + try: + stringio = io.StringIO() + pretty_errors.output_stderr = stringio + output = pretty_errors.excepthook( + type(context.error), + context.error, + context.error.__traceback__, + ) + pretty_errors.output_stderr = sys.stderr + pretty_error = stringio.getvalue() + stringio.close() + except: + pretty_error = "ғᴀɪʟᴇᴅ ᴛᴏ ᴄʀᴇᴀᴛᴇ ᴘʀᴇᴛᴛʏ ᴇʀʀᴏʀ." + tb_list = traceback.format_exception( + None, + context.error, + context.error.__traceback__, + ) + tb = "".join(tb_list) + pretty_message = f'{pretty_error}\n-------------------------------------------------------------------------------\nAn exception was raised while handling an update\nUser: {update.effective_user.id}\nChat: {update.effective_chat.title if update.effective_chat else ""} {update.effective_chat.id if update.effective_chat else ""}\nCallback data: {update.callback_query.data if update.callback_query else "None"}\nMessage: {update.effective_message.text if update.effective_message else "No message"}\n\nFull Traceback: {tb}' + + key = requests.post( + "https://hastebin.com/documents", + data=pretty_message.encode("UTF-8"), + ).json() + e = html.escape(f"{context.error}") + if not key.get("key"): + with open("error.txt", "w+") as f: + f.write(pretty_message) + context.bot.send_document( + ERROR_LOGS, + open("error.txt", "rb"), + caption=f"#{context.error.identifier}\n<b>An unknown error occured:</b>\n<code>{e}</code>", + parse_mode="html", + ) + return + key = key.get("key") + url = f"https://hastebin.com/{key}" + context.bot.send_message( + ERROR_LOGS, + text=f"#{context.error.identifier}\n<b>An unknown error occured:</b>\n<code>{e}</code>", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton("ʜᴀsᴛᴇʙɪɴ", url=url)]], + ), + parse_mode="html", + ) + + +def list_errors(update: Update, context: CallbackContext): + if update.effective_user.id not in DEV_USERS: + return + e = dict(sorted(errors.items(), key=lambda item: item[1], reverse=True)) + msg = "<b>ᴇʀʀᴏʀs ʟɪsᴛ:</b>\n" + for x, value in e.items(): + msg += f"• <code>{x}:</code> <b>{value}</b> #{x.identifier}\n" + msg += f"{len(errors)} ʜᴀᴠᴇ ᴏᴄᴄᴜʀʀᴇᴅ sɪɴᴄᴇ sᴛᴀʀᴛᴜᴘ." + if len(msg) > 4096: + with open("errors_msg.txt", "w+") as f: + f.write(msg) + context.bot.send_document( + update.effective_chat.id, + open("errors_msg.txt", "rb"), + caption="ᴛᴏᴏ ᴍᴀɴʏ ᴇʀʀᴏʀs ʜᴀᴠᴇ ᴏᴄᴄᴜʀᴇᴅ..", + parse_mode="html", + ) + return + update.effective_message.reply_text(msg, parse_mode="html") + + +dispatcher.add_error_handler(error_callback) +dispatcher.add_handler(CommandHandler("errors", list_errors)) diff --git a/Exon/modules/errors.py b/Exon/modules/errors.py new file mode 100644 index 00000000..a188231a --- /dev/null +++ b/Exon/modules/errors.py @@ -0,0 +1,148 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import io +import random +import sys +import traceback + +import pretty_errors +import requests +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update +from telegram.ext import CallbackContext, CommandHandler + +from Exon import DEV_USERS +from Exon import ERROR_LOGS as JOIN_LOGGER +from Exon import dispatcher + +pretty_errors.mono() + + +class ErrorsDict(dict): + """A custom dict to store errors and their count""" + + def __init__(self, *args, **kwargs): + self.raw = [] + super().__init__(*args, **kwargs) + + def __contains__(self, error): + self.raw.append(error) + error.identifier = "".join(random.choices("ABCDEFGHIJKLMNOPQRSTUVWXYZ", k=5)) + for e in self: + if type(e) is type(error) and e.args == error.args: + self[e] += 1 + return True + self[error] = 0 + return False + + def __len__(self): + return len(self.raw) + + +errors = ErrorsDict() + + +def error_callback(update: Update, context: CallbackContext): + if not update: + return + if context.error not in errors: + try: + stringio = io.StringIO() + pretty_errors.output_stderr = stringio + pretty_errors.excepthook( + type(context.error), + context.error, + context.error.__traceback__, + ) + pretty_errors.output_stderr = sys.stderr + pretty_error = stringio.getvalue() + stringio.close() + except: + pretty_error = "ғᴀɪʟᴇᴅ ᴛᴏ ᴄʀᴇᴀᴛᴇ ᴘʀᴇᴛᴛʏ ᴇʀʀᴏʀ." + tb_list = traceback.format_exception( + None, + context.error, + context.error.__traceback__, + ) + tb = "".join(tb_list) + pretty_message = f'{pretty_error}\n-------------------------------------------------------------------------------\nAn exception was raised while handling an update\nUser: {update.effective_user.id}\nChat: {update.effective_chat.title if update.effective_chat else ""} {update.effective_chat.id if update.effective_chat else ""}\nCallback data: {update.callback_query.data if update.callback_query else "None"}\nMessage: {update.effective_message.text if update.effective_message else "No message"}\n\nFull Traceback: {tb}' + + extension = "txt" + url = "https://spaceb.in/api/v1/documents/" + try: + response = requests.post( + url, data={"content": pretty_message, "extension": extension} + ) + except Exception as e: + return {"error": str(e)} + response = response.json() + e = html.escape(f"{context.error}") + if not response: + with open("error.txt", "w+") as f: + f.write(pretty_message) + context.bot.send_document( + JOIN_LOGGER, + open("error.txt", "rb"), + caption=f"#{context.error.identifier}\n<b>Onichan some errors are happening:" + f"</b>\n<code>{e}</code>", + parse_mode="html", + ) + return + + url = f"https://spaceb.in/{response['payload']['id']}" + context.bot.send_message( + JOIN_LOGGER, + text=f"#{context.error.identifier}\n<b>Onichan some errors are happening!:" + f"</b>\n<code>{e}</code>", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton("sᴇᴇ ᴇʀʀᴏʀs", url=url)]], + ), + parse_mode="html", + ) + + +def list_errors(update: Update, context: CallbackContext): + if update.effective_user.id not in DEV_USERS: + return + e = dict(sorted(errors.items(), key=lambda item: item[1], reverse=True)) + msg = "<b>Errors List:</b>\n" + for x, value in e.items(): + msg += f"• <code>{x}:</code> <b>{value}</b> #{x.identifier}\n" + msg += f"{len(errors)} have occurred since startup." + if len(msg) > 4096: + with open("errors_msg.txt", "w+") as f: + f.write(msg) + context.bot.send_document( + update.effective_chat.id, + open("errors_msg.txt", "rb"), + caption="Too many errors have occured..", + parse_mode="html", + ) + return + update.effective_message.reply_text(msg, parse_mode="html") + + +dispatcher.add_error_handler(error_callback) +dispatcher.add_handler(CommandHandler("errors", list_errors)) diff --git a/Exon/modules/eval.py b/Exon/modules/eval.py new file mode 100644 index 00000000..ca0bb2f5 --- /dev/null +++ b/Exon/modules/eval.py @@ -0,0 +1,160 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 ast +import io +import os + +# Common imports for eval +import textwrap +import traceback +from contextlib import redirect_stdout + +from telegram import ParseMode, Update +from telegram.ext import CallbackContext, CommandHandler + +from Exon import LOGGER, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus + +namespaces = {} + + +def namespace_of(chat, update, bot): + if chat not in namespaces: + namespaces[chat] = { + "__builtins__": globals()["__builtins__"], + "bot": bot, + "effective_message": update.effective_message, + "effective_user": update.effective_user, + "effective_chat": update.effective_chat, + "update": update, + } + + return namespaces[chat] + + +def log_input(update): + user = update.effective_user.id + chat = update.effective_chat.id + LOGGER.info(f"ɪɴ: {update.effective_message.text} (user={user}, chat={chat})") + + +def send(msg, bot, update): + if len(str(msg)) > 2000: + with io.BytesIO(str.encode(msg)) as out_file: + out_file.name = "output.txt" + bot.send_document(chat_id=update.effective_chat.id, document=out_file) + else: + LOGGER.info(f"ᴏᴜᴛ: '{msg}'") + bot.send_message( + chat_id=update.effective_chat.id, + text=f"`{msg}`", + parse_mode=ParseMode.MARKDOWN, + ) + + +@dev_plus +def evaluate(update: Update, context: CallbackContext): + bot = context.bot + send(do(eval, bot, update), bot, update) + + +@dev_plus +def execute(update: Update, context: CallbackContext): + bot = context.bot + send(do(exec, bot, update), bot, update) + + +def cleanup_code(code): + if code.startswith("```") and code.endswith("```"): + return "\n".join(code.split("\n")[1:-1]) + return code.strip("` \n") + + +def do(func, bot, update): + log_input(update) + content = update.message.text.split(" ", 1)[-1] + body = cleanup_code(content) + env = namespace_of(update.message.chat_id, update, bot) + + os.chdir(os.getcwd()) + with open( + os.path.join(os.getcwd(), "Exon/modules/helper_funcs/temp.txt"), + "w", + ) as temp: + temp.write(body) + + stdout = io.StringIO() + + to_compile = f'def func():\n{textwrap.indent(body, " ")}' + + try: + exec(to_compile, env) + except Exception as e: + return f"{e.__class__.__name__}: {e}" + + func = env["func"] + + try: + with redirect_stdout(stdout): + func_return = func() + except Exception: + value = stdout.getvalue() + return f"{value}{traceback.format_exc()}" + else: + value = stdout.getvalue() + result = None + if func_return is None: + if value: + result = f"{value}" + else: + try: + result = f"{repr(ast.literal_eval(body, env))}" + except: + pass + else: + result = f"{value}{func_return}" + if result: + return result + + +@dev_plus +def clear(update: Update, context: CallbackContext): + bot = context.bot + log_input(update) + global namespaces + if update.message.chat_id in namespaces: + del namespaces[update.message.chat_id] + send("Cleared locals.", bot, update) + + +EVAL_HANDLER = CommandHandler(("e", "ev", "eva", "eval"), evaluate, run_async=True) +EXEC_HANDLER = CommandHandler(("x", "ex", "exe", "exec", "py"), execute, run_async=True) +CLEAR_HANDLER = CommandHandler("clearlocals", clear, run_async=True) + +dispatcher.add_handler(EVAL_HANDLER) +dispatcher.add_handler(EXEC_HANDLER) +dispatcher.add_handler(CLEAR_HANDLER) + +__mod_name__ = "ᴇᴠᴀʟ-ᴍᴏᴅᴜʟᴇ" diff --git a/Exon/modules/extras.py b/Exon/modules/extras.py new file mode 100644 index 00000000..8c44296d --- /dev/null +++ b/Exon/modules/extras.py @@ -0,0 +1,208 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 jikanpy +from bs4 import BeautifulSoup +from markdown import markdown +from telethon.sync import events + +from Exon import DEV_USERS, telethn + + +def md_to_text(md): + html = markdown(md) + soup = BeautifulSoup(html, features="html.parser") + return soup.get_text() + + +async def reply_id(event): + reply_to_id = None + if event.sender_id in DEV_USERS: + reply_to_id = event.id + if event.reply_to_msg_id: + reply_to_id = event.reply_to_msg_id + return reply_to_id + + +async def edit_or_reply( + event, + text, + parse_mode=None, + link_preview=None, + file_name=None, + aslink=False, + deflink=False, + noformat=False, + linktext=None, + caption=None, +): # sourcery no-metrics + link_preview = link_preview or False + reply_to = await event.get_reply_message() + if len(text) < 4096 and not deflink: + parse_mode = parse_mode or "md" + if event.sender_id in DEV_USERS: + if reply_to: + return await reply_to.reply( + text, parse_mode=parse_mode, link_preview=link_preview + ) + return await event.reply( + text, parse_mode=parse_mode, link_preview=link_preview + ) + await event.edit(text, parse_mode=parse_mode, link_preview=link_preview) + return event + if not noformat: + text = md_to_text(text) + if aslink or deflink: + linktext = linktext or "ᴍᴇssᴀɢᴇ ᴡᴀs ᴛᴏ ʙɪɢ sᴏ ᴘᴀsᴛᴇᴅ ᴛᴏ ʙɪɴ" + response = await paste_message(text, pastetype="s") + text = f"{linktext} [here]({response})" + if event.sender_id in DEV_USERS: + if reply_to: + return await reply_to.reply(text, link_preview=link_preview) + return await event.reply(text, link_preview=link_preview) + await event.edit(text, link_preview=link_preview) + return event + file_name = file_name or "output.txt" + caption = caption or None + with open(file_name, "w+") as output: + output.write(text) + if reply_to: + await reply_to.reply(caption, file=file_name) + await event.delete() + return os.remove(file_name) + if event.sender_id in DEV_USERS: + await event.reply(caption, file=file_name) + await event.delete() + return os.remove(file_name) + await event.client.send_file(event.chat_id, file_name, caption=caption) + await event.delete() + os.remove(file_name) + + +async def edit_delete(event, text, time=None, parse_mode=None, link_preview=None): + parse_mode = parse_mode or "md" + link_preview = link_preview or False + time = time or 5 + if event.sender_id in DEV_USERS: + reply_to = await event.get_reply_message() + himaevent = ( + await reply_to.reply(text, link_preview=link_preview, parse_mode=parse_mode) + if reply_to + else await event.reply( + text, link_preview=link_preview, parse_mode=parse_mode + ) + ) + else: + himaevent = await event.edit( + text, link_preview=link_preview, parse_mode=parse_mode + ) + await asyncio.sleep(time) + return await himaevent.delete() + + +import random + +import requests + + +@telethn.on(events.NewMessage(pattern="^[!/]gif")) +async def some(event): + try: + inpt = event.text.split(" ", maxsplit=1)[1] + except IndexError: + return await event.reply("Usage: /gif <query>") + """Sends random gifs of your query""" + reply_to_id = await reply_id(event) + count = 1 + if ";" in inpt: + inpt, count = inpt.split(";") + if int(count) < 0 and int(count) > 20: + await edit_delete(event, "`ɢɪᴠᴇ ᴠᴀʟᴜᴇ ɪɴ ʀᴀɴɢᴇ 1-20`") + himaevent = await edit_or_reply(event, "`sᴇɴᴅɪɴɢ ɢɪғ....`") + res = requests.get("https://giphy.com/") + res = res.text.split("GIPHY_FE_WEB_API_KEY =")[1].split("\n")[0] + api_key = res[2:-1] + r = requests.get( + f"https://api.giphy.com/v1/gifs/search?q={inpt}&api_key={api_key}&limit=50" + ).json() + list_id = [r["data"][i]["id"] for i in range(len(r["data"]))] + rlist = random.sample(list_id, int(count)) + for items in rlist: + nood = await event.client.send_file( + event.chat_id, + f"https://media.giphy.com/media/{items}/giphy.gif", + reply_to=reply_to_id, + ) + await himaevent.delete() + + +# schedule for anime + +weekdays = { + "monday": 0, + "tuesday": 1, + "wednesday": 2, + "thursday": 3, + "friday": 4, + "saturday": 5, + "sunday": 6, +} + + +def get_weekday(dayid): + for key, value in weekdays.items(): + if value == dayid: + return key + + +async def get_anime_schedule(weekid): + "ɢᴇᴛ ᴀɴɪᴍᴇ sᴄʜᴇᴅᴜʟᴇ" + dayname = get_weekday(weekid) + result = ( + f"✙ **ᴛɪᴍᴇ ᴢᴏɴᴇ: ᴊᴀᴘᴀɴ**\n**sᴄʜᴇᴅᴜʟᴇᴅ ᴀɴɪᴍᴇ ғᴏʀ {dayname.title()} ᴀʀᴇ : **\n\n" + ) + async with jikanpy.AioJikan() as animesession: + scheduled_list = (await animesession.schedule(day=dayname)).get(dayname) + for a_name in scheduled_list: + result += f"• [{a_name['title']}]({a_name['url']})\n" + return result, dayname + + +@telethn.on(events.NewMessage(pattern="^[!/]schedule ?(.*)")) +async def aschedule_fetch(event): + "To ɢᴇᴛ ʟɪsᴛ ᴏғ ᴀɴɪᴍᴇs sᴄʜᴇᴅᴜʟᴇᴅ ᴏɴ ᴛʜᴀᴛ ᴅᴀʏ" + input_str = event.pattern_match.group(1) or datetime.now().weekday() + if input_str in weekdays: + input_str = weekdays[input_str] + try: + input_str = int(input_str) + except ValueError: + return await edit_delete(event, "`ʏᴏᴜ ʜᴀᴠᴇ ɢɪᴠᴇɴ ᴀɴ ɪɴᴠᴀʟɪᴅ ᴡᴇᴇᴋᴅᴀʏ`", 7) + if input_str not in [0, 1, 2, 3, 4, 5, 6]: + return await edit_delete(event, "`ʏᴏᴜ ʜᴀᴠᴇ ɢɪᴠᴇɴ ᴀɴ ɪɴᴠᴀʟɪᴅ ᴡᴇᴇᴋᴅᴀʏ`", 7) + result = await get_anime_schedule(input_str) + await edit_or_reply(event, result[0]) diff --git a/Exon/modules/feds.py b/Exon/modules/feds.py new file mode 100644 index 00000000..5fafebfe --- /dev/null +++ b/Exon/modules/feds.py @@ -0,0 +1,2455 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 csv +import json +import os +import re +import time +import uuid +from io import BytesIO + +from telegram import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + MessageEntity, + ParseMode, + Update, +) +from telegram.error import BadRequest, TelegramError, Unauthorized +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + run_async, +) +from telegram.utils.helpers import mention_html, mention_markdown + +import Exon.modules.sql.feds_sql as sql +from Exon import DRAGONS, EVENT_LOGS, LOGGER, OWNER_ID, TIGERS, WOLVES, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_message +from Exon.modules.helper_funcs.chat_status import is_user_admin +from Exon.modules.helper_funcs.extraction import ( + extract_unt_fedban, + extract_user, + extract_user_fban, +) +from Exon.modules.helper_funcs.string_handling import markdown_parser + +FBAN_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/unrestrict ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "User_not_participant", + "Peer_id_invalid", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ ᴀ ᴜsᴇʀ ᴛᴏ ᴋɪᴄᴋ ɪᴛ ғʀᴏᴍ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "Chat_admin_required", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴋɪᴄᴋ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "Channel_private", + "Not in the chat", + "ʜᴀᴠᴇ ɴᴏ ʀɪɢʜᴛs ᴛᴏ sᴇɴᴅ ᴀ ᴍᴇssᴀɢᴇ", +} + +UNFBAN_ERRORS = { + "ᴜsᴇʀ is ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ enough ʀɪɢʜᴛs ᴛᴏ restrict/unrestrict ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "User_not_participant", + "ᴍᴇᴛʜᴏᴅ is available for sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴄʜᴀɴɴᴇʟ ᴄʜᴀᴛs ᴏɴʟʏ", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", + "Channel_private", + "Chat_admin_required", + "ʜᴀᴠᴇ ɴᴏ ʀɪɢʜᴛs to sᴇɴᴅ a ᴍᴇssᴀɢᴇ", +} + + +@run_async +def new_fed(update: Update, context: CallbackContext): + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + if chat.type != "private": + update.effective_message.reply_text( + "ғᴇᴅᴇʀᴀᴛɪᴏɴs ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴄʀᴇᴀᴛᴇᴅ ʙʏ ᴘʀɪᴠᴀᴛᴇʟʏ ᴍᴇssᴀɢɪɴɢ ᴍᴇ." + ) + return + if len(message.text) == 1: + send_message( + update.effective_message, "ᴘʟᴇᴀsᴇ ᴡʀɪᴛᴇ ᴛʜᴇ ɴᴀᴍᴇ ᴏғ ᴛʜᴇ ғᴇᴅᴇʀᴀᴛɪᴏɴ!" + ) + return + fednam = message.text.split(None, 1)[1] + if fednam != "": + fed_id = str(uuid.uuid4()) + fed_name = fednam + LOGGER.info(fed_id) + + x = sql.new_fed(user.id, fed_name, fed_id) + if not x: + update.effective_message.reply_text( + "Can't ғᴇᴅᴇʀᴀᴛᴇ! ᴘʟᴇᴀsᴇ ᴄᴏɴᴛᴀᴄᴛ @AbishnoiMF if the problem persist." + ) + return + + update.effective_message.reply_text( + f"*You ʜᴀᴠᴇ succeeded in creating a new federation!*\nName: `{fed_name}`\nID: `{fed_id}`\n\nUse the ᴄᴏᴍᴍᴀɴᴅ below to join the federation:\n`/joinfed {fed_id}`", + parse_mode=ParseMode.MARKDOWN, + ) + + try: + bot.send_message( + EVENT_LOGS, + f"ɴᴇᴡ ғᴇᴅᴇʀᴀᴛɪᴏɴ: <b>{fed_name}</b>\nID: <pre>{fed_id}</pre>", + parse_mode=ParseMode.HTML, + ) + + except: + LOGGER.warning("ᴄᴀɴɴᴏᴛ sᴇɴᴅ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ EVENT_LOGS") + else: + update.effective_message.reply_text( + "ᴘʟᴇᴀsᴇ ᴡʀɪᴛᴇ ᴅᴏᴡɴ ᴛʜᴇ ɴᴀᴍᴇ ᴏғ ᴛʜᴇ federation" + ) + + +@run_async +def del_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + if chat.type != "private": + update.effective_message.reply_text( + "ғᴇᴅᴇʀᴀᴛɪᴏɴs ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴅᴇʟᴇᴛᴇᴅ ʙʏ ᴘʀɪᴠᴀᴛᴇʟʏ ᴍᴇssᴀɢɪɴɢ ᴍᴇ." + ) + return + if args: + is_fed_id = args[0] + getinfo = sql.get_fed_info(is_fed_id) + if getinfo is False: + update.effective_message.reply_text("This federation does not exist.") + return + if int(getinfo["owner"]) == int(user.id) or int(user.id) == OWNER_ID: + fed_id = is_fed_id + else: + update.effective_message.reply_text("Only federation owners can do this!") + return + else: + update.effective_message.reply_text("What should I delete?") + return + + if is_user_fed_owner(fed_id, user.id) is False: + update.effective_message.reply_text("Only federation owners can do this!") + return + + update.effective_message.reply_text( + f"You sure you want to delete your federation? This cannot be reverted, you will lose your entire ban list, and '{getinfo['fname']}' will be permanently lost.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="⚠️ ᴅᴇʟᴇᴛᴇ ғᴇᴅᴇʀᴀᴛɪᴏɴ ⚠️", + callback_data=f"rmfed_{fed_id}", + ) + ], + [InlineKeyboardButton(text="ᴄᴀɴᴄᴇʟ", callback_data="rmfed_cancel")], + ] + ), + ) + + +@run_async +def rename_fed(update, context): + user = update.effective_user + msg = update.effective_message + args = msg.text.split(None, 2) + + if len(args) < 3: + return msg.reply_text("ᴜsᴀɢᴇ: /renamefed <fed_id> <newname>") + + fed_id, newname = args[1], args[2] + verify_fed = sql.get_fed_info(fed_id) + + if not verify_fed: + return msg.reply_text("This fed not exist in my database!") + + if is_user_fed_owner(fed_id, user.id): + sql.rename_fed(fed_id, user.id, newname) + msg.reply_text(f"Successfully renamed your fed name to {newname}!") + else: + msg.reply_text("Only federation owner can do this!") + + +@run_async +def fed_chat(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + update.effective_user + fed_id = sql.get_fed_id(chat.id) + + user_id = update.effective_message.from_user.id + if not is_user_admin(update.effective_chat, user_id): + update.effective_message.reply_text( + "You must be an admin to execute this command" + ) + return + + if not fed_id: + update.effective_message.reply_text("This group is not in any federation!") + return + + update.effective_user + chat = update.effective_chat + info = sql.get_fed_info(fed_id) + + text = ( + "This group is part of the following federation:" + + f"\n{info['fname']} (ID: <code>{fed_id}</code>)" + ) + + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + + +@run_async +def join_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + message = update.effective_message + administrators = chat.get_administrators() + fed_id = sql.get_fed_id(chat.id) + + if user.id not in DRAGONS: + for admin in administrators: + status = admin.status + if status == "creator" and str(admin.user.id) != str(user.id): + update.effective_message.reply_text( + "Only group creators can use this command!" + ) + return + if fed_id: + message.reply_text("You cannot join two federations from one chat") + return + + if len(args) >= 1: + getfed = sql.search_fed_by_id(args[0]) + if getfed is False: + message.reply_text("Please enter a valid federation ID") + return + + x = sql.chat_join_fed(args[0], chat.title, chat.id) + if not x: + message.reply_text( + "Failed to join federation! Please contact @AbishnoiMF should this problem persist!" + ) + return + + if get_fedlog := sql.get_fed_log(args[0]): + if eval(get_fedlog): + bot.send_message( + get_fedlog, + f"Chat *{chat.title}* has joined the federation *{getfed['fname']}*", + parse_mode="markdown", + ) + + message.reply_text(f"This group has joined the federation: {getfed['fname']}!") + + +@run_async +def leave_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our PM!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + fed_info = sql.get_fed_info(fed_id) + + # administrators = chat.get_administrators().status + getuser = bot.get_chat_member(chat.id, user.id).status + if getuser in "creator" or user.id in DRAGONS: + if sql.chat_leave_fed(chat.id) is True: + if get_fedlog := sql.get_fed_log(fed_id): + if eval(get_fedlog): + bot.send_message( + get_fedlog, + f"Chat *{chat.title}* has left the federation *{fed_info['fname']}*", + parse_mode="markdown", + ) + + send_message( + update.effective_message, + f"This group has left the federation {fed_info['fname']}!", + ) + + else: + update.effective_message.reply_text( + "How can you leave a federation that you never joined?!" + ) + else: + update.effective_message.reply_text("Only group creators can use this command!") + + +@run_async +def user_join_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if is_user_fed_owner(fed_id, user.id) or user.id in DRAGONS: + user_id = extract_user(msg, args) + if user_id: + user = bot.get_chat(user_id) + elif not msg.reply_to_message and not args: + user = msg.from_user + elif not msg.reply_to_message and ( + not args + or ( + len(args) >= 1 + and not args[0].startswith("@") + and not args[0].isdigit() + and not msg.parse_entities([MessageEntity.TEXT_MENTION]) + ) + ): + msg.reply_text("I cannot extract user from this message") + return + else: + LOGGER.warning("error") + getuser = sql.search_user_in_fed(fed_id, user_id) + fed_id = sql.get_fed_id(chat.id) + info = sql.get_fed_info(fed_id) + get_owner = eval(info["fusers"])["owner"] + get_owner = bot.get_chat(get_owner).id + if user_id == get_owner: + update.effective_message.reply_text( + "You do know that the user is the federation owner, right? RIGHT?" + ) + return + if getuser: + update.effective_message.reply_text( + "I cannot promote users who are already federation admins! Can remove them if you want!" + ) + return + if user_id == bot.id: + update.effective_message.reply_text( + "I already am a federation admin in all federations!" + ) + return + if res := sql.user_join_fed(fed_id, user_id): + update.effective_message.reply_text("Successfully Promoted!") + else: + update.effective_message.reply_text("Failed to promote!") + else: + update.effective_message.reply_text("Only federation owners can do this!") + + +@run_async +def user_demote_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if is_user_fed_owner(fed_id, user.id): + msg = update.effective_message + user_id = extract_user(msg, args) + if user_id: + user = bot.get_chat(user_id) + + elif not msg.reply_to_message and not args: + user = msg.from_user + + elif not msg.reply_to_message and ( + not args + or ( + len(args) >= 1 + and not args[0].startswith("@") + and not args[0].isdigit() + and not msg.parse_entities([MessageEntity.TEXT_MENTION]) + ) + ): + msg.reply_text("I cannot extract user from this message") + return + else: + LOGGER.warning("error") + + if user_id == bot.id: + update.effective_message.reply_text( + "The thing you are trying to demote me from will fail to work without me! Just saying." + ) + return + + if sql.search_user_in_fed(fed_id, user_id) is False: + update.effective_message.reply_text( + "I cannot demote people who are not federation admins!" + ) + return + + res = sql.user_demote_fed(fed_id, user_id) + if res is True: + update.effective_message.reply_text("Demoted from a Fed Admin!") + else: + update.effective_message.reply_text("Demotion failed!") + else: + update.effective_message.reply_text("Only federation owners can do this!") + return + + +@run_async +def fed_info(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + if args: + fed_id = args[0] + else: + fed_id = sql.get_fed_id(chat.id) + if not fed_id: + send_message( + update.effective_message, "This group is not in any federation!" + ) + return + info = sql.get_fed_info(fed_id) + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("Only a federation admin can do this!") + return + + owner = bot.get_chat(info["owner"]) + try: + owner_name = f"{owner.first_name} {owner.last_name}" + except: + owner_name = owner.first_name + FEDADMIN = sql.all_fed_users(fed_id) + TotalAdminFed = len(FEDADMIN) + + user = update.effective_user + chat = update.effective_chat + info = sql.get_fed_info(fed_id) + + text = "<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ ɪɴғᴏʀᴍᴀᴛɪᴏɴ:</b>" + f"\nFedID: <code>{fed_id}</code>" + text += f"\nɴᴀᴍᴇ: {info['fname']}" + text += f"\nᴄʀᴇᴀᴛᴏʀ: {mention_html(owner.id, owner_name)}" + text += f"\nᴀʟʟ ᴀᴅᴍɪɴs: <code>{TotalAdminFed}</code>" + getfban = sql.get_all_fban_users(fed_id) + text += f"\nᴛᴏᴛᴀʟ ʙᴀɴɴᴇᴅ ᴜsᴇʀs: <code>{len(getfban)}</code>" + getfchat = sql.all_fed_chats(fed_id) + text += f"\nɴᴜᴍʙᴇʀ ᴏғ ɢʀᴏᴜᴘs ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ: <code>{len(getfchat)}</code>" + + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + + +@run_async +def fed_admin(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs sᴘᴇᴄɪғɪᴄ ᴛᴏ ᴛʜᴇ ɢʀᴏᴜᴘ, ɴᴏᴛ to ᴏᴜʀ ᴘᴍ!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if not fed_id: + update.effective_message.reply_text("ᴛʜɪs ɢʀᴏᴜᴘ is ɴᴏᴛ in ᴀɴʏ ғᴇᴅᴇʀᴀᴛɪᴏɴ!") + return + + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("ᴏɴʟʏ ғᴇᴅᴇʀᴀᴛɪᴏɴ ᴀᴅᴍɪɴs ᴄᴀɴ ᴅᴏ ᴛʜɪs!") + return + + user = update.effective_user + chat = update.effective_chat + info = sql.get_fed_info(fed_id) + + text = f"<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ ᴀᴅᴍɪɴ {info['fname']}:</b>\n\n" + "Owner:\n" + owner = bot.get_chat(info["owner"]) + try: + owner_name = f"{owner.first_name} {owner.last_name}" + except: + owner_name = owner.first_name + text += f" ? {mention_html(owner.id, owner_name)}\n" + + members = sql.all_fed_members(fed_id) + if len(members) == 0: + text += "\nThere ᴀʀᴇ ɴᴏ ᴀᴅᴍɪɴs ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ" + else: + text += "\nᴀᴅᴍɪɴ:\n" + for x in members: + user = bot.get_chat(x) + text += f" {mention_html(user.id, user.first_name)}\n" + + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + + +@run_async +def fed_ban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ is sᴘᴇᴄɪғɪᴄ ᴛᴏ ᴛʜᴇ ɢʀᴏᴜᴘ, ɴᴏᴛ ᴛᴏ ᴏᴜʀ ᴘᴍ!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + info = sql.get_fed_info(fed_id) + getfednotif = sql.user_feds_report(info["owner"]) + + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("Only federation admins can do this!") + return + + message = update.effective_message + + user_id, reason = extract_unt_fedban(message, args) + + fban, fbanreason, fbantime = sql.get_fban_user(fed_id, user_id) + + if not user_id: + message.reply_text("You don't seem to be referring to a user") + return + + if user_id == bot.id: + message.reply_text( + "What is funnier than kicking the group creator? Self sacrifice." + ) + return + + if is_user_fed_owner(fed_id, user_id) is True: + message.reply_text("Why did you try the federation fban?") + return + + if is_user_fed_admin(fed_id, user_id) is True: + message.reply_text("He is a federation admin, I can't fban him.") + return + + if user_id == OWNER_ID: + message.reply_text("Disaster level God cannot be fed banned!") + return + + if int(user_id) in DRAGONS: + message.reply_text("Dragons cannot be fed banned!") + return + + if int(user_id) in TIGERS: + message.reply_text("Tigers cannot be fed banned!") + return + + if int(user_id) in WOLVES: + message.reply_text("Wolves cannot be fed banned!") + return + + if user_id in [777000, 1087968824]: + message.reply_text("Fool! You can't attack Telegram's native tech!") + return + + try: + user_chat = bot.get_chat(user_id) + isvalid = True + fban_user_id = user_chat.id + fban_user_name = user_chat.first_name + fban_user_lname = user_chat.last_name + fban_user_uname = user_chat.username + except BadRequest as excp: + if not str(user_id).isdigit(): + send_message(update.effective_message, excp.message) + return + elif len(str(user_id)) != 9: + send_message(update.effective_message, "That's so not a user!") + return + isvalid = False + fban_user_id = int(user_id) + fban_user_name = "user({})".format(user_id) + fban_user_lname = None + fban_user_uname = None + + if isvalid and user_chat.type != "private": + send_message(update.effective_message, "That's so not a user!") + return + + if isvalid: + user_target = mention_html(fban_user_id, fban_user_name) + else: + user_target = fban_user_name + + if fban: + fed_name = info["fname"] + + temp = sql.un_fban_user(fed_id, fban_user_id) + if not temp: + message.reply_text("Failed to update the reason for fedban!") + return + x = sql.fban_user( + fed_id, + fban_user_id, + fban_user_name, + fban_user_lname, + fban_user_uname, + reason, + int(time.time()), + ) + if not x: + message.reply_text( + "Failed to ban from the federation! If this problem continues, contact @NekoArsh." + ) + return + + fed_chats = sql.all_fed_chats(fed_id) + # Will send to current chat + bot.send_message( + chat.id, + "<b>ғᴇᴅʙᴀɴ ʀᴇᴀsᴏɴ ᴜᴘᴅᴀᴛᴇᴅ</b>" + "\n<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ:</b> {}" + "\n<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ ᴀᴅᴍɪɴ:</b> {}" + "\n<b>ᴜsᴇʀ:</b> {}" + "\n<b>ᴜsᴇʀ ID:</b> <code>{}</code>" + "\n<b>ʀᴇᴀsᴏɴ:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + # Send message to owner if fednotif is enabled + if getfednotif: + bot.send_message( + info["owner"], + "<b>FedBan reason updated</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>ᴜsᴇʀ ID:</b> <code>{}</code>" + "\n<b>Reason:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + # If fedlog is set, then send message, except fedlog is current chat + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if int(get_fedlog) != int(chat.id): + bot.send_message( + get_fedlog, + "<b>ғᴇᴅʙᴀɴ ʀᴇᴀsᴏɴ ᴜᴘᴅᴀᴛᴇᴅ</b>" + "\n<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ:</b> {}" + "\n<b>ғᴇᴅᴇʀᴀᴛɪᴏɴ ᴀᴅᴍɪɴ:</b> {}" + "\n<b>ᴜsᴇʀ:</b> {}" + "\n<b>ᴜsᴇʀ ɪᴅ:</b> <code>{}</code>" + "\n<b>ʀᴇᴀsᴏɴ:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + for fedschat in fed_chats: + try: + # Do not spam all fed chats + """ + bot.send_message(chat, "<b>FedBan reason updated</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>" \ + "\n<b>Reason:</b> {}".format(fed_name, mention_html(user.id, user.first_name), user_target, fban_user_id, reason), parse_mode="HTML") + """ + bot.kick_chat_member(fedschat, fban_user_id) + except BadRequest as excp: + if excp.message in FBAN_ERRORS: + try: + dispatcher.bot.getChat(fedschat) + except Unauthorized: + sql.chat_leave_fed(fedschat) + LOGGER.info( + "ᴄʜᴀᴛ {} ʜᴀs ʟᴇᴀᴠᴇ ғᴇᴅ {} ʙᴇᴄᴀᴜsᴇ I ᴡᴀs ᴋɪᴄᴋᴇᴅ".format( + fedschat, info["fname"] + ) + ) + continue + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "ᴄᴏᴜʟᴅ ɴᴏᴛ ғʙᴀɴ ᴏɴ {} ʙᴇᴄᴀᴜsᴇ: {}".format(chat, excp.message) + ) + except TelegramError: + pass + # Also do not spam all fed admins + """ + send_to_list(bot, FEDADMIN, + "<b>FedBan reason updated</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>" \ + "\n<b>Reason:</b> {}".format(fed_name, mention_html(user.id, user.first_name), user_target, fban_user_id, reason), + html=True) + """ + + # Fban for fed subscriber + subscriber = list(sql.get_subscriber(fed_id)) + if len(subscriber) != 0: + for fedsid in subscriber: + all_fedschat = sql.all_fed_chats(fedsid) + for fedschat in all_fedschat: + try: + bot.kick_chat_member(fedschat, fban_user_id) + except BadRequest as excp: + if excp.message in FBAN_ERRORS: + try: + dispatcher.bot.getChat(fedschat) + except Unauthorized: + targetfed_id = sql.get_fed_id(fedschat) + sql.unsubs_fed(fed_id, targetfed_id) + LOGGER.info( + "ᴄʜᴀᴛ {} ʜᴀs ᴜɴsᴜʙ ғᴇᴅ {} ʙᴇᴄᴀᴜsᴇ I ᴡᴀs ᴋɪᴄᴋᴇᴅ".format( + fedschat, info["fname"] + ) + ) + continue + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "ᴜɴᴀʙʟᴇ ᴛᴏ ғʙᴀɴ ᴏɴ {} ʙᴇᴄᴀᴜsᴇ: {}".format( + fedschat, excp.message + ) + ) + except TelegramError: + pass + # send_message(update.effective_message, "Fedban Reason has been updated.") + return + + fed_name = info["fname"] + + # starting = "Starting a federation ban for {} in the Federation <b>{}</b>.".format( + # user_target, fed_name) + # update.effective_message.reply_text(starting, parse_mode=ParseMode.HTML) + + # if reason == "": + # reason = "No reason given." + + x = sql.fban_user( + fed_id, + fban_user_id, + fban_user_name, + fban_user_lname, + fban_user_uname, + reason, + int(time.time()), + ) + if not x: + message.reply_text( + "Failed to ban from the federation! If this problem continues, contact @HuntersAssociations." + ) + return + + fed_chats = sql.all_fed_chats(fed_id) + # Will send to current chat + bot.send_message( + chat.id, + "<b>FedBan reason updated</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>" + "\n<b>Reason:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + # Send message to owner if fednotif is enabled + if getfednotif: + bot.send_message( + info["owner"], + "<b>FedBan reason updated</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>" + "\n<b>Reason:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + # If fedlog is set, then send message, except fedlog is current chat + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if int(get_fedlog) != int(chat.id): + bot.send_message( + get_fedlog, + "<b>FedBan reason updated</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>" + "\n<b>Reason:</b> {}".format( + fed_name, + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + reason, + ), + parse_mode="HTML", + ) + chats_in_fed = 0 + for fedschat in fed_chats: + chats_in_fed += 1 + try: + # Do not spamming all fed chats + """ + bot.send_message(chat, "<b>FedBan reason updated</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>" \ + "\n<b>Reason:</b> {}".format(fed_name, mention_html(user.id, user.first_name), user_target, fban_user_id, reason), parse_mode="HTML") + """ + bot.kick_chat_member(fedschat, fban_user_id) + except BadRequest as excp: + if excp.message in FBAN_ERRORS: + pass + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "Could not fban on {} because: {}".format(chat, excp.message) + ) + except TelegramError: + pass + + # Also do not spamming all fed admins + """ + send_to_list(bot, FEDADMIN, + "<b>FedBan reason updated</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>" \ + "\n<b>Reason:</b> {}".format(fed_name, mention_html(user.id, user.first_name), user_target, fban_user_id, reason), + html=True) + """ + + # Fban for fed subscriber + subscriber = list(sql.get_subscriber(fed_id)) + if len(subscriber) != 0: + for fedsid in subscriber: + all_fedschat = sql.all_fed_chats(fedsid) + for fedschat in all_fedschat: + try: + bot.kick_chat_member(fedschat, fban_user_id) + except BadRequest as excp: + if excp.message in FBAN_ERRORS: + try: + dispatcher.bot.getChat(fedschat) + except Unauthorized: + targetfed_id = sql.get_fed_id(fedschat) + sql.unsubs_fed(fed_id, targetfed_id) + LOGGER.info( + "Chat {} has unsub fed {} because I was kicked".format( + fedschat, info["fname"] + ) + ) + continue + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "Unable to fban on {} because: {}".format( + fedschat, excp.message + ) + ) + except TelegramError: + pass + # if chats_in_fed == 0: + # send_message(update.effective_message, "Fedban affected 0 chats. ") + # elif chats_in_fed > 0: + # send_message(update.effective_message, + # "Fedban affected {} chats. ".format(chats_in_fed)) + + +@run_async +def unfban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + info = sql.get_fed_info(fed_id) + getfednotif = sql.user_feds_report(info["owner"]) + + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("Only federation admins can do this!") + return + + user_id = extract_user_fban(message, args) + if not user_id: + message.reply_text("You do not seem to be referring to a user.") + return + + try: + user_chat = bot.get_chat(user_id) + isvalid = True + fban_user_id = user_chat.id + fban_user_name = user_chat.first_name + user_chat.last_name + user_chat.username + except BadRequest as excp: + if not str(user_id).isdigit(): + send_message(update.effective_message, excp.message) + return + elif len(str(user_id)) != 9: + send_message(update.effective_message, "That's so not a user!") + return + isvalid = False + fban_user_id = int(user_id) + fban_user_name = "user({})".format(user_id) + + if isvalid and user_chat.type != "private": + message.reply_text("That's so not a user!") + return + + if isvalid: + user_target = mention_html(fban_user_id, fban_user_name) + else: + user_target = fban_user_name + + fban, fbanreason, fbantime = sql.get_fban_user(fed_id, fban_user_id) + if fban is False: + message.reply_text("This user is not fbanned!") + return + + update.effective_user + + # message.reply_text("I'll give {} another chance in this federation".format(user_chat.first_name)) + + chat_list = sql.all_fed_chats(fed_id) + # Will send to current chat + bot.send_message( + chat.id, + "<b>Un-FedBan</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>".format( + info["fname"], + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + ), + parse_mode="HTML", + ) + # Send message to owner if fednotif is enabled + if getfednotif: + bot.send_message( + info["owner"], + "<b>Un-FedBan</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>".format( + info["fname"], + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + ), + parse_mode="HTML", + ) + # If fedlog is set, then send message, except fedlog is current chat + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if int(get_fedlog) != int(chat.id): + bot.send_message( + get_fedlog, + "<b>Un-FedBan</b>" + "\n<b>Federation:</b> {}" + "\n<b>Federation Admin:</b> {}" + "\n<b>User:</b> {}" + "\n<b>User ID:</b> <code>{}</code>".format( + info["fname"], + mention_html(user.id, user.first_name), + user_target, + fban_user_id, + ), + parse_mode="HTML", + ) + unfbanned_in_chats = 0 + for fedchats in chat_list: + unfbanned_in_chats += 1 + try: + member = bot.get_chat_member(fedchats, user_id) + if member.status == "kicked": + bot.unban_chat_member(fedchats, user_id) + # Do not spamming all fed chats + """ + bot.send_message(chat, "<b>Un-FedBan</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>".format(info['fname'], mention_html(user.id, user.first_name), user_target, fban_user_id), parse_mode="HTML") + """ + except BadRequest as excp: + if excp.message in UNFBAN_ERRORS: + pass + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "Could not fban on {} because: {}".format(chat, excp.message) + ) + except TelegramError: + pass + + try: + x = sql.un_fban_user(fed_id, user_id) + if not x: + send_message( + update.effective_message, + "Un-fban failed, this user may already be un-fedbanned!", + ) + return + except: + pass + + # UnFban for fed subscriber + subscriber = list(sql.get_subscriber(fed_id)) + if len(subscriber) != 0: + for fedsid in subscriber: + all_fedschat = sql.all_fed_chats(fedsid) + for fedschat in all_fedschat: + try: + bot.unban_chat_member(fedchats, user_id) + except BadRequest as excp: + if excp.message in FBAN_ERRORS: + try: + dispatcher.bot.getChat(fedschat) + except Unauthorized: + targetfed_id = sql.get_fed_id(fedschat) + sql.unsubs_fed(fed_id, targetfed_id) + LOGGER.info( + "Chat {} has unsub fed {} because I was kicked".format( + fedschat, info["fname"] + ) + ) + continue + elif excp.message == "User_id_invalid": + break + else: + LOGGER.warning( + "Unable to fban on {} because: {}".format( + fedschat, excp.message + ) + ) + except TelegramError: + pass + + if unfbanned_in_chats == 0: + send_message( + update.effective_message, "This person has been un-fbanned in 0 chats." + ) + if unfbanned_in_chats > 0: + send_message( + update.effective_message, + "This person has been un-fbanned in {} chats.".format(unfbanned_in_chats), + ) + # Also do not spamming all fed admins + """ + FEDADMIN = sql.all_fed_users(fed_id) + for x in FEDADMIN: + getreport = sql.user_feds_report(x) + if getreport is False: + FEDADMIN.remove(x) + send_to_list(bot, FEDADMIN, + "<b>Un-FedBan</b>" \ + "\n<b>Federation:</b> {}" \ + "\n<b>Federation Admin:</b> {}" \ + "\n<b>User:</b> {}" \ + "\n<b>User ID:</b> <code>{}</code>".format(info['fname'], mention_html(user.id, user.first_name), + mention_html(user_chat.id, user_chat.first_name), + user_chat.id), + html=True) + """ + + +@run_async +def set_frules(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + + if not fed_id: + update.effective_message.reply_text("This group is not in any federation!") + return + + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("Only fed admins can do this!") + return + + if len(args) >= 1: + msg = update.effective_message + raw_text = msg.text + args = raw_text.split(None, 1) # use python's maxsplit to separate cmd and args + if len(args) == 2: + txt = args[1] + offset = len(txt) - len(raw_text) # set correct offset relative to command + markdown_rules = markdown_parser( + txt, entities=msg.parse_entities(), offset=offset + ) + x = sql.set_frules(fed_id, markdown_rules) + if not x: + update.effective_message.reply_text( + "Whoa! There was an error while setting federation rules! If you wondered why please ask it in @OnePunchSupport !" + ) + return + + rules = sql.get_fed_info(fed_id)["frules"] + getfed = sql.get_fed_info(fed_id) + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if eval(get_fedlog): + bot.send_message( + get_fedlog, + "*{}* has updated federation rules for fed *{}*".format( + user.first_name, getfed["fname"] + ), + parse_mode="markdown", + ) + update.effective_message.reply_text(f"Rules have been changed to :\n{rules}!") + else: + update.effective_message.reply_text("Please write rules to set this up!") + + +@run_async +def get_frules(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + if not fed_id: + update.effective_message.reply_text("This group is not in any federation!") + return + + rules = sql.get_frules(fed_id) + text = "*Rules in this fed:*\n" + text += rules + update.effective_message.reply_text(text, parse_mode=ParseMode.MARKDOWN) + + +@run_async +def fed_broadcast(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + msg = update.effective_message + user = update.effective_user + chat = update.effective_chat + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + if args: + chat = update.effective_chat + fed_id = sql.get_fed_id(chat.id) + fedinfo = sql.get_fed_info(fed_id) + if is_user_fed_owner(fed_id, user.id) is False: + update.effective_message.reply_text("Only federation owners can do this!") + return + # Parsing md + raw_text = msg.text + args = raw_text.split(None, 1) # use python's maxsplit to separate cmd and args + txt = args[1] + offset = len(txt) - len(raw_text) # set correct offset relative to command + text_parser = markdown_parser(txt, entities=msg.parse_entities(), offset=offset) + text = text_parser + try: + broadcaster = user.first_name + except: + broadcaster = user.first_name + " " + user.last_name + text += "\n\n- {}".format(mention_markdown(user.id, broadcaster)) + chat_list = sql.all_fed_chats(fed_id) + failed = 0 + for chat in chat_list: + title = "*New broadcast from Fed {}*\n".format(fedinfo["fname"]) + try: + bot.sendMessage(chat, title + text, parse_mode="markdown") + except TelegramError: + try: + dispatcher.bot.getChat(chat) + except Unauthorized: + failed += 1 + sql.chat_leave_fed(chat) + LOGGER.info( + "Chat {} has left fed {} because I was punched".format( + chat, fedinfo["fname"] + ) + ) + continue + failed += 1 + LOGGER.warning("Couldn't send broadcast to {}".format(str(chat))) + + send_text = "The federation broadcast is complete" + if failed >= 1: + send_text += "{} the group failed to receive the message, probably because it left the Federation.".format( + failed + ) + update.effective_message.reply_text(send_text) + + +@run_async +def fed_ban_list(update: Update, context: CallbackContext): + bot, args, chat_data = context.bot, context.args, context.chat_data + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + info = sql.get_fed_info(fed_id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + if is_user_fed_owner(fed_id, user.id) is False: + update.effective_message.reply_text("Only Federation owners can do this!") + return + + user = update.effective_user + chat = update.effective_chat + getfban = sql.get_all_fban_users(fed_id) + if len(getfban) == 0: + update.effective_message.reply_text( + "The federation ban list of {} is empty".format(info["fname"]), + parse_mode=ParseMode.HTML, + ) + return + + if args: + if args[0] == "json": + jam = time.time() + new_jam = jam + 1800 + cek = get_chat(chat.id, chat_data) + if cek.get("status"): + if jam <= int(cek.get("value")): + waktu = time.strftime( + "%H:%M:%S %d/%m/%Y", time.localtime(cek.get("value")) + ) + update.effective_message.reply_text( + "You can backup your data once every 30 minutes!\nYou can back up data again at `{}`".format( + waktu + ), + parse_mode=ParseMode.MARKDOWN, + ) + return + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + backups = "" + for users in getfban: + getuserinfo = sql.get_all_fban_users_target(fed_id, users) + json_parser = { + "user_id": users, + "first_name": getuserinfo["first_name"], + "last_name": getuserinfo["last_name"], + "user_name": getuserinfo["user_name"], + "reason": getuserinfo["reason"], + } + backups += json.dumps(json_parser) + backups += "\n" + with BytesIO(str.encode(backups)) as output: + output.name = "Exon_fbanned_users.json" + update.effective_message.reply_document( + document=output, + filename="Exon_fbanned_users.json", + caption="Total {} User are blocked by the Federation {}.".format( + len(getfban), info["fname"] + ), + ) + return + elif args[0] == "csv": + jam = time.time() + new_jam = jam + 1800 + cek = get_chat(chat.id, chat_data) + if cek.get("status"): + if jam <= int(cek.get("value")): + waktu = time.strftime( + "%H:%M:%S %d/%m/%Y", time.localtime(cek.get("value")) + ) + update.effective_message.reply_text( + "You can back up data once every 30 minutes!\nYou can back up data again at `{}`".format( + waktu + ), + parse_mode=ParseMode.MARKDOWN, + ) + return + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + backups = "id,firstname,lastname,username,reason\n" + for users in getfban: + getuserinfo = sql.get_all_fban_users_target(fed_id, users) + backups += ( + "{user_id},{first_name},{last_name},{user_name},{reason}".format( + user_id=users, + first_name=getuserinfo["first_name"], + last_name=getuserinfo["last_name"], + user_name=getuserinfo["user_name"], + reason=getuserinfo["reason"], + ) + ) + backups += "\n" + with BytesIO(str.encode(backups)) as output: + output.name = "saitama_fbanned_users.csv" + update.effective_message.reply_document( + document=output, + filename="saitama_fbanned_users.csv", + caption="Total {} User are blocked by Federation {}.".format( + len(getfban), info["fname"] + ), + ) + return + + text = "<b>{} users have been banned from the federation {}:</b>\n".format( + len(getfban), info["fname"] + ) + for users in getfban: + getuserinfo = sql.get_all_fban_users_target(fed_id, users) + if getuserinfo is False: + text = "There are no users banned from the federation {}".format( + info["fname"] + ) + break + user_name = getuserinfo["first_name"] + if getuserinfo["last_name"]: + user_name += " " + getuserinfo["last_name"] + text += " • {} (<code>{}</code>)\n".format( + mention_html(users, user_name), users + ) + + try: + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + except: + jam = time.time() + new_jam = jam + 1800 + cek = get_chat(chat.id, chat_data) + if cek.get("status"): + if jam <= int(cek.get("value")): + waktu = time.strftime( + "%H:%M:%S %d/%m/%Y", time.localtime(cek.get("value")) + ) + update.effective_message.reply_text( + "You can back up data once every 30 minutes!\nYou can back up data again at `{}`".format( + waktu + ), + parse_mode=ParseMode.MARKDOWN, + ) + return + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + cleanr = re.compile("<.*?>") + cleantext = re.sub(cleanr, "", text) + with BytesIO(str.encode(cleantext)) as output: + output.name = "fbanlist.txt" + update.effective_message.reply_document( + document=output, + filename="fbanlist.txt", + caption="The following is a list of users who are currently fbanned in the Federation {}.".format( + info["fname"] + ), + ) + + +@run_async +def fed_notif(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + fed_id = sql.get_fed_id(chat.id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + if args: + if args[0] in ("yes", "on"): + sql.set_feds_setting(user.id, True) + msg.reply_text( + "Reporting Federation back up! Every user who is fban / unfban you will be notified via PM." + ) + elif args[0] in ("no", "off"): + sql.set_feds_setting(user.id, False) + msg.reply_text( + "Reporting Federation has stopped! Every user who is fban / unfban you will not be notified via PM." + ) + else: + msg.reply_text("Please enter `on`/`off`", parse_mode="markdown") + else: + getreport = sql.user_feds_report(user.id) + msg.reply_text( + "Your current Federation report preferences: `{}`".format(getreport), + parse_mode="markdown", + ) + + +@run_async +def fed_chats(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + info = sql.get_fed_info(fed_id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + if is_user_fed_admin(fed_id, user.id) is False: + update.effective_message.reply_text("Only federation admins can do this!") + return + + getlist = sql.all_fed_chats(fed_id) + if len(getlist) == 0: + update.effective_message.reply_text( + "No users are fbanned from the federation {}".format(info["fname"]), + parse_mode=ParseMode.HTML, + ) + return + + text = "<b>New chat joined the federation {}:</b>\n".format(info["fname"]) + for chats in getlist: + try: + chat_name = dispatcher.bot.getChat(chats).title + except Unauthorized: + sql.chat_leave_fed(chats) + LOGGER.info( + "Chat {} has leave fed {} because I was kicked".format( + chats, info["fname"] + ) + ) + continue + text += " ? {} (<code>{}</code>)\n".format(chat_name, chats) + + try: + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + except: + cleanr = re.compile("<.*?>") + cleantext = re.sub(cleanr, "", text) + with BytesIO(str.encode(cleantext)) as output: + output.name = "fedchats.txt" + update.effective_message.reply_document( + document=output, + filename="fedchats.txt", + caption="Here is a list of all the chats that joined the federation {}.".format( + info["fname"] + ), + ) + + +@run_async +def fed_import_bans(update: Update, context: CallbackContext): + bot, chat_data = context.bot, context.chat_data + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + sql.get_fed_info(fed_id) + getfed = sql.get_fed_info(fed_id) + + if not fed_id: + update.effective_message.reply_text( + "This group is not a part of any federation!" + ) + return + + if is_user_fed_owner(fed_id, user.id) is False: + update.effective_message.reply_text("Only Federation owners can do this!") + return + + if msg.reply_to_message and msg.reply_to_message.document: + jam = time.time() + new_jam = jam + 1800 + cek = get_chat(chat.id, chat_data) + if cek.get("status"): + if jam <= int(cek.get("value")): + waktu = time.strftime( + "%H:%M:%S %d/%m/%Y", time.localtime(cek.get("value")) + ) + update.effective_message.reply_text( + "You can get your data once every 30 minutes!\nYou can get data again at `{}`".format( + waktu + ), + parse_mode=ParseMode.MARKDOWN, + ) + return + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + else: + if user.id not in DRAGONS: + put_chat(chat.id, new_jam, chat_data) + # if int(int(msg.reply_to_message.document.file_size)/1024) >= 200: + # msg.reply_text("This file is too big!") + # return + success = 0 + failed = 0 + try: + file_info = bot.get_file(msg.reply_to_message.document.file_id) + except BadRequest: + msg.reply_text( + "Try downloading and re-uploading the file, this one seems broken!" + ) + return + fileformat = msg.reply_to_message.document.file_name.split(".")[-1] + if fileformat == "json": + multi_fed_id = [] + multi_import_userid = [] + multi_import_firstname = [] + multi_import_lastname = [] + multi_import_username = [] + multi_import_reason = [] + with BytesIO() as file: + file_info.download(out=file) + file.seek(0) + reading = file.read().decode("UTF-8") + splitting = reading.split("\n") + for x in splitting: + if x == "": + continue + try: + data = json.loads(x) + except json.decoder.JSONDecodeError as err: + failed += 1 + continue + try: + import_userid = int(data["user_id"]) # Make sure it int + import_firstname = str(data["first_name"]) + import_lastname = str(data["last_name"]) + import_username = str(data["user_name"]) + import_reason = str(data["reason"]) + except ValueError: + failed += 1 + continue + # Checking user + if int(import_userid) == bot.id: + failed += 1 + continue + if is_user_fed_owner(fed_id, import_userid) is True: + failed += 1 + continue + if is_user_fed_admin(fed_id, import_userid) is True: + failed += 1 + continue + if str(import_userid) == str(OWNER_ID): + failed += 1 + continue + if int(import_userid) in DRAGONS: + failed += 1 + continue + if int(import_userid) in TIGERS: + failed += 1 + continue + if int(import_userid) in WOLVES: + failed += 1 + continue + multi_fed_id.append(fed_id) + multi_import_userid.append(str(import_userid)) + multi_import_firstname.append(import_firstname) + multi_import_lastname.append(import_lastname) + multi_import_username.append(import_username) + multi_import_reason.append(import_reason) + success += 1 + sql.multi_fban_user( + multi_fed_id, + multi_import_userid, + multi_import_firstname, + multi_import_lastname, + multi_import_username, + multi_import_reason, + ) + text = "Blocks were successfully imported. {} people are blocked.".format( + success + ) + if failed >= 1: + text += " {} Failed to import.".format(failed) + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if eval(get_fedlog): + teks = "Fed *{}* has successfully imported data. {} banned.".format( + getfed["fname"], success + ) + if failed >= 1: + teks += " {} Failed to import.".format(failed) + bot.send_message(get_fedlog, teks, parse_mode="markdown") + elif fileformat == "csv": + multi_fed_id = [] + multi_import_userid = [] + multi_import_firstname = [] + multi_import_lastname = [] + multi_import_username = [] + multi_import_reason = [] + file_info.download( + "fban_{}.csv".format(msg.reply_to_message.document.file_id) + ) + with open( + "fban_{}.csv".format(msg.reply_to_message.document.file_id), + "r", + encoding="utf8", + ) as csvFile: + reader = csv.reader(csvFile) + for data in reader: + try: + import_userid = int(data[0]) # Make sure it int + import_firstname = str(data[1]) + import_lastname = str(data[2]) + import_username = str(data[3]) + import_reason = str(data[4]) + except ValueError: + failed += 1 + continue + # Checking user + if int(import_userid) == bot.id: + failed += 1 + continue + if is_user_fed_owner(fed_id, import_userid) is True: + failed += 1 + continue + if is_user_fed_admin(fed_id, import_userid) is True: + failed += 1 + continue + if str(import_userid) == str(OWNER_ID): + failed += 1 + continue + if int(import_userid) in DRAGONS: + failed += 1 + continue + if int(import_userid) in TIGERS: + failed += 1 + continue + if int(import_userid) in WOLVES: + failed += 1 + continue + multi_fed_id.append(fed_id) + multi_import_userid.append(str(import_userid)) + multi_import_firstname.append(import_firstname) + multi_import_lastname.append(import_lastname) + multi_import_username.append(import_username) + multi_import_reason.append(import_reason) + success += 1 + # t = ThreadWithReturnValue(target=sql.fban_user, args=(fed_id, str(import_userid), import_firstname, import_lastname, import_username, import_reason,)) + # t.start() + sql.multi_fban_user( + multi_fed_id, + multi_import_userid, + multi_import_firstname, + multi_import_lastname, + multi_import_username, + multi_import_reason, + ) + csvFile.close() + os.remove("fban_{}.csv".format(msg.reply_to_message.document.file_id)) + text = "Files were imported successfully. {} people banned.".format(success) + if failed >= 1: + text += " {} Failed to import.".format(failed) + get_fedlog = sql.get_fed_log(fed_id) + if get_fedlog: + if eval(get_fedlog): + teks = "Fed *{}* has successfully imported data. {} banned.".format( + getfed["fname"], success + ) + if failed >= 1: + teks += " {} Failed to import.".format(failed) + bot.send_message(get_fedlog, teks, parse_mode="markdown") + else: + send_message(update.effective_message, "This file is not supported.") + return + send_message(update.effective_message, text) + + +@run_async +def del_fed_button(update: Update, context: CallbackContext): + query = update.callback_query + query.message.chat.id + fed_id = query.data.split("_")[1] + + if fed_id == "cancel": + query.message.edit_text("Federation deletion cancelled") + return + + getfed = sql.get_fed_info(fed_id) + if getfed: + delete = sql.del_fed(fed_id) + if delete: + query.message.edit_text( + "You have removed your Federation! Now all the Groups that are connected with `{}` do not have a Federation.".format( + getfed["fname"] + ), + parse_mode="markdown", + ) + + +@run_async +def fed_stat_user(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + update.effective_chat + update.effective_user + msg = update.effective_message + + if args: + if args[0].isdigit(): + user_id = args[0] + else: + user_id = extract_user(msg, args) + else: + user_id = extract_user(msg, args) + + if user_id: + if len(args) == 2 and args[0].isdigit(): + fed_id = args[1] + user_name, reason, fbantime = sql.get_user_fban(fed_id, str(user_id)) + if fbantime: + fbantime = time.strftime("%d/%m/%Y", time.localtime(fbantime)) + else: + fbantime = "Unavaiable" + if user_name is False: + send_message( + update.effective_message, + "Fed {} not found!".format(fed_id), + parse_mode="markdown", + ) + return + if user_name == "" or user_name is None: + user_name = "He/she" + if not reason: + send_message( + update.effective_message, + "{} is not banned in this federation!".format(user_name), + ) + else: + teks = "{} banned in this federation because:\n`{}`\n*Banned at:* `{}`".format( + user_name, reason, fbantime + ) + send_message(update.effective_message, teks, parse_mode="markdown") + return + user_name, fbanlist = sql.get_user_fbanlist(str(user_id)) + if user_name == "": + try: + user_name = bot.get_chat(user_id).first_name + except BadRequest: + user_name = "He/she" + if user_name == "" or user_name is None: + user_name = "He/she" + if len(fbanlist) == 0: + send_message( + update.effective_message, + "{} is not banned in any federation!".format(user_name), + ) + return + else: + teks = "{} has been banned in this federation:\n".format(user_name) + for x in fbanlist: + teks += "- `{}`: {}\n".format(x[0], x[1][:20]) + teks += "\nIf you want to find out more about the reasons for Fedban specifically, use /fbanstat <FedID>" + send_message(update.effective_message, teks, parse_mode="markdown") + + elif not msg.reply_to_message and not args: + user_id = msg.from_user.id + user_name, fbanlist = sql.get_user_fbanlist(user_id) + if user_name == "": + user_name = msg.from_user.first_name + if len(fbanlist) == 0: + send_message( + update.effective_message, + "{} is not banned in any federation!".format(user_name), + ) + else: + teks = "{} has been banned in this federation:\n".format(user_name) + for x in fbanlist: + teks += "- `{}`: {}\n".format(x[0], x[1][:20]) + teks += "\nIf you want to find out more about the reasons for Fedban specifically, use /fbanstat <FedID>" + send_message(update.effective_message, teks, parse_mode="markdown") + + else: + fed_id = args[0] + fedinfo = sql.get_fed_info(fed_id) + if not fedinfo: + send_message(update.effective_message, "Fed {} not found!".format(fed_id)) + return + name, reason, fbantime = sql.get_user_fban(fed_id, msg.from_user.id) + if fbantime: + fbantime = time.strftime("%d/%m/%Y", time.localtime(fbantime)) + else: + fbantime = "Unavaiable" + if not name: + name = msg.from_user.first_name + if not reason: + send_message( + update.effective_message, + "{} is not banned in this federation".format(name), + ) + return + send_message( + update.effective_message, + "{} banned in this federation because:\n`{}`\n*Banned at:* `{}`".format( + name, reason, fbantime + ), + parse_mode="markdown", + ) + + +@run_async +def set_fed_log(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + user = update.effective_user + update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + if args: + fedinfo = sql.get_fed_info(args[0]) + if not fedinfo: + send_message(update.effective_message, "This Federation does not exist!") + return + isowner = is_user_fed_owner(args[0], user.id) + if not isowner: + send_message( + update.effective_message, + "Only federation creator can set federation logs.", + ) + return + setlog = sql.set_fed_log(args[0], chat.id) + if setlog: + send_message( + update.effective_message, + "Federation log `{}` has been set to {}".format( + fedinfo["fname"], chat.title + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, "You have not provided your federated ID!" + ) + + +@run_async +def unset_fed_log(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + user = update.effective_user + update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + if args: + fedinfo = sql.get_fed_info(args[0]) + if not fedinfo: + send_message(update.effective_message, "This Federation does not exist!") + return + isowner = is_user_fed_owner(args[0], user.id) + if not isowner: + send_message( + update.effective_message, + "Only federation creator can set federation logs.", + ) + return + setlog = sql.set_fed_log(args[0], None) + if setlog: + send_message( + update.effective_message, + "Federation log `{}` has been revoked on {}".format( + fedinfo["fname"], chat.title + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, "You have not provided your federated ID!" + ) + + +@run_async +def subs_feds(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + fedinfo = sql.get_fed_info(fed_id) + + if not fed_id: + send_message(update.effective_message, "This group is not in any federation!") + return + + if is_user_fed_owner(fed_id, user.id) is False: + send_message(update.effective_message, "Only fed owner can do this!") + return + + if args: + getfed = sql.search_fed_by_id(args[0]) + if getfed is False: + send_message( + update.effective_message, "Please enter a valid federation id." + ) + return + subfed = sql.subs_fed(args[0], fed_id) + if subfed: + send_message( + update.effective_message, + "Federation `{}` has subscribe the federation `{}`. Every time there is a Fedban from that federation, this federation will also banned that user.".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + get_fedlog = sql.get_fed_log(args[0]) + if get_fedlog: + if int(get_fedlog) != int(chat.id): + bot.send_message( + get_fedlog, + "Federation `{}` has subscribe the federation `{}`".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, + "Federation `{}` already subscribe the federation `{}`.".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, "You have not provided your federated ID!" + ) + + +@run_async +def unsubs_feds(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + fedinfo = sql.get_fed_info(fed_id) + + if not fed_id: + send_message(update.effective_message, "This group is not in any federation!") + return + + if is_user_fed_owner(fed_id, user.id) is False: + send_message(update.effective_message, "Only fed owner can do this!") + return + + if args: + getfed = sql.search_fed_by_id(args[0]) + if getfed is False: + send_message( + update.effective_message, "Please enter a valid federation id." + ) + return + subfed = sql.unsubs_fed(args[0], fed_id) + if subfed: + send_message( + update.effective_message, + "Federation `{}` now unsubscribe fed `{}`.".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + get_fedlog = sql.get_fed_log(args[0]) + if get_fedlog: + if int(get_fedlog) != int(chat.id): + bot.send_message( + get_fedlog, + "Federation `{}` has unsubscribe fed `{}`.".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, + "Federation `{}` is not subscribing `{}`.".format( + fedinfo["fname"], getfed["fname"] + ), + parse_mode="markdown", + ) + else: + send_message( + update.effective_message, "You have not provided your federated ID!" + ) + + +@run_async +def get_myfedsubs(update: Update, context: CallbackContext): + context.args + chat = update.effective_chat + user = update.effective_user + update.effective_message + + if chat.type == "private": + send_message( + update.effective_message, + "This command is specific to the group, not to our pm!", + ) + return + + fed_id = sql.get_fed_id(chat.id) + fedinfo = sql.get_fed_info(fed_id) + + if not fed_id: + send_message(update.effective_message, "This group is not in any federation!") + return + + if is_user_fed_owner(fed_id, user.id) is False: + send_message(update.effective_message, "Only fed owner can do this!") + return + + try: + getmy = sql.get_mysubs(fed_id) + except: + getmy = [] + + if len(getmy) == 0: + send_message( + update.effective_message, + "Federation `{}` is not subscribing any federation.".format( + fedinfo["fname"] + ), + parse_mode="markdown", + ) + return + else: + listfed = "Federation `{}` is subscribing federation:\n".format( + fedinfo["fname"] + ) + for x in getmy: + listfed += "- `{}`\n".format(x) + listfed += ( + "\nTo get fed info `/fedinfo <fedid>`. To unsubscribe `/unsubfed <fedid>`." + ) + send_message(update.effective_message, listfed, parse_mode="markdown") + + +@run_async +def get_myfeds_list(update: Update, context: CallbackContext): + update.effective_chat + user = update.effective_user + update.effective_message + + fedowner = sql.get_user_owner_fed_full(user.id) + if fedowner: + text = "*You are owner of feds:\n*" + for f in fedowner: + text += "- `{}`: *{}*\n".format(f["fed_id"], f["fed"]["fname"]) + else: + text = "*You are not have any feds!*" + send_message(update.effective_message, text, parse_mode="markdown") + + +def is_user_fed_admin(fed_id, user_id): + fed_admins = sql.all_fed_users(fed_id) + if fed_admins is False: + return False + if int(user_id) in fed_admins or int(user_id) == OWNER_ID: + return True + else: + return False + + +def is_user_fed_owner(fed_id, user_id): + getsql = sql.get_fed_info(fed_id) + if getsql is False: + return False + getfedowner = eval(getsql["fusers"]) + if getfedowner is None or getfedowner is False: + return False + getfedowner = getfedowner["owner"] + if str(user_id) == getfedowner or int(user_id) == OWNER_ID: + return True + else: + return False + + +# There's no handler for this yet, but updating for v12 in case its used +@run_async +def welcome_fed(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + fed_id = sql.get_fed_id(chat.id) + fban, fbanreason, fbantime = sql.get_fban_user(fed_id, user.id) + if fban: + update.effective_message.reply_text( + "This user is banned in current federation! I will remove him." + ) + bot.kick_chat_member(chat.id, user.id) + return True + else: + return False + + +def __stats__(): + all_fbanned = sql.get_all_fban_users_global() + all_feds = sql.get_all_feds_users_global() + return "•➥ {} banned users across {} Federations".format( + len(all_fbanned), len(all_feds) + ) + + +def __user_info__(user_id, chat_id): + fed_id = sql.get_fed_id(chat_id) + if fed_id: + fban, fbanreason, fbantime = sql.get_fban_user(fed_id, user_id) + info = sql.get_fed_info(fed_id) + infoname = info["fname"] + + if int(info["owner"]) == user_id: + text = "Federation owner of: <b>{}</b>.".format(infoname) + elif is_user_fed_admin(fed_id, user_id): + text = "Federation admin of: <b>{}</b>.".format(infoname) + + elif fban: + text = "Federation banned: <b>Yes</b>" + text += "\n<b>Reason:</b> {}".format(fbanreason) + else: + text = "Federation banned: <b>No</b>" + else: + text = "" + return text + + +# Temporary data +def put_chat(chat_id, value, chat_data): + # print(chat_data) + if value is False: + status = False + else: + status = True + chat_data[chat_id] = {"federation": {"status": status, "value": value}} + + +def get_chat(chat_id, chat_data): + # print(chat_data) + try: + value = chat_data[chat_id]["federation"] + return value + except KeyError: + return {"status": False, "value": False} + + +@run_async +def fed_owner_help(update: Update, context: CallbackContext): + update.effective_message.reply_text( + """*🎖 Fed Owner Only:* + + • `/newfed <fed_name>`*:* Creates a Federation, One allowed per user + • `/renamefed <fed_id> <new_fed_name>`*:* Renames the fed id to a new name + • `/delfed <fed_id>`*:* Delete a Federation, and any information related to it. Will not cancel blocked users + • `/fpromote <user>`*:* Assigns the user as a federation admin. Enables all commands for the user under `Fed Admins` + • `/fdemote <user>`*:* Drops the User from the admin Federation to a normal User + • `/subfed <fed_id>`*:* Subscribes to a given fed ID, bans from that subscribed fed will also happen in your fed + • `/unsubfed <fed_id>`*:* Unsubscribes to a given fed ID + • `/setfedlog <fed_id>`*:* Sets the group as a fed log report base for the federation + • `/unsetfedlog <fed_id>`*:* Removed the group as a fed log report base for the federation + • `/fbroadcast <message>`*:* Broadcasts a messages to all groups that have joined your fed + • `/fedsubs`*:* Shows the feds your group is subscribed to `(broken rn)`""", + parse_mode=ParseMode.MARKDOWN, + ) + + +@run_async +def fed_admin_help(update: Update, context: CallbackContext): + update.effective_message.reply_text( + """*🚨 Fed Admins:* + + • `/fban <user> <reason>`*:* Fed bans a user + • `/unfban <user> <reason>`*:* Removes a user from a fed ban + • `/fedinfo <fed_id>`*:* Information about the specified Federation + • `/joinfed <fed_id>`*:* Join the current chat to the Federation. Only chat owners can do this. Every chat can only be in one Federation + • `/leavefed <fed_id>`*:* Leave the Federation given. Only chat owners can do this + • `/setfrules <rules>`*:* Arrange Federation rules + • `/fedadmins`*:* Show Federation admin + • `/fbanlist`*:* Displays all users who are victimized at the Federation at this time + • `/fedchats`*:* Get all the chats that are connected in the Federation + • `/chatfed `*:* See the Federation in the current chat\n""", + parse_mode=ParseMode.MARKDOWN, + ) + + +@run_async +def fed_user_help(update: Update, context: CallbackContext): + update.effective_message.reply_text( + """*🎩 ᴀɴʏ ᴜsᴇʀ:* + + • `/fbanstat`*:* Shows if you/or the user you are replying to or their username is fbanned somewhere or not + • `/fednotif <on/off>`*:* Federation settings not in PM when there are users who are fbaned/unfbanned + • `/frules`*:* See Federation regulations\n""", + parse_mode=ParseMode.MARKDOWN, + ) + + +__mod_name__ = "𝙵ᴇᴅs" + +__help__ = """ +*ғᴇᴅᴇʀᴀᴛɪᴏɴ* +`ᴇᴠᴇʀʏᴛʜɪɴɢ ɪs ғᴜɴ, ᴜɴᴛɪʟ ᴀ sᴘᴀᴍᴍᴇʀ sᴛᴀʀᴛs ᴇɴᴛᴇʀɪɴɢ ʏᴏᴜʀ ɢʀᴏᴜᴘ, ᴀɴᴅ ʏᴏᴜ ʜᴀᴠᴇ ᴛᴏ ʙʟᴏᴄᴋ ɪᴛ. ᴛʜᴇɴ ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ sᴛᴀʀᴛ ʙᴀɴɴɪɴɢ ᴍᴏʀᴇ, ᴀɴᴅ ᴍᴏʀᴇ, ᴀɴᴅ ɪᴛ ʜᴜʀᴛs.` +`ʙᴜᴛ ᴛʜᴇɴ ʏᴏᴜ ʜᴀᴠᴇ ᴍᴀɴʏ ɢʀᴏᴜᴘs, ᴀɴᴅ ʏᴏᴜ ᴅᴏɴ'ᴛ ᴡᴀɴᴛ ᴛʜɪs sᴘᴀᴍᴍᴇʀ ᴛᴏ ʙᴇ ɪɴ ᴏɴᴇ ᴏғ ʏᴏᴜʀ ɢʀᴏᴜᴘs - ʜᴏᴡ ᴄᴀɴ ʏᴏᴜ ᴅᴇᴀʟ? ᴅᴏ ʏᴏᴜ ʜᴀᴠᴇ ᴛᴏ ᴍᴀɴᴜᴀʟʟʏ ʙʟᴏᴄᴋ ɪᴛ, in ᴀʟʟ ʏᴏᴜʀ groups?`\n + +*ɴᴏ ʟᴏɴɢᴇʀ!* `ᴡɪᴛʜ ғᴇᴅᴇʀᴀᴛɪᴏɴ, ʏᴏᴜ ᴄᴀɴ ᴍᴀᴋᴇ ᴀ ʙᴀɴ ɪɴ ᴏɴᴇ ᴄʜᴀᴛ ᴏᴠᴇʀʟᴀᴘ ᴡɪᴛʜ ᴀʟʟ ᴏᴛʜᴇʀ ᴄʜᴀᴛs.`\n +`ʏᴏᴜ ᴄᴀɴ ᴇᴠᴇɴ ᴅᴇsɪɢɴᴀᴛᴇ ғᴇᴅᴇʀᴀᴛɪᴏɴ ᴀᴅᴍɪɴs, sᴏ ʏᴏᴜʀ ᴛʀᴜsᴛᴇᴅ ᴀᴅᴍɪɴ ᴄᴀɴ ʙᴀɴ ᴀʟʟ ᴛʜᴇ sᴘᴀᴍᴍᴇʀs ғʀᴏᴍ ᴄʜᴀᴛs ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴘʀᴏᴛᴇᴄᴛ`.\n + +*ᴄᴏᴍᴍᴀɴᴅs:*\n +`ғᴇᴅs ᴀʀᴇ ɴᴏᴡ ᴅɪᴠɪᴅᴇᴅ ɪɴᴛᴏ 3 sᴇᴄᴛɪᴏɴs ғᴏʀ ʏᴏᴜʀ ᴇᴀsᴇ.` + +•➥ /fedownerhelp *:* `ᴘʀᴏᴠɪᴅᴇs ʜᴇʟᴘ for fed ᴄʀᴇᴀᴛɪᴏɴ ᴀɴᴅ ᴏᴡɴᴇʀ ᴏɴʟʏ ᴄᴏᴍᴍᴀɴᴅs` + +•➥ /fedadminhelp *:* `ᴘʀᴏᴠɪᴅᴇs ʜᴇʟᴘ for fed ᴀᴅᴍɪɴɪsᴛʀᴀᴛɪᴏɴ ᴄᴏᴍᴍᴀɴᴅs` + +•➥ /feduserhelp *:* `ᴘʀᴏᴠɪᴅᴇs ʜᴇʟᴘ ғᴏʀ ᴄᴏᴍᴍᴀɴᴅs ᴀɴʏᴏɴᴇ ᴄᴀɴ ᴜsᴇ` + +""" + +NEW_FED_HANDLER = CommandHandler("newfed", new_fed) +DEL_FED_HANDLER = CommandHandler("delfed", del_fed) +RENAME_FED = CommandHandler("renamefed", rename_fed) +JOIN_FED_HANDLER = CommandHandler("joinfed", join_fed) +LEAVE_FED_HANDLER = CommandHandler("leavefed", leave_fed) +PROMOTE_FED_HANDLER = CommandHandler("fpromote", user_join_fed) +DEMOTE_FED_HANDLER = CommandHandler("fdemote", user_demote_fed) +INFO_FED_HANDLER = CommandHandler("fedinfo", fed_info) +BAN_FED_HANDLER = DisableAbleCommandHandler("fban", fed_ban) +UN_BAN_FED_HANDLER = CommandHandler("unfban", unfban) +FED_BROADCAST_HANDLER = CommandHandler("fbroadcast", fed_broadcast) +FED_SET_RULES_HANDLER = CommandHandler("setfrules", set_frules) +FED_GET_RULES_HANDLER = CommandHandler("frules", get_frules) +FED_CHAT_HANDLER = CommandHandler("chatfed", fed_chat) +FED_ADMIN_HANDLER = CommandHandler("fedadmins", fed_admin) +FED_USERBAN_HANDLER = CommandHandler("fbanlist", fed_ban_list) +FED_NOTIF_HANDLER = CommandHandler("fednotif", fed_notif) +FED_CHATLIST_HANDLER = CommandHandler("fedchats", fed_chats) +FED_IMPORTBAN_HANDLER = CommandHandler("importfbans", fed_import_bans) +FEDSTAT_USER = DisableAbleCommandHandler(["fedstat", "fbanstat"], fed_stat_user) +SET_FED_LOG = CommandHandler("setfedlog", set_fed_log) +UNSET_FED_LOG = CommandHandler("unsetfedlog", unset_fed_log) +SUBS_FED = CommandHandler("subfed", subs_feds) +UNSUBS_FED = CommandHandler("unsubfed", unsubs_feds) +MY_SUB_FED = CommandHandler("fedsubs", get_myfedsubs) +MY_FEDS_LIST = CommandHandler("myfeds", get_myfeds_list) +DELETEBTN_FED_HANDLER = CallbackQueryHandler(del_fed_button, pattern=r"rmfed_") +FED_OWNER_HELP_HANDLER = CommandHandler("fedownerhelp", fed_owner_help) +FED_ADMIN_HELP_HANDLER = CommandHandler("fedadminhelp", fed_admin_help) +FED_USER_HELP_HANDLER = CommandHandler("feduserhelp", fed_user_help) + +dispatcher.add_handler(NEW_FED_HANDLER) +dispatcher.add_handler(DEL_FED_HANDLER) +dispatcher.add_handler(RENAME_FED) +dispatcher.add_handler(JOIN_FED_HANDLER) +dispatcher.add_handler(LEAVE_FED_HANDLER) +dispatcher.add_handler(PROMOTE_FED_HANDLER) +dispatcher.add_handler(DEMOTE_FED_HANDLER) +dispatcher.add_handler(INFO_FED_HANDLER) +dispatcher.add_handler(BAN_FED_HANDLER) +dispatcher.add_handler(UN_BAN_FED_HANDLER) +dispatcher.add_handler(FED_BROADCAST_HANDLER) +dispatcher.add_handler(FED_SET_RULES_HANDLER) +dispatcher.add_handler(FED_GET_RULES_HANDLER) +dispatcher.add_handler(FED_CHAT_HANDLER) +dispatcher.add_handler(FED_ADMIN_HANDLER) +dispatcher.add_handler(FED_USERBAN_HANDLER) +dispatcher.add_handler(FED_NOTIF_HANDLER) +dispatcher.add_handler(FED_CHATLIST_HANDLER) +# dispatcher.add_handler(FED_IMPORTBAN_HANDLER) +dispatcher.add_handler(FEDSTAT_USER) +dispatcher.add_handler(SET_FED_LOG) +dispatcher.add_handler(UNSET_FED_LOG) +dispatcher.add_handler(SUBS_FED) +dispatcher.add_handler(UNSUBS_FED) +dispatcher.add_handler(MY_SUB_FED) +dispatcher.add_handler(MY_FEDS_LIST) +dispatcher.add_handler(DELETEBTN_FED_HANDLER) +dispatcher.add_handler(FED_OWNER_HELP_HANDLER) +dispatcher.add_handler(FED_ADMIN_HELP_HANDLER) +dispatcher.add_handler(FED_USER_HELP_HANDLER) diff --git a/Exon/modules/forcesubs.py b/Exon/modules/forcesubs.py new file mode 100644 index 00000000..b71eb5f8 --- /dev/null +++ b/Exon/modules/forcesubs.py @@ -0,0 +1,225 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 logging +import time + +from pyrogram import filters +from pyrogram.errors.exceptions.bad_request_400 import ( + ChatAdminRequired, + PeerIdInvalid, + UsernameNotOccupied, + UserNotParticipant, +) +from pyrogram.types import ChatPermissions, InlineKeyboardButton, InlineKeyboardMarkup + +from Exon import BOT_USERNAME as asau +from Exon import DRAGONS as SUDO_USERS +from Exon import pgram as pbot +from Exon.modules.sql import forceSubscribe_sql as sql + +logging.basicConfig(level=logging.INFO) + +static_data_filter = filters.create( + lambda _, __, query: query.data == "onUnMuteRequest" +) + + +@pbot.on_callback_query(static_data_filter) +def _onUnMuteRequest(client, cb): + user_id = cb.from_user.id + chat_id = cb.message.chat.id + if chat_db := sql.fs_settings(chat_id): + channel = chat_db.channel + chat_member = client.get_chat_member(chat_id, user_id) + if chat_member.restricted_by: + if chat_member.restricted_by.id == (client.get_me()).id: + try: + client.get_chat_member(channel, user_id) + client.unban_chat_member(chat_id, user_id) + cb.message.delete() + # if cb.message.reply_to_message.from_user.id == user_id: + # cb.message.delete() + except UserNotParticipant: + client.answer_callback_query( + cb.id, + text=f"❗ ᴊᴏɪɴ ᴏᴜʀ @{channel} ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ᴘʀᴇss 'ᴜɴᴍᴜᴛᴇ ᴍᴇ ʙᴜᴛᴛᴏɴ.", + show_alert=True, + ) + else: + client.answer_callback_query( + cb.id, + text="❗ ʏᴏᴜ ʜᴀᴠᴇ ʙᴇᴇɴ ᴍᴜᴛᴇᴅ ʙʏ ᴀᴅᴍɪɴs ᴅᴜᴇ ᴛᴏ sᴏᴍᴇ ᴏᴛʜᴇʀ ʀᴇᴀsᴏɴ.", + show_alert=True, + ) + elif ( + client.get_chat_member(chat_id, (client.get_me()).id).status + == "administrator" + ): + client.answer_callback_query( + cb.id, + text="❗ ᴡᴀʀɴɪɴɢ! ᴅᴏɴ'ᴛ ᴘʀᴇss ᴛʜᴇ ʙᴜᴛᴛᴏɴ ᴡʜᴇɴ ʏᴏᴜ ᴄᴀɴ ᴛᴀʟᴋ.", + show_alert=True, + ) + + else: + client.send_message( + chat_id, + f"❗ **{cb.from_user.mention} ɪs ᴛʀʏɪɴɢ ᴛᴏ ᴜɴᴍᴜᴛᴇ ʜɪᴍ/ʜᴇʀ-sᴇʟғ ʙᴜᴛ i ᴄᴀɴ'ᴛ ᴜɴᴍᴜᴛᴇ ʜɪᴍ/her ʙᴇᴄᴀᴜsᴇ ɪ ᴀᴍ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜɪs ᴄʜᴀᴛ ᴀᴅᴅ ᴍᴇ ᴀs ᴀᴅᴍɪɴ ᴀɢᴀɪɴ.\n", + ) + + +@pbot.on_message(filters.text & ~filters.private, group=1) +def _check_member(client, message): + chat_id = message.chat.id + if chat_db := sql.fs_settings(chat_id): + user_id = message.from_user.id + if ( + client.get_chat_member(chat_id, user_id).status + not in ("administrator", "creator") + and user_id not in SUDO_USERS + ): + channel = chat_db.channel + try: + client.get_chat_member(channel, user_id) + except UserNotParticipant: + try: + sent_message = message.reply_text( + f"ᴡᴇʟᴄᴏᴍᴇ {message.from_user.mention} 🙏 \n **ʏᴏᴜ ʜᴀᴠᴇɴ'ᴛ ᴊᴏɪɴᴇᴅ ᴏᴜʀ @{channel} ᴄʜᴀɴɴᴇʟ ʏᴇᴛ**👷 \n \nᴘʟᴇᴀsᴇ ᴊᴏɪɴ [our channel](https://t.me/{channel}) ᴀɴᴅ ʜɪᴛ ᴛʜᴇ **ᴜɴᴍᴜᴛᴇ ᴍᴇ** ʙᴜᴛᴛᴏɴ. \n \n ", + disable_web_page_preview=True, + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "ᴊᴏɪɴ ᴄʜᴀɴɴᴇʟ", + url=f"https://t.me/{channel}", + ) + ], + [ + InlineKeyboardButton( + "ᴜɴᴍᴜᴛᴇ ᴍᴇ", + callback_data="onUnMuteRequest", + ) + ], + ] + ), + ) + + client.restrict_chat_member( + chat_id, user_id, ChatPermissions(can_send_messages=False) + ) + except ChatAdminRequired: + sent_message.edit( + "😕 **ɪ ᴀᴍ ɴᴏᴛ ᴀᴅᴍɪɴ ʜᴇʀᴇ..**\n__ɢɪᴠᴇ ᴍᴇ ʙᴀɴ ᴘᴇʀᴍɪssɪᴏɴs ᴀɴᴅ ʀᴇᴛʀʏ.. \n#ᴇɴᴅɪɴɢ ғsᴜʙ...." + ) + + except ChatAdminRequired: + client.send_message( + chat_id, + text=f"😕 **I ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ᴏғ @{channel} ᴄʜᴀɴɴᴇʟ.**\n__ɢɪᴠᴇ me ᴀᴅᴍɪɴ ᴏғ ᴛʜᴀᴛ ᴄʜᴀɴɴᴇʟ ᴀɴᴅ ʀᴇᴛʀʏ.\n#ᴇɴᴅɪɴɢ ғsᴜʙ....", + ) + + +@pbot.on_message(filters.command(["forcesubscribe", "fsub"]) & ~filters.private) +def config(client, message): + user = client.get_chat_member(message.chat.id, message.from_user.id) + if user.status == "creator" or user.user.id in SUDO_USERS: + chat_id = message.chat.id + if len(message.command) > 1: + input_str = message.command[1] + input_str = input_str.replace("@", "") + if input_str.lower() in ("off", "no", "disable"): + sql.disapprove(chat_id) + message.reply_text("❌ **ғᴏʀᴄᴇ sᴜʙsᴄʀɪʙᴇ ɪs ᴅɪsᴀʙʟᴇᴅ sᴜᴄᴄᴇssғᴜʟʟʏ.**") + elif input_str.lower() in ("clear"): + sent_message = message.reply_text( + "**ᴜɴᴍᴜᴛɪɴɢ ᴀʟʟ ᴍᴇᴍʙᴇʀs ᴡʜᴏ ᴀʀᴇ ᴍᴜᴛᴇᴅ ʙʏ ᴍᴇ ...**" + ) + try: + for chat_member in client.get_chat_members( + message.chat.id, filter="restricted" + ): + if chat_member.restricted_by.id == (client.get_me()).id: + client.unban_chat_member(chat_id, chat_member.user.id) + time.sleep(1) + sent_message.edit("✅ **ᴜɴᴍᴜᴛᴇᴅ ᴀʟʟ ᴍᴇᴍʙᴇʀs ᴡʜᴏ ᴀʀᴇ ᴍᴜᴛᴇᴅ ʙʏ ᴍᴇ.**") + except ChatAdminRequired: + sent_message.edit( + "😕 **I ᴀᴍ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜɪs ᴄʜᴀᴛ.**\n__I ᴄᴀɴ'ᴛ ᴜɴᴍᴜᴛᴇ ᴍᴇᴍʙᴇʀs ʙᴇᴄᴀᴜsᴇ i ᴀᴍ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜɪs ᴄʜᴀᴛ ᴍᴀᴋᴇ ᴍᴇ ᴀᴅᴍɪɴ ᴡɪᴛʜ ʙᴀɴ ᴜsᴇʀ ᴘᴇʀᴍɪssɪᴏɴ.__" + ) + else: + try: + client.get_chat_member(input_str, "me") + sql.add_channel(chat_id, input_str) + message.reply_text( + f"✅ **ғᴏʀᴄᴇ sᴜʙsᴄʀɪʙᴇ ɪs ᴇɴᴀʙʟᴇᴅ**\n__ғᴏʀᴄᴇ sᴜʙsᴄʀɪʙᴇ ɪs ᴇɴᴀʙʟᴇᴅ, ᴀʟʟ ᴛʜᴇ ɢʀᴏᴜᴘ ᴍᴇᴍʙᴇʀs ʜᴀᴠᴇ ᴛᴏ sᴜʙsᴄʀɪʙᴇ ᴛʜɪs [ᴄʜᴀɴɴᴇʟ](https://t.me/{input_str}) ɪɴ ᴏʀᴅᴇʀ ᴛᴏ sᴇɴᴅ ᴍᴇssᴀɢᴇs ɪɴ ᴛʜɪs group.", + disable_web_page_preview=True, + ) + except UserNotParticipant: + message.reply_text( + f"😕 **ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ**\n__I ᴀᴍ ɴᴏᴛ ᴀɴ ᴀᴅᴍɪɴ ɪɴ ᴛʜᴇ [ᴄʜᴀɴɴᴇʟ](https://t.me/{input_str}). ᴀᴅᴅ ᴍᴇ ᴀs ᴀ ᴀᴅᴍɪɴ ɪɴ ᴏʀᴅᴇʀ ᴛᴏ ᴇɴᴀʙʟᴇ ғᴏʀᴄᴇsᴜʙsᴄʀɪʙᴇ.", + disable_web_page_preview=True, + ) + except (UsernameNotOccupied, PeerIdInvalid): + message.reply_text("❗ **ɪɴᴠᴀʟɪᴅ ᴄʜᴀɴɴᴇʟ ᴜsᴇʀɴᴀᴍᴇ.**") + except Exception as err: + message.reply_text(f"❗ **ᴇʀʀᴏʀ:** ```{err}```") + elif sql.fs_settings(chat_id): + message.reply_text( + f"✅ **ғᴏʀᴄᴇ sᴜʙsᴄʀɪʙᴇ ɪs ᴇɴᴀʙʟᴇᴅ ɪɴ ᴛʜɪs ᴄʜᴀᴛ.**\n__ғᴏʀ ᴛʜɪs [ᴄʜᴀɴɴᴇʟ](https://t.me/{sql.fs_settings(chat_id).channel})__", + disable_web_page_preview=True, + ) + else: + message.reply_text("❌ **ғᴏʀᴄᴇ sᴜʙsᴄʀɪʙᴇ ɪs ᴅɪsᴀʙʟᴇᴅ ɪɴ ᴛʜɪs ᴄʜᴀᴛ.**") + else: + message.reply_text( + "❗ **ɢʀᴏᴜᴘ ᴄʀᴇᴀᴛᴏʀ ʀᴇǫᴜɪʀᴇᴅ**\n__ʏᴏᴜ ʜᴀᴠᴇ ᴛᴏ ʙᴇ ᴛʜᴇ ɢʀᴏᴜᴘ ᴄʀᴇᴀᴛᴏʀ ᴛᴏ ᴅᴏ ᴛʜᴀᴛ.__" + ) + + +__help__ = f""" +*ғᴏʀᴄᴇ ꜱᴜʙꜱᴄʀɪʙᴇ:* + +❂ *Aʙɢ ᴄᴀɴ ᴍᴜᴛᴇ ᴍᴇᴍʙᴇʀꜱ ᴡʜᴏ ᴀʀᴇ ɴᴏᴛ ꜱᴜʙꜱᴄʀɪʙᴇᴅ ʏᴏᴜʀ ᴄʜᴀɴɴᴇʟ ᴜɴᴛɪʟ ᴛʜᴇʏ ꜱᴜʙꜱᴄʀɪʙᴇ* + +❂ `ᴡʜᴇɴ ᴇɴᴀʙʟᴇᴅ ɪ ᴡɪʟʟ ᴍᴜᴛᴇ ᴜɴꜱᴜʙꜱᴄʀɪʙᴇᴅ ᴍᴇᴍʙᴇʀꜱ ᴀɴᴅ ꜱʜᴏᴡ ᴛʜᴇᴍ ᴀ ᴜɴᴍᴜᴛᴇ ʙᴜᴛᴛᴏɴ. ᴡʜᴇɴ ᴛʜᴇʏ ᴘʀᴇꜱꜱᴇᴅ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ɪ ᴡɪʟʟ ᴜɴᴍᴜᴛᴇ ᴛʜᴇᴍ` + +❂ *ꜱᴇᴛᴜᴘ* +*ᴏɴʟʏ ᴄʀᴇᴀᴛᴏʀ* +❂ [ᴀᴅᴅ ᴍᴇ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ ᴀꜱ ᴀᴅᴍɪɴ](https://t.me/{asau}?startgroup=new) +❂ [ᴀᴅᴅ ᴍᴇ ɪɴ your ᴄʜᴀɴɴᴇʟ ᴀꜱ ᴀᴅᴍɪɴ](https://t.me/{asau}?startgroup=new) + +*ᴄᴏᴍᴍᴍᴀɴᴅꜱ* +❂ /fsub channel username - `ᴛᴏ ᴛᴜʀɴ ᴏɴ ᴀɴᴅ 𝚜𝚎𝚝𝚞𝚙 ᴛʜᴇ ᴄʜᴀɴɴᴇʟ.` + + 💡*ᴅᴏ ᴛʜɪꜱ ғɪʀꜱᴛ...* +❂ /fsub - `ᴛᴏ ɢᴇᴛ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ꜱᴇᴛᴛɪɴɢꜱ.` + +❂ /fsub disable - `ᴛᴏ ᴛᴜʀɴ ᴏғ ғᴏʀᴄᴇꜱᴜʙꜱᴄʀɪʙᴇ..` + + 💡`ɪғ ʏᴏᴜ ᴅɪꜱᴀʙʟᴇ ғꜱᴜʙ`, `ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ꜱᴇᴛ ᴀɢᴀɪɴ ғᴏʀ ᴡᴏʀᴋɪɴɢ` /fsub channel username + +❂ /fsub clear - `ᴛᴏ ᴜɴᴍᴜᴛᴇ ᴀʟʟ ᴍᴇᴍʙᴇʀꜱ ᴡʜᴏ ᴍᴜᴛᴇᴅ ʙʏ ᴍᴇ.` +""" +__mod_name__ = "𝙵-sᴜʙ" diff --git a/Exon/modules/get_common_chats.py b/Exon/modules/get_common_chats.py new file mode 100644 index 00000000..48b95214 --- /dev/null +++ b/Exon/modules/get_common_chats.py @@ -0,0 +1,77 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import os +from time import sleep + +from telegram import Update +from telegram.error import BadRequest, RetryAfter, Unauthorized +from telegram.ext import CallbackContext, CommandHandler, Filters + +from Exon import OWNER_ID, dispatcher +from Exon.modules.helper_funcs.extraction import extract_user +from Exon.modules.sql.users_sql import get_user_com_chats + + +def get_user_common_chats(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + msg = update.effective_message + user = extract_user(msg, args) + if not user: + msg.reply_text("I sʜᴀʀᴇ ɴᴏ ᴄᴏᴍᴍᴏɴ ᴄʜᴀᴛs ᴡɪᴛʜ ᴛʜᴇ ᴠᴏɪᴅ.") + return + common_list = get_user_com_chats(user) + if not common_list: + msg.reply_text("ɴᴏ ᴄᴏᴍᴍᴏɴ ᴄʜᴀᴛs ᴡɪᴛʜ ᴛʜɪs ᴜsᴇʀ!") + return + name = bot.get_chat(user).first_name + text = f"<b>ᴄᴏᴍᴍᴏɴ ᴄʜᴀᴛs ᴡɪᴛʜ {name}</b>\n\n" + for chat in common_list: + try: + chat_name = bot.get_chat(chat).title + sleep(0.3) + text += f"• <code>{chat_name}</code>\n" + except (BadRequest, Unauthorized): + pass + except RetryAfter as e: + sleep(e.retry_after) + + if len(text) < 4096: + msg.reply_text(text, parse_mode="HTML") + else: + with open("common_chats.txt", "w") as f: + f.write(text) + with open("common_chats.txt", "rb") as f: + msg.reply_document(f) + os.remove("common_chats.txt") + + +COMMON_CHATS_HANDLER = CommandHandler( + "getchats", + get_user_common_chats, + filters=Filters.user(OWNER_ID), + run_async=True, +) + +dispatcher.add_handler(COMMON_CHATS_HANDLER) diff --git a/Exon/modules/gifhelp.py b/Exon/modules/gifhelp.py new file mode 100644 index 00000000..d086fd7b --- /dev/null +++ b/Exon/modules/gifhelp.py @@ -0,0 +1,15 @@ +__help__ = """ + +ɢᴇᴛ ʏᴏᴜʀ ғᴀᴠᴏᴜʀɪᴛᴇ ɢɪғ(s) ʙʏ ᴜsɪɴɢ ᴛʜɪs ᴍᴏᴅᴜʟᴇ + +**ᴜsᴀɢᴇ:** + +- /gif <query> : `ɢᴇᴛ ʏᴏᴜʀ ᴅᴇsɪʀᴇᴅ ɢɪғ` +- /gif <query> ; (limit) : `ɢᴇᴛ ᴅᴇsɪʀᴀʙʟᴇ ɴᴜᴍʙᴇʀ ᴏғ ɢɪғs` + +Example: /gif cats ; 5 : `ᴛʜɪs ᴡɪʟʟ ʀᴇᴛᴜʀɴ 5 ᴄᴀᴛ ɢɪғs ᴍᴀʏʙᴇ` + +**NOTE: ᴍᴀxɪᴍᴜᴍ ʟɪᴍɪᴛ ɪs 50** + + """ +__mod_name__ = "𝙶ɪғs" diff --git a/Exon/modules/ginfo.py b/Exon/modules/ginfo.py new file mode 100644 index 00000000..f3b9886a --- /dev/null +++ b/Exon/modules/ginfo.py @@ -0,0 +1,101 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +# thanks to inrajith for meow meow meow +import os + +from pyrogram import filters +from pyrogram.types import Message +from telegram import ParseMode + +from Exon import pgram +from Exon.core.sections import section + + +async def get_chat_info(chat, already=False): + if not already: + chat = await pgram.get_chat(chat) + chat_id = chat.id + username = chat.username + title = chat.title + type_ = chat.type + is_scam = chat.is_scam + description = chat.description + members = chat.members_count + is_restricted = chat.is_restricted + link = f"[ʟɪɴᴋ](t.me/{username})" if username else "Null" + total = "" + for m in await pgram.get_chat_members(chat.id, filter="administrators"): + total += f"• [{m.user.first_name}](tg://user?id={m.user.id})\n" + dc_id = chat.dc_id + photo_id = chat.photo.big_file_id if chat.photo else None + body = { + "ɪᴅ:": chat_id, + "ᴅᴄ:": dc_id, + "ᴛʏᴘᴇ:": type_, + "ɴᴀᴍᴇ:": [title], + "ᴜsᴇʀɴᴀᴍᴇ:": [f"@{username}" if username else "Null"], + "ᴍᴇɴᴛɪᴏɴ:": [link], + "ᴍᴇᴍʙᴇʀs:": members, + "sᴄᴀᴍ:": is_scam, + "ʀᴇsᴛʀɪᴄᴛᴇᴅ:": is_restricted, + "\nᴅᴇsᴄʀɪᴘᴛɪᴏɴ:\n\n": [description], + "\nᴀᴅᴍɪɴs ʟɪsᴛ:\n": [total], + } + + caption = section("ᴄʜᴀᴛ ɪɴғᴏ:\n", body) + return [caption, photo_id] + + +@pgram.on_message(filters.command("ginfo") & ~filters.edited) +async def chat_info_func(_, message: Message): + try: + if len(message.command) > 2: + return await message.reply_text("**ᴜsᴀɢᴇ:**/ginfo [-ID]") + + if len(message.command) == 1: + chat = message.chat.id + elif len(message.command) == 2: + chat = message.text.split(None, 1)[1] + + m = await message.reply_text("ᴘʀᴏᴄᴇssɪɴɢ...") + + info_caption, photo_id = await get_chat_info(chat) + if not photo_id: + return await m.edit( + info_caption, + disable_web_page_preview=True, + parse_mode=ParseMode.MARKDOWN, + ) + + photo = await pgram.download_media(photo_id) + await message.reply_photo( + photo, caption=info_caption, quote=False, parse_mode=ParseMode.MARKDOWN + ) + + await m.delete() + os.remove(photo) + except Exception as e: + await m.edit(e), + ParseMode.MARKDOWN diff --git a/Exon/modules/github.py b/Exon/modules/github.py new file mode 100644 index 00000000..d57169ca --- /dev/null +++ b/Exon/modules/github.py @@ -0,0 +1,72 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 aiohttp +from pyrogram import filters + +from Exon import pgram as abishnoi +from Exon.utils.errors import capture_err + +__mod_name__ = "𝙶ɪᴛʜᴜʙ" + + +@abishnoi.on_message(filters.command("git", "GitHub")) +@capture_err +async def github(_, message): + if len(message.command) != 2: + await message.reply_text("/git ᴜsᴇʀɴᴀᴍᴇ") + return + username = message.text.split(None, 1)[1] + URL = f"https://api.github.com/users/{username}" + async with aiohttp.ClientSession() as session, session.get(URL) as request: + if request.status == 404: + return await message.reply_text("404 \nᴍᴀᴛʟᴜʙ ᴋᴜs ʙɪ") + + result = await request.json() + try: + url = result["html_url"] + name = result["name"] + company = result["company"] + bio = result["bio"] + created_at = result["created_at"] + avatar_url = result["avatar_url"] + blog = result["blog"] + location = result["location"] + repositories = result["public_repos"] + followers = result["followers"] + following = result["following"] + caption = f"""**Info Of {name}** +**ᴜsᴇʀɴᴀᴍᴇ:** `{username}` +**ʙɪᴏ:** `{bio}` +**ᴘʀᴏғɪʟᴇ ʟɪɴᴋ:** [ʟɪɴᴋ]({url}) +**ᴄᴏᴍᴘᴀɴʏ:** `{company}` +**ᴄʀᴇᴀᴛᴇᴅ ᴏɴ:** `{created_at}` +**ʀᴇᴘᴏsɪᴛᴏʀɪᴇs:** `{repositories}` `ᴘᴜʙʟɪᴄ` +**ʙʟᴏɢ:** `{blog}` +**ʟᴏᴄᴀᴛɪᴏɴ:** `{location}` +**ғᴏʟʟᴏᴡᴇʀs:** `{followers}` +**ғᴏʟʟᴏᴡɪɴɢ:** `{following}`""" + except Exception as e: + print(e) + await message.reply_photo(photo=avatar_url, caption=caption) diff --git a/Exon/modules/global_bans.py b/Exon/modules/global_bans.py new file mode 100644 index 00000000..b9b90a4b --- /dev/null +++ b/Exon/modules/global_bans.py @@ -0,0 +1,599 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import time +from datetime import datetime +from io import BytesIO + +from telegram import ParseMode, Update +from telegram.error import BadRequest, TelegramError, Unauthorized +from telegram.ext import CallbackContext, CommandHandler, Filters, MessageHandler +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.global_bans_sql as sql +from Exon import ( + DEMONS, + DEV_USERS, + DRAGONS, + EVENT_LOGS, + OWNER_ID, + SPAMWATCH_SUPPORT_CHAT, + STRICT_GBAN, + SUPPORT_CHAT, + TIGERS, + WOLVES, + dispatcher, + sw, +) +from Exon.modules.helper_funcs.chat_status import ( + is_user_admin, + support_plus, + user_admin, +) +from Exon.modules.helper_funcs.extraction import extract_user, extract_user_and_text +from Exon.modules.helper_funcs.misc import send_to_list +from Exon.modules.sql.users_sql import get_user_com_chats + +GBAN_ENFORCE_GROUP = 6 + +GBAN_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/ᴜɴʀᴇsᴛʀɪᴄᴛ ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "ᴜsᴇʀ_ɴᴏᴛ_ᴘᴀʀᴛɪᴄɪᴘᴀɴᴛ", + "Peer_id_invalid", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ a ᴜsᴇʀ ᴛᴏ ᴋɪᴄᴋ ɪᴛ ғʀᴏᴍ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "Chat_admin_required", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴋɪᴄᴋ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "Channel_private", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄᴀɴ'ᴛ ʀᴇᴍᴏᴠᴇ ᴄʜᴀᴛ ᴏᴡɴᴇʀ", +} + +UNGBAN_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ enough rights to restrict/unrestrict chat member", + "ᴜsᴇʀ_not_participant", + "ᴍᴇᴛʜᴏᴅ ɪs ᴀᴠᴀɪʟᴀʙʟᴇ ғᴏʀ sᴜᴘᴇʀɢʀᴏᴜᴘ ᴀɴᴅ ᴄʜᴀɴɴᴇʟ ᴄʜᴀᴛs ᴏɴʟʏ", + "ɴᴏᴛ in ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀɴɴᴇʟ_ᴘʀɪᴠᴀᴛᴇ", + "Chat_admin_required", + "ᴘᴇᴇʀ_id_invalid", + "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ", +} + + +@support_plus +def gban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + log_message = "" + + user_id, reason = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ID sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + + if int(user_id) in DEV_USERS: + message.reply_text( + "ᴛʜᴀᴛ ᴜsᴇʀ ɪs ᴍᴇᴍʙᴇʀ ᴏғ ᴏᴜʀ ғᴀᴍɪʟʏ I ᴄᴀɴ'ᴛ ᴀᴄᴛ ᴀɢᴀɪɴsᴛ ᴏᴜʀ ᴏᴡɴ.", + ) + return + + if int(user_id) in DRAGONS: + message.reply_text( + "I sᴘʏ, ᴡɪᴛʜ ᴍʏ ʟɪᴛᴛʟᴇ ᴇʏᴇ... ʙᴇsᴛғʀɪᴇɴᴅs! ᴡʜʏ ᴀʀᴇ ʏᴏᴜ ɢᴜʏs ᴛᴜʀɴɪɴɢ ᴏɴ ᴇᴀᴄʜ ᴏᴛʜᴇʀ?", + ) + return + + if int(user_id) in DEMONS: + message.reply_text( + "OOOH sᴏᴍᴇᴏɴᴇ ᴛʀʏɪɴɢ ᴛᴏ ɢʙᴀɴ ᴏᴜʀ ғʀɪᴇɴᴅᴏ! *ɢʀᴀʙs ᴘᴏᴘᴄᴏʀɴ*", + ) + return + + if int(user_id) in TIGERS: + message.reply_text("ᴛʜᴀᴛ's ᴏᴜʀ ᴄʟᴀssᴍᴀᴛᴇ! ᴛʜᴇʏ ᴄᴀɴɴᴏᴛ ʙᴇ ʙᴀɴɴᴇᴅ!") + return + + if int(user_id) in WOLVES: + message.reply_text("ᴛʜᴀᴛ's ᴀɴ EXON! ᴛʜᴇʏ ᴄᴀɴɴᴏᴛ ʙᴇ ʙᴀɴɴᴇᴅ!") + return + + if user_id == bot.id: + message.reply_text("ʏᴏᴜ ᴜʜʜ...ᴡᴀɴᴛ ᴍᴇ ᴛᴏ ᴘᴜɴᴄʜ ᴍʏsᴇʟғ?") + return + + try: + user_chat = bot.get_chat(user_id) + except BadRequest as excp: + if excp.message == "User not found": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ.") + return "" + return + + if user_chat.type != "private": + message.reply_text("ᴛʜᴀᴛ's ɴᴏᴛ ᴀ ᴜsᴇʀ!") + return + + if sql.is_user_gbanned(user_id): + + if not reason: + message.reply_text( + "ᴛʜɪs user is ᴀʟʀᴇᴀᴅʏ ɢʙᴀɴɴᴇᴅ; I'ᴅ ᴄʜᴀɴɢᴇ ᴛʜᴇ ʀᴇᴀsᴏɴ, ʙᴜᴛ ʏᴏᴜ ʜᴀᴠᴇɴ'ᴛ ɢɪᴠᴇɴ ᴍᴇ ᴏɴᴇ...", + ) + return + + old_reason = sql.update_gban_reason( + user_id, + user_chat.username or user_chat.first_name, + reason, + ) + if old_reason: + message.reply_text( + "ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ɢʙᴀɴɴᴇᴅ, ғᴏʀ ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ʀᴇᴀsᴏɴ:\n" + "<code>{}</code>\n" + "I've ɢᴏɴᴇ ᴀɴᴅ ᴜᴘᴅᴀᴛᴇᴅ it ᴡɪᴛʜ ʏᴏᴜʀ ɴᴇᴡ ʀᴇᴀsᴏɴ!".format( + html.escape(old_reason), + ), + parse_mode=ParseMode.HTML, + ) + + else: + message.reply_text( + "This ᴜsᴇʀ is ᴀʟʀᴇᴀᴅʏ ɢʙᴀɴɴᴇᴅ, ʙᴜᴛ ʜᴀᴅ ɴᴏ ʀᴇᴀsᴏɴ sᴇᴛ; I'ᴠᴇ ɢᴏɴᴇ ᴀɴᴅ ᴜᴘᴅᴀᴛᴇᴅ ɪᴛ!", + ) + + return + + message.reply_text("ᴏɴ ɪᴛ \nɢʙᴀɴ ᴅᴏɴᴇ !") + + start_time = time.time() + datetime_fmt = "%Y-%m-%dT%H:%M" + current_time = datetime.utcnow().strftime(datetime_fmt) + + if chat.type != "private": + chat_origin = "<b>{} ({})</b>\n".format(html.escape(chat.title), chat.id) + else: + chat_origin = "<b>{}</b>\n".format(chat.id) + + log_message = ( + f"#ɢʙᴀɴɴᴇᴅ\n" + f"<b>ᴏʀɪɢɪɴᴀᴛᴇᴅ ғʀᴏᴍ:</b> <code>{chat_origin}</code>\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ʙᴀɴɴᴇᴅ ᴜsᴇʀ:</b> {mention_html(user_chat.id, user_chat.first_name)}\n" + f"<b>ʙᴀɴɴᴇᴅ ᴜsᴇʀ ɪᴅ:</b> <code>{user_chat.id}</code>\n" + f"<b>ᴇᴠᴇɴᴛ sᴛᴀᴍᴘ:</b> <code>{current_time}</code>" + ) + + if reason: + if chat.type == chat.SUPERGROUP and chat.username: + log_message += f'\n<b>ʀᴇᴀsᴏɴ:</b> <a href="https://telegram.me/{chat.username}/{message.message_id}">{reason}</a>' + else: + log_message += f"\n<b>ʀᴇᴀsᴏɴ:</b> <code>{reason}</code>" + + if EVENT_LOGS: + try: + log = bot.send_message( + EVENT_LOGS, + log_message, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + except BadRequest: + log = bot.send_message( + EVENT_LOGS, + log_message + + "\n\nғᴏʀᴍᴀᴛᴛɪɴɢ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ᴅᴜᴇ ᴛᴏ ᴀɴ ᴜɴᴇxᴘᴇᴄᴛᴇᴅ ᴇʀʀᴏʀ.", + ) + + else: + send_to_list(bot, DRAGONS + DEMONS, log_message, html=True) + + sql.gban_user(user_id, user_chat.username or user_chat.first_name, reason) + + chats = get_user_com_chats(user_id) + gbanned_chats = 0 + + for chat in chats: + chat_id = int(chat) + + # Check if this group has disabled gbans + if not sql.does_chat_gban(chat_id): + continue + + try: + bot.ban_chat_member(chat_id, user_id) + gbanned_chats += 1 + + except BadRequest as excp: + if excp.message not in GBAN_ERRORS: + message.reply_text(f"ᴄᴏᴜʟᴅ ɴᴏᴛ ɢʙᴀɴ ᴅᴜᴇ ᴛᴏ: {excp.message}") + if EVENT_LOGS: + bot.send_message( + EVENT_LOGS, + f"ᴄᴏᴜʟᴅ ɴᴏᴛ ɢʙᴀɴ ᴅᴜᴇ ᴛᴏ {excp.message}", + parse_mode=ParseMode.HTML, + ) + else: + send_to_list( + bot, + DRAGONS + DEMONS, + f"ᴄᴏᴜʟᴅ ɴᴏᴛ ɢʙᴀɴ ᴅᴜᴇ ᴛᴏ: {excp.message}", + ) + sql.ungban_user(user_id) + return + except TelegramError: + pass + + if EVENT_LOGS: + log.edit_text( + log_message + f"\n<b>ᴄʜᴀᴛs ᴀғғᴇᴄᴛᴇᴅ:</b> <code>{gbanned_chats}</code>", + parse_mode=ParseMode.HTML, + ) + else: + send_to_list( + bot, + DRAGONS + DEMONS, + f"ɢʙᴀɴ ᴄᴏᴍᴘʟᴇᴛᴇ! (ᴜsᴇʀ ʙᴀɴɴᴇᴅ ɪɴ <code>{gbanned_chats}</code> chats)", + html=True, + ) + + end_time = time.time() + gban_time = round((end_time - start_time), 2) + + if gban_time > 60: + gban_time = round((gban_time / 60), 2) + message.reply_text( + "ᴅᴏɴᴇ ! ɢʙᴀɴɴᴇᴅ. \nᴅᴏɴ'ᴛ ʟᴏᴠᴇ ᴀɴᴅ ᴄʀʏ ᴊᴜsᴛ ғᴜ*ᴋ & ғʟʏ", + parse_mode=ParseMode.HTML, + ) + try: + bot.send_message( + user_id, + "#ᴇᴠᴇɴᴛ" + "ʏᴏᴜ ʜᴀᴠᴇ ʙᴇᴇɴ ᴍᴀʀᴋᴇᴅ as ᴍᴀʟɪᴄɪᴏᴜs ᴀɴᴅ ᴀs sᴜᴄʜ ʜᴀᴠᴇ ʙᴇᴇɴ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴀɴʏ ғᴜᴛᴜʀᴇ ɢʀᴏᴜᴘs ᴡᴇ ᴍᴀɴᴀɢᴇ." + f"\n<b>ʀᴇᴀsᴏɴ:</b> <code>{html.escape(user.reason)}</code>" + f"</b>ᴀᴘᴘᴇᴀʟ ᴄʜᴀᴛ:</b> @{SUPPORT_CHAT}", + parse_mode=ParseMode.HTML, + ) + except: + pass # bot probably blocked by user + + +@support_plus +def ungban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + user = update.effective_user + chat = update.effective_chat + log_message = "" + + user_id = extract_user(message, args) + + if not user_id: + message.reply_text( + "You ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ or ᴛʜᴇ ɪᴅ sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + + user_chat = bot.get_chat(user_id) + if user_chat.type != "private": + message.reply_text("ᴛʜᴀᴛ's ɴᴏᴛ a ᴜsᴇʀ!") + return + + if not sql.is_user_gbanned(user_id): + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ɢʙᴀɴɴᴇᴅ!") + return + + message.reply_text(f"I'ʟʟ ɢɪᴠᴇ {user_chat.first_name} a sᴇᴄᴏɴᴅ ᴄʜᴀɴᴄᴇ, ɢʟᴏʙᴀʟʟʏ.") + + start_time = time.time() + datetime_fmt = "%Y-%m-%dT%H:%M" + current_time = datetime.utcnow().strftime(datetime_fmt) + + if chat.type != "private": + chat_origin = f"<b>{html.escape(chat.title)} ({chat.id})</b>\n" + else: + chat_origin = f"<b>{chat.id}</b>\n" + + log_message = ( + f"#ᴜɴɢʙᴀɴɴᴇᴅ\n" + f"<b>ᴏʀɪɢɪɴᴀᴛᴇᴅ ғʀᴏᴍ:</b> <code>{chat_origin}</code>\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜɴʙᴀɴɴᴇᴅ ᴜsᴇʀ:</b> {mention_html(user_chat.id, user_chat.first_name)}\n" + f"<b>ᴜɴʙᴀɴɴᴇᴅ ᴜsᴇʀ ID:</b> <code>{user_chat.id}</code>\n" + f"<b>ᴇᴠᴇɴᴛ sᴛᴀᴍᴘ:</b> <code>{current_time}</code>" + ) + + if EVENT_LOGS: + try: + log = bot.send_message( + EVENT_LOGS, + log_message, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + except BadRequest: + log = bot.send_message( + EVENT_LOGS, + log_message + + "\n\nғᴏʀᴍᴀᴛᴛɪɴɢ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ᴅᴜᴇ ᴛᴏ ᴀɴ ᴜɴᴇxᴘᴇᴄᴛᴇᴅ ᴇʀʀᴏʀ.", + ) + else: + send_to_list(bot, DRAGONS + DEMONS, log_message, html=True) + + chats = get_user_com_chats(user_id) + ungbanned_chats = 0 + + for chat in chats: + chat_id = int(chat) + + # Check if this group has disabled gbans + if not sql.does_chat_gban(chat_id): + continue + + try: + member = bot.get_chat_member(chat_id, user_id) + if member.status == "ᴋɪᴄᴋᴇᴅ": + bot.unban_chat_member(chat_id, user_id) + ungbanned_chats += 1 + + except BadRequest as excp: + if excp.message not in UNGBAN_ERRORS: + message.reply_text(f"ᴄᴏᴜʟᴅ ɴᴏᴛ ᴜɴ-ɢᴀɴ ᴅᴜᴇ ᴛᴏ: {excp.message}") + if EVENT_LOGS: + bot.send_message( + EVENT_LOGS, + f"ᴄᴏᴜʟᴅ ɴᴏᴛ ᴜɴ-ʜᴀɴ ᴅᴜᴇ ᴛᴏ: {excp.message}", + parse_mode=ParseMode.HTML, + ) + else: + bot.send_message( + OWNER_ID, + f"ᴄᴏᴜʟᴅ ɴᴏᴛ ᴜɴ-ɢʙᴀɴ ᴅᴜᴇ ᴛᴏ: {excp.message}", + ) + return + except TelegramError: + pass + + sql.ungban_user(user_id) + + if EVENT_LOGS: + log.edit_text( + log_message + f"\n<b>ᴄʜᴀᴛs ᴀғғᴇᴄᴛᴇᴅ:</b> {ungbanned_chats}", + parse_mode=ParseMode.HTML, + ) + else: + send_to_list(bot, DRAGONS + DEMONS, "ᴜɴ-ɢᴀɴ ᴄᴏᴍᴘʟᴇᴛᴇ! ") + + end_time = time.time() + ungban_time = round((end_time - start_time), 2) + + if ungban_time > 60: + ungban_time = round((ungban_time / 60), 2) + message.reply_text(f"ᴘᴇʀsᴏɴ has ʙᴇᴇɴ ᴜɴ-ɢʙᴀɴɴᴇᴅ. ᴛᴏᴏᴋ {ungban_time} ᴍɪɴ") + else: + message.reply_text(f"ᴘᴇʀsᴏɴ ʜᴀs ʙᴇᴇɴ ᴜɴ-ɢʙᴀɴɴᴇᴅ. ᴛᴏᴏᴋ {ungban_time} sᴇᴄ") + + +@support_plus +def gbanlist(update: Update, context: CallbackContext): + banned_users = sql.get_gban_list() + + if not banned_users: + update.effective_message.reply_text( + "ᴛʜᴇʀᴇ ᴀʀᴇɴᴀᴛ ᴀɴʏ ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs! ʏᴏᴜ'ʀᴇ ᴋɪɴᴅᴇʀ ᴛʜᴀɴ I ᴇxᴘᴇᴄᴛᴇᴅ...", + ) + return + + banfile = "sᴄʀᴇᴡ ᴛʜᴇsᴇ ɢᴜʏs.\n" + for user in banned_users: + banfile += f"[x] {user['name']} - {user['user_id']}\n" + if user["reason"]: + banfile += f"ʀᴇᴀsᴏɴ: {user['reason']}\n" + + with BytesIO(str.encode(banfile)) as output: + output.name = "gbanlist.txt" + update.effective_message.reply_document( + document=output, + filename="gbanlist.txt", + caption="ʜᴇʀᴇ ɪs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴄᴜʀʀᴇɴᴛʟʏ ɢʙᴀɴɴᴇᴅ users.", + ) + + +def check_and_ban(update, user_id, should_message=True): + + if user_id in TIGERS or user_id in WOLVES: + sw_ban = None + else: + try: + sw_ban = sw.get_ban(int(user_id)) + except: + sw_ban = None + + if sw_ban: + update.effective_chat.ban_member(user_id) + if should_message: + update.effective_message.reply_text( + f"<b>ᴀʟᴇʀᴛ</b>: ᴛʜɪs ᴜsᴇʀ ʜᴀs ʙᴇᴇɴ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ʙʏ @SpamWatch\n" + f"<code>*ʙᴀɴs ᴛʜᴇᴍ ғʀᴏᴍ ʜᴇʀᴇ*</code>.\n" + f"<b>ᴀᴘᴘᴇᴀʟ ғᴏʀ ᴜɴʙᴀɴ</b>: {SPAMWATCH_SUPPORT_CHAT}\n" + f"<b>ᴜsᴇʀ ɪᴅ</b>: <code>{sw_ban.id}</code>\n" + f"<b>ʙᴀɴ ʀᴇᴀsᴏɴ</b>: <code>{html.escape(sw_ban.reason)}</code>\n @AbishnoiMF", + parse_mode=ParseMode.HTML, + ) + return + + if sql.is_user_gbanned(user_id): + update.effective_chat.ban_member(user_id) + if should_message: + text = ( + f"<b>ᴀʟᴇʀᴛ</b>: ᴛʜɪs ᴜsᴇʀ ʜᴀs ʙᴇᴇɴ ɢʟᴏʙᴀʟʟʏ ʙᴀɴɴᴇᴅ ʙʏ ᴛʜᴇ ʙᴏᴛ ᴏᴡɴᴇʀ\n" + f"<code>*ʙᴀɴs ᴛʜᴇᴍ ғʀᴏᴍ ʜᴇʀᴇ*</code>.\n" + f"<b>ᴀᴘᴘᴇᴀʟ ғᴏʀ ᴜɴʙᴀɴ</b>: @{SUPPORT_CHAT}\n" + f"<b>ᴜsᴇʀ ɪᴅ</b>: <code>{user_id}</code>" + ) + user = sql.get_gbanned_user(user_id) + if user.reason: + text += f"\n<b>ʙᴀɴ ʀᴇᴀsᴏɴ:</b> <code>{html.escape(user.reason)}</code>" + update.effective_message.reply_text(text, parse_mode=ParseMode.HTML) + + +def enforce_gban(update: Update, context: CallbackContext): + # Not using @restrict handler to avoid spamming - just ignore if cant gban. + bot = context.bot + try: + restrict_permission = update.effective_chat.get_member( + bot.id, + ).can_restrict_members + except Unauthorized: + return + if sql.does_chat_gban(update.effective_chat.id) and restrict_permission: + user = update.effective_user + chat = update.effective_chat + msg = update.effective_message + + if user and not is_user_admin(chat, user.id): + check_and_ban(update, user.id) + return + + if msg.new_chat_members: + new_members = update.effective_message.new_chat_members + for mem in new_members: + check_and_ban(update, mem.id) + + if msg.reply_to_message: + user = msg.reply_to_message.from_user + if user and not is_user_admin(chat, user.id): + check_and_ban(update, user.id, should_message=False) + + +@user_admin +def gbanstat(update: Update, context: CallbackContext): + args = context.args + if len(args) > 0: + if args[0].lower() in ["on", "yes"]: + sql.enable_gbans(update.effective_chat.id) + update.effective_message.reply_text( + "ᴀɴᴛɪsᴘᴀᴍ ɪs ɴᴏᴡ ᴇɴᴀʙʟᴇᴅ ✅ " + "I ᴀᴍ ɴᴏᴡ ᴘʀᴏᴛᴇᴄᴛɪɴɢ ʏᴏᴜʀ ɢʀᴏᴜᴘ ғʀᴏᴍ ᴘᴏᴛᴇɴᴛɪᴀʟ ʀᴇᴍᴏᴛᴇ ᴛʜʀᴇᴀᴛs!", + ) + elif args[0].lower() in ["off", "no"]: + sql.disable_gbans(update.effective_chat.id) + update.effective_message.reply_text( + "ᴀɴᴛɪsᴘᴀɴ is ɴᴏᴡ ᴅɪsᴀʙʟᴇᴅ ❌ " "sᴘᴀᴍᴡᴀᴛᴄʜ ɪs ɴᴏᴡ ᴅɪsᴀʙʟᴇᴅ ❌", + ) + else: + update.effective_message.reply_text( + "ɢɪᴠᴇ ᴍᴇ sᴏᴍᴇ ᴀʀɢᴜᴍᴇɴᴛs ᴛᴏ ᴄʜᴏᴏsᴇ ᴀ sᴇᴛᴛɪɴɢ! on/off, yes/no!\n\n" + "ʏᴏᴜʀ ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢ ɪs: {}\n" + "ᴡʜᴇɴ ᴛʀᴜᴇ, ᴀɴʏ ɢʙᴀɴs ᴛʜᴀᴛ ʜᴀᴘᴘᴇɴ ᴡɪʟʟ ᴀʟsᴏ ʜᴀᴘᴘᴇɴ ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ. " + "ᴡʜᴇɴ ғᴀʟsᴇ, ᴛʜᴇʏ ᴡᴏɴ'ᴛ, ʟᴇᴀᴠɪɴɢ ʏᴏᴜ ᴀᴛ ᴛʜᴇ ᴘᴏssɪʙʟᴇ ᴍᴇʀᴄʏ ᴏғ " + "spammers.".format(sql.does_chat_gban(update.effective_chat.id)), + ) + + +def __stats__(): + return f"•➥ {sql.num_gbanned_users()} ɢʙᴀɴɴᴇᴅ ᴜsᴇʀs." + + +def __user_info__(user_id): + is_gbanned = sql.is_user_gbanned(user_id) + text = "ɢʙᴀɴɴᴇᴅ: <b>{}</b>" + if user_id in [777000, 1087968824]: + return "" + if user_id == dispatcher.bot.id: + return "" + if int(user_id) in DRAGONS + TIGERS + WOLVES: + return "" + if is_gbanned: + text = text.format("Yes") + user = sql.get_gbanned_user(user_id) + if user.reason: + text += f"\n<b>ʀᴇᴀsᴏɴ:</b> <code>{html.escape(user.reason)}</code>" + text += f"\n<b>ᴀᴘᴘᴇᴀʟ ᴄʜᴀᴛ:</b> @{SUPPORT_CHAT}" + else: + text = text.format("No") + return text + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + return f"ᴛʜɪs ᴄʜᴀᴛ ɪs ᴇɴғᴏʀᴄɪɴɢ *ɢʙᴀɴs*: `{sql.does_chat_gban(chat_id)}`." + + +__help__ = f""" +*ᴀᴅᴍɪɴs ᴏɴʟʏ:* +• /antispam <on/off/yes/no>*:*` ᴡɪʟʟ ᴛᴏɢɢʟᴇ ᴏᴜʀ ᴀɴᴛɪsᴘᴀᴍ ᴛᴇᴄʜ ᴏʀ ʀᴇᴛᴜʀɴ ʏᴏᴜʀ ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢs `. + +`ᴀɴᴛɪ-ᴘᴀᴍ, used ʙʏ ʙᴏᴛ ᴅᴇᴠs ᴛᴏ ʙᴀɴ sᴘᴀᴍᴍᴇʀs ᴀᴄʀᴏss ᴀʟʟ ɢʀᴏᴜᴘs. ᴛʜɪs ʜᴇʟᴘs ᴘʀᴏᴛᴇᴄᴛ \ +ʏᴏᴜ ᴀɴᴅ ʏᴏᴜʀ ɢʀᴏᴜᴘs ʙʏ ʀᴇᴍᴏᴠɪɴɢ sᴘᴀᴍ ғʟᴏᴏᴅᴇʀs ᴀs ǫᴜɪᴄᴋʟʏ ᴀs ᴘᴏssɪʙʟᴇ `. + +*Note:* ᴜsᴇʀs can ᴀᴘᴘᴇᴀʟ ɢʙᴀɴs ᴏʀ ʀᴇᴘᴏʀᴛ sᴘᴀᴍᴍᴇʀs ᴀᴛ @{SUPPORT_CHAT} + +ᴛʜɪs ᴀʟsᴏ ɪɴᴛᴇɢʀᴀᴛᴇs @Spamwatch API ᴛᴏ ʀᴇᴍᴏᴠᴇ sᴘᴀᴍᴍᴇʀs as ᴍᴜᴄʜ ᴀs ᴘᴏssɪʙʟᴇ ғʀᴏᴍ ʏᴏᴜʀ ᴄʜᴀᴛʀᴏᴏᴍ! +*ᴡʜᴀᴛ ɪs sᴘᴀᴍᴡᴀᴛᴄʜ?* + +sᴘᴀᴍᴡᴀᴛᴄʜ ᴍᴀɪɴᴛᴀɪɴs a ʟᴀʀɢᴇ ᴄᴏɴsᴛᴀɴᴛʟʏ ᴜᴘᴅᴀᴛᴇᴅ ʙᴀɴᴛ of sᴘᴀᴍʙᴏᴛs, ᴛʀᴏʟʟs, ʙɪᴛᴄᴏɪɴ sᴘᴀᴍᴍᴇʀs ᴀɴᴅ ᴜɴsᴀᴠᴏᴜʀʏ ᴄʜᴀʀᴀᴄᴛᴇʀs[.] + +ᴄᴏɴsᴛᴀɴᴛʟʏ help banning spammers off from your group automatically sᴏ, ʏᴏᴜ ᴡᴏɴᴛ ʜᴀᴠᴇ ᴛᴏ ᴡᴏʀʀʏ ᴀʙᴏᴜᴛ sᴘᴀᴍᴍᴇʀs sᴛᴏʀᴍɪɴɢ ʏᴏᴜʀ ɢʀᴏᴜᴘ. + +*ɴᴏᴛᴇ:* ||ᴜsᴇʀs ᴄᴀɴ ᴀᴘᴘᴇᴀʟ sᴘᴀᴍᴡᴀᴛᴄʜ ʙᴀɴs ᴀᴛ @SpamwatchSupport|| +""" + +GBAN_HANDLER = CommandHandler("gban", gban, run_async=True) +UNGBAN_HANDLER = CommandHandler("ungban", ungban, run_async=True) +GBAN_LIST = CommandHandler("gbanlist", gbanlist, run_async=True) + +GBAN_STATUS = CommandHandler( + "antispam", gbanstat, filters=Filters.chat_type.groups, run_async=True +) + +GBAN_ENFORCER = MessageHandler( + Filters.all & Filters.chat_type.groups, enforce_gban, run_async=True +) + +dispatcher.add_handler(GBAN_HANDLER) +dispatcher.add_handler(UNGBAN_HANDLER) +dispatcher.add_handler(GBAN_LIST) +dispatcher.add_handler(GBAN_STATUS) + +__mod_name__ = "𝙰nti-sᴘᴀᴍ" +__handlers__ = [GBAN_HANDLER, UNGBAN_HANDLER, GBAN_LIST, GBAN_STATUS] + +if STRICT_GBAN: # enforce GBANS if this is set + dispatcher.add_handler(GBAN_ENFORCER, GBAN_ENFORCE_GROUP) + __handlers__.append((GBAN_ENFORCER, GBAN_ENFORCE_GROUP)) diff --git a/Exon/modules/google.py b/Exon/modules/google.py new file mode 100644 index 00000000..6c9534e2 --- /dev/null +++ b/Exon/modules/google.py @@ -0,0 +1,150 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import glob +import re +import urllib +import urllib.request + +from bing_image_downloader import downloader +from bs4 import BeautifulSoup +from telethon import * +from telethon.tl.types import * + +from Exon import telethn +from Exon.events import register + + +@register(pattern="^/img (.*)") +async def img_sampler(event): + if event.fwd_from: + return + + query = event.pattern_match.group(1) + jit = f'"{query}"' + downloader.download( + jit, + limit=4, + output_dir="store", + adult_filter_off=False, + force_replace=False, + timeout=60, + ) + os.chdir(f'./store/"{query}"') + types = ("*.png", "*.jpeg", "*.jpg") # the tuple of file types + files_grabbed = [] + for files in types: + files_grabbed.extend(glob.glob(files)) + await telethn.send_file(event.chat_id, files_grabbed, reply_to=event.id) + os.chdir("/app") + os.system("rm -rf store") + + +opener = urllib.request.build_opener() +useragent = "Mozilla/5.0 (Linux; Android 9; SM-G960F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Mobile Safari/537.36" +opener.addheaders = [("User-agent", useragent)] + + +async def ParseSauce(googleurl): + """Parse/Scrape the HTML code for the info we want.""" + + source = opener.open(googleurl).read() + soup = BeautifulSoup(source, "html.parser") + + results = {"similar_images": "", "best_guess": ""} + + try: + for similar_image in soup.findAll("input", {"class": "gLFyf"}): + url = "https://www.google.com/search?tbm=isch&q=" + urllib.parse.quote_plus( + similar_image.get("value") + ) + results["similar_images"] = url + except BaseException: + pass + + for best_guess in soup.findAll("div", attrs={"class": "r5a77d"}): + results["best_guess"] = best_guess.get_text() + + return results + + +async def scam(results, lim): + + single = opener.open(results["similar_images"]).read() + decoded = single.decode("utf-8") + + imglinks = [] + counter = 0 + + pattern = r"^,\[\"(.*[.png|.jpg|.jpeg])\",[0-9]+,[0-9]+\]$" + oboi = re.findall(pattern, decoded, re.I | re.M) + + for imglink in oboi: + counter += 1 + if counter < int(lim): + imglinks.append(imglink) + else: + break + + return imglinks + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + + return isinstance( + ( + await telethn(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + if isinstance(chat, types.InputPeerChat): + + ui = await telethn.get_peer_id(user) + ps = ( + await telethn(functions.messages.GetFullChatRequest(chat.chat_id)) + ).full_chat.participants.participants + return isinstance( + next((p for p in ps if p.user_id == ui), None), + (types.ChatParticipantAdmin, types.ChatParticipantCreator), + ) + return None + + +__mod_name__ = "𝚃ᴏᴏʟs" + +__help__ = """ +⍟ /img <text> :- `sᴇᴀʀᴄʜ ɢᴏᴏɢʟᴇ ғᴏʀ ɪᴍᴀɢᴇs ᴀɴᴅ ʀᴇᴛᴜʀɴs ᴛʜᴇᴍ ғᴏʀ ɢʀᴇᴀᴛᴇʀ ɴᴏ. ᴏғ ʀᴇsᴜʟᴛs sᴘᴇᴄɪғʏ ʟɪᴍ, ғᴏʀ` + +ᴇɢ: `/img hello lim=10` + +⍟ /reverse :- `ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ, or ᴏʀ ɪᴍᴀɢᴇ ᴛᴏ sᴇᴀʀᴄʜ ɪᴛ ` + + ᴅᴏ ʏᴏᴜ ᴋɴᴏᴡ that ʏᴏᴜ ᴄᴀɴ search ᴀɴ ɪᴍᴀɢᴇ ᴡɪᴛʜ ᴀ ʟɪɴᴋ ᴛᴏᴏ? + /reverse picturelink <amount>. + +⍟ /git <ɢɪᴛʜᴜʙ ᴜsᴇʀɴᴀᴍᴇ> :-`ɢᴇᴛ ɪɴғᴏ ᴏғ ᴀɴʏ ɢɪᴛʜᴜʙ ᴘʀᴏғɪʟᴇ` + +⍟ /webss <ᴡᴇʙɴᴀᴍᴇ.ᴄᴏᴍ> :- `ɢᴇᴛ sᴄʀᴇᴇɴ sʜᴏᴛ ᴏғ ᴀɴʏ ᴡᴇʙsɪᴛᴇ ʏᴏᴜ ᴡᴀɴᴛ `. +""" diff --git a/Exon/modules/gtranslator.py b/Exon/modules/gtranslator.py new file mode 100644 index 00000000..0fa7bb9d --- /dev/null +++ b/Exon/modules/gtranslator.py @@ -0,0 +1,105 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 gpytranslate import SyncTranslator +from telegram import ParseMode, Update +from telegram.ext import CallbackContext + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + +trans = SyncTranslator() + + +def translate(update: Update, context: CallbackContext) -> None: + bot = context.bot + message = update.effective_message + reply_msg = message.reply_to_message + if not reply_msg: + message.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ ᴛʀᴀɴsʟᴀᴛᴇ ɪᴛ!") + return + if reply_msg.caption: + to_translate = reply_msg.caption + elif reply_msg.text: + to_translate = reply_msg.text + try: + args = message.text.split()[1].lower() + if "//" in args: + source = args.split("//")[0] + dest = args.split("//")[1] + else: + source = trans.detect(to_translate) + dest = args + except IndexError: + source = trans.detect(to_translate) + dest = "en" + translation = trans(to_translate, sourcelang=source, targetlang=dest) + reply = ( + f"<b>ᴛʀᴀɴsʟᴀᴛᴇᴅ ғʀᴏᴍ {source} ᴛᴏ {dest}</b>:\n" + f"<code>{translation.text}</code>" + ) + + bot.send_message(text=reply, chat_id=message.chat.id, parse_mode=ParseMode.HTML) + + +def languages(update: Update, context: CallbackContext) -> None: + message = update.effective_message + bot = context.bot + bot.send_message( + text="ᴄʟɪᴄᴋ [ʜᴇʀᴇ](https://telegra.ph/ɪᴛs-ᴍᴇ-𒆜-Aʙɪsʜɴᴏɪ-07-30-2) ᴛᴏ sᴇᴇ ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴘᴘᴏʀᴛᴇᴅ ʟᴀɴɢᴜᴀɢᴇ ᴄᴏᴅᴇs!", + chat_id=message.chat.id, + disable_web_page_preview=True, + parse_mode=ParseMode.MARKDOWN, + ) + + +__help__ = """ +Use ᴛʜɪs ᴍᴏᴅᴜʟᴇ ᴛᴏ ᴛʀᴀɴsʟᴀᴛᴇ sᴛᴜғғ! + +*ᴄᴏᴍᴍᴀɴᴅs:* +⍟ /tl (or /tr ):` ᴀs ᴀ ʀᴇᴘʟʏ ᴛᴏ a ᴍᴇssᴀɢᴇ, ᴛʀᴀɴsʟᴀᴛᴇs ɪᴛ ᴛᴏ ᴇɴɢʟɪsʜ ` + +⍟ /tl <lang>: `ᴛʀᴀɴsʟᴀᴛᴇs ᴛᴏ <lang>` + +ᴇɢ: `/tl en`: `ᴛʀᴀɴsʟᴀᴛᴇs ᴛᴏ ᴇɴɢʟɪsʜ ` + +⍟ /tl <source>//<dest>: ᴛʀᴀɴsʟᴀᴛᴇs ғʀᴏᴍ <source> ᴛᴏ <lang>. + +ᴇɢ: `/tl ja//en`: ᴛʀᴀɴsʟᴀᴛᴇs ғʀᴏᴍ ᴊᴀᴘᴀɴᴇsᴇ ᴛᴏ ᴇɴɢʟɪsʜ. + + +• [ʟɪsᴛ ᴏғ sᴜᴘᴘᴏʀᴛᴇᴅ ʟᴀɴɢᴜᴀɢᴇs ғᴏʀ ᴛʀᴀɴsʟᴀᴛɪᴏɴ](https://telegra.ph/ɪᴛs-ᴍᴇ-𒆜-Aʙɪsʜɴᴏɪ-07-30-2) +""" + +TRANSLATE_HANDLER = DisableAbleCommandHandler(["tr", "tl"], translate, run_async=True) +TRANSLATE_LANG_HANDLER = DisableAbleCommandHandler( + ["lang", "languages"], languages, run_async=True +) + +dispatcher.add_handler(TRANSLATE_HANDLER) +dispatcher.add_handler(TRANSLATE_LANG_HANDLER) + +__mod_name__ = "𝚃ʀᴀɴsʟᴀᴛᴏʀ" +__command_list__ = ["tr", "tl", "lang", "languages"] +__handlers__ = [TRANSLATE_HANDLER, TRANSLATE_LANG_HANDLER] diff --git "a/Exon/modules/helper_funcs/ABISHNOI COPYRIGHT \302\251" "b/Exon/modules/helper_funcs/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/modules/helper_funcs/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/modules/helper_funcs/__init__.py b/Exon/modules/helper_funcs/__init__.py new file mode 100644 index 00000000..69e6a508 --- /dev/null +++ b/Exon/modules/helper_funcs/__init__.py @@ -0,0 +1 @@ +"""ʜᴇʟᴘᴇʀs, ᴀʟsᴏ ᴋɴᴏᴡɴ ᴀs ᴜᴛɪʟɪᴛɪᴇs .""" diff --git a/Exon/modules/helper_funcs/alternate.py b/Exon/modules/helper_funcs/alternate.py new file mode 100644 index 00000000..993d0acf --- /dev/null +++ b/Exon/modules/helper_funcs/alternate.py @@ -0,0 +1,66 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 functools import wraps + +from telegram import ChatAction +from telegram.error import BadRequest + + +def send_message(message, text, *args, **kwargs): + try: + return message.reply_text(text, *args, **kwargs) + except BadRequest as err: + if str(err) == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + return message.reply_text(text, quote=False, *args, **kwargs) + + +def typing_action(func): + """sᴇɴᴅs ᴛʏᴘɪɴɢ ᴀᴄᴛɪᴏɴ ᴡʜɪʟᴇ ᴘʀᴏᴄᴇssɪɴɢ ғᴜɴᴄ ᴄᴏᴍᴍᴀɴᴅ.""" + + @wraps(func) + def command_func(update, context, *args, **kwargs): + context.bot.send_chat_action( + chat_id=update.effective_chat.id, + action=ChatAction.TYPING, + ) + return func(update, context, *args, **kwargs) + + return command_func + + +def send_action(action): + """sᴇɴᴅs `action` ᴡʜɪʟᴇ ᴘʀᴏᴄᴇssɪɴɢ ғᴜɴᴄ ᴄᴏᴍᴍᴀɴᴅ.""" + + def decorator(func): + @wraps(func) + def command_func(update, context, *args, **kwargs): + context.bot.send_chat_action( + chat_id=update.effective_chat.id, action=action + ) + return func(update, context, *args, **kwargs) + + return command_func + + return decorator diff --git a/Exon/modules/helper_funcs/anonymous.py b/Exon/modules/helper_funcs/anonymous.py new file mode 100644 index 00000000..d9a19b66 --- /dev/null +++ b/Exon/modules/helper_funcs/anonymous.py @@ -0,0 +1,140 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 functools +from enum import Enum + +from telegram import ParseMode, Update +from telegram.ext import CallbackContext +from telegram.inline.inlinekeyboardbutton import InlineKeyboardButton +from telegram.inline.inlinekeyboardmarkup import InlineKeyboardMarkup + +from Exon import DEV_USERS, DRAGONS, dispatcher +from Exon.modules.helper_funcs.decorators import Exoncallback + + +class AdminPerms(Enum): + CAN_RESTRICT_MEMBERS = "can_restrict_members" + CAN_PROMOTE_MEMBERS = "can_promote_members" + CAN_INVITE_USERS = "can_invite_users" + CAN_DELETE_MESSAGES = "can_delete_messages" + CAN_CHANGE_INFO = "can_change_info" + CAN_PIN_MESSAGES = "can_pin_messages" + + +class ChatStatus(Enum): + CREATOR = "creator" + ADMIN = "administrator" + + +anon_callbacks = {} +anon_callback_messages = {} + + +def user_admin(permission: AdminPerms): + def wrapper(func): + @functools.wraps(func) + def awrapper(update: Update, context: CallbackContext, *args, **kwargs): + nonlocal permission + if update.effective_chat.type == "private": + return func(update, context, *args, **kwargs) + message = update.effective_message + is_anon = update.effective_message.sender_chat + + if is_anon: + callback_id = ( + f"anoncb/{message.chat.id}/{message.message_id}/{permission.value}" + ) + anon_callbacks[(message.chat.id, message.message_id)] = ( + (update, context), + func, + ) + anon_callback_messages[(message.chat.id, message.message_id)] = ( + message.reply_text( + "sᴇᴇᴍs ʟɪᴋᴇ ʏᴏᴜ'ʀᴇ ᴀɴᴏɴʏᴍᴏᴜs, ᴄʟɪᴄᴋ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ᴘʀᴏᴠᴇ ʏᴏᴜʀ ɪᴅᴇɴᴛɪᴛʏ", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴘʀᴏᴠᴇ ɪᴅᴇɴᴛɪᴛʏ", callback_data=callback_id + ) + ] + ] + ), + ) + ).message_id + # send message with callback f'anoncb{callback_id}' + else: + user_id = message.from_user.id + chat_id = message.chat.id + mem = context.bot.get_chat_member(chat_id=chat_id, user_id=user_id) + if ( + getattr(mem, permission.value) is True + or mem.status == "creator" + or user_id in DRAGONS + ): + return func(update, context, *args, **kwargs) + else: + return message.reply_text( + f"ʏᴏᴜ ʟᴀᴄᴋ ᴛʜᴇ ᴘᴇʀᴍɪssɪᴏɴ: `{permission.name}`", + parse_mode=ParseMode.MARKDOWN, + ) + + return awrapper + + return wrapper + + +@Exoncallback(pattern="anoncb") +def anon_callback_handler1(upd: Update, _: CallbackContext): + callback = upd.callback_query + perm = callback.data.split("/")[3] + chat_id = int(callback.data.split("/")[1]) + message_id = int(callback.data.split("/")[2]) + try: + mem = upd.effective_chat.get_member(user_id=callback.from_user.id) + except BaseException as e: + callback.answer(f"ᴇʀʀᴏʀ: {e}", show_alert=True) + return + if mem.status not in [ChatStatus.ADMIN.value, ChatStatus.CREATOR.value]: + callback.answer("ʏᴏᴜ'ʀᴇ ᴀʀᴇɴ'ᴛ ᴀᴅᴍɪɴ.") + dispatcher.bot.delete_message( + chat_id, anon_callback_messages.pop((chat_id, message_id), None) + ) + dispatcher.bot.send_message( + chat_id, "ʏᴏᴜ ʟᴀᴄᴋ ᴛʜᴇ ᴘᴇʀᴍɪssɪᴏɴs ʀᴇǫᴜɪʀᴇᴅ ғᴏʀ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ" + ) + elif ( + getattr(mem, perm) is True + or mem.status == "creator" + or mem.user.id in DEV_USERS + ): + cb = anon_callbacks.pop((chat_id, message_id), None) + if cb: + message_id = anon_callback_messages.pop((chat_id, message_id), None) + if message_id is not None: + dispatcher.bot.delete_message(chat_id, message_id) + return cb[1](cb[0][0], cb[0][1]) + else: + callback.answer("ᴛʜɪs ɪsɴ'ᴛ ғᴏʀ ʏᴏᴜ\nᴊᴀ ʟᴇᴠᴅᴇ ᴋᴀᴍ ᴋᴀʀ ᴀᴘɴᴀ") diff --git a/Exon/modules/helper_funcs/chat_status.py b/Exon/modules/helper_funcs/chat_status.py new file mode 100644 index 00000000..deed88e6 --- /dev/null +++ b/Exon/modules/helper_funcs/chat_status.py @@ -0,0 +1,489 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 functools import wraps +from threading import RLock +from time import perf_counter + +from cachetools import TTLCache +from telegram import Chat, ChatMember, ParseMode, Update +from telegram.ext import CallbackContext + +from Exon import ( + DEL_CMDS, + DEMONS, + DEV_USERS, + DRAGONS, + SUPPORT_CHAT, + TIGERS, + WOLVES, + dispatcher, +) + +# stores admemes in memory for 10 min. +ADMIN_CACHE = TTLCache(maxsize=512, ttl=60 * 10, timer=perf_counter) +THREAD_LOCK = RLock() + + +def is_whitelist_plus(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + return any(user_id in user for user in [WOLVES, TIGERS, DEMONS, DRAGONS, DEV_USERS]) + + +def is_support_plus(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + return user_id in DEMONS or user_id in DRAGONS or user_id in DEV_USERS + + +def is_sudo_plus(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + return user_id in DRAGONS or user_id in DEV_USERS + + +def is_stats_plus(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + return user_id in DEV_USERS + + +def is_user_admin(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + if ( + chat.type == "private" + or user_id in DRAGONS + or user_id in DEV_USERS + or chat.all_members_are_administrators + or user_id in {1452219013} + ): # Count telegram and Group Anonymous as admin + return True + if member: + return member.status in ("administrator", "creator") + + with THREAD_LOCK: + # try to fetch from cache first. + try: + return user_id in ADMIN_CACHE[chat.id] + except KeyError: + # keyerror happend means cache is deleted, + # so query bot api again and return user status + # while saving it in cache for future useage... + chat_admins = dispatcher.bot.getChatAdministrators(chat.id) + admin_list = [x.user.id for x in chat_admins] + ADMIN_CACHE[chat.id] = admin_list + + return user_id in admin_list + + +def is_bot_admin(chat: Chat, bot_id: int, bot_member: ChatMember = None) -> bool: + if chat.type == "private" or chat.all_members_are_administrators: + return True + + if not bot_member: + bot_member = chat.get_member(bot_id) + + return bot_member.status in ("administrator", "creator") + + +def can_delete(chat: Chat, bot_id: int) -> bool: + return chat.get_member(bot_id).can_delete_messages + + +def is_user_ban_protected(chat: Chat, user_id: int, member: ChatMember = None) -> bool: + if ( + chat.type == "private" + or user_id in DRAGONS + or user_id in DEV_USERS + or user_id in WOLVES + or user_id in TIGERS + ): # Count telegram and Group Anonymous as admin + return True + + if not member: + member = chat.get_member(user_id) + + return member.status in ("administrator", "creator") + + +def is_user_in_chat(chat: Chat, user_id: int) -> bool: + member = chat.get_member(user_id) + return member.status not in ("left", "kicked") + + +def dev_plus(func): + @wraps(func) + def is_dev_plus_func(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + + if user.id in DEV_USERS: + return func(update, context, *args, **kwargs) + if not user: + pass + elif DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + else: + update.effective_message.reply_text( + "ᴛʜɪs ɪs ᴀ ᴅᴇᴠᴇʟᴏᴘᴇʀ ʀᴇsᴛʀɪᴄᴛᴇᴅ ᴄᴏᴍᴍᴀɴᴅ." + "ʏᴏᴜ ᴅᴏ ɴᴏᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴs ᴛᴏ ʀᴜɴ ᴛʜɪs.", + ) + + return is_dev_plus_func + + +def sudo_plus(func): + @wraps(func) + def is_sudo_plus_func(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_sudo_plus(chat, user.id): + return func(update, context, *args, **kwargs) + if not user: + pass + elif DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + else: + update.effective_message.reply_text( + "ᴀᴛ ʟᴇᴀsᴛ ʙᴇ ᴀɴ ᴀᴅᴍɪɴ ᴛᴏ ᴜsᴇ ᴛʜᴇsᴇ ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs", + ) + + return is_sudo_plus_func + + +def stats_plus(func): + @wraps(func) + def is_stats_plus_func(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_stats_plus(chat, user.id): + return func(update, context, *args, **kwargs) + if not user: + pass + elif DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + else: + update.effective_message.reply_text( + "Exon sᴛᴀᴛs ɪs ᴊᴜsᴛ ғᴏʀ ᴅᴇᴠ ᴜsᴇʀ", + ) + + return is_stats_plus_func + + +def support_plus(func): + @wraps(func) + def is_support_plus_func(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_support_plus(chat, user.id): + return func(update, context, *args, **kwargs) + if DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + + return is_support_plus_func + + +def whitelist_plus(func): + @wraps(func) + def is_whitelist_plus_func( + update: Update, + context: CallbackContext, + *args, + **kwargs, + ): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_whitelist_plus(chat, user.id): + return func(update, context, *args, **kwargs) + update.effective_message.reply_text( + f"ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴀᴄᴄᴇss ᴛᴏ ᴜsᴇ ᴛʜɪs.\nᴠɪsɪᴛ @{SUPPORT_CHAT}", + ) + + return is_whitelist_plus_func + + +def user_admin(func): + @wraps(func) + def is_admin(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_user_admin(chat, user.id): + return func(update, context, *args, **kwargs) + if not user: + pass + elif DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + else: + update.effective_message.reply_text( + "ᴀᴛ ʟᴇᴀsᴛ ʙᴇ ᴀɴ ᴀᴅᴍɪɴ ᴛᴏ ᴜsᴇ ᴛʜᴇsᴇ ᴀʟʟ ᴄᴏᴍᴍᴀɴᴅs", + ) + + return is_admin + + +def user_admin_no_reply(func): + @wraps(func) + def is_not_admin_no_reply( + update: Update, + context: CallbackContext, + *args, + **kwargs, + ): + context.bot + user = update.effective_user + chat = update.effective_chat + + if user and is_user_admin(chat, user.id): + return func(update, context, *args, **kwargs) + if not user: + pass + elif DEL_CMDS and " " not in update.effective_message.text: + try: + update.effective_message.delete() + except: + pass + + return is_not_admin_no_reply + + +def user_not_admin(func): + @wraps(func) + def is_not_admin(update: Update, context: CallbackContext, *args, **kwargs): + message = update.effective_message + user = update.effective_user + # chat = update.effective_chat + + if message.is_automatic_forward: + return + if message.sender_chat and message.sender_chat.type != "channel": + return + elif user and not is_user_admin(update.message.chat, user.id): + return func(update, context, *args, **kwargs) + + elif not user: + pass + + return is_not_admin + + +def bot_admin(func): + @wraps(func) + def is_admin(update: Update, context: CallbackContext, *args, **kwargs): + bot = context.bot + chat = update.effective_chat + update_chat_title = chat.title + message_chat_title = update.effective_message.chat.title + + if update_chat_title == message_chat_title: + not_admin = "I'ᴍ ɴᴏᴛ ᴀᴅᴍɪɴ!" + else: + not_admin = f"I'ᴍ ɴᴏᴛ ᴀᴅᴍɪɴ ɪɴ <b>{update_chat_title}</b>! " + + if is_bot_admin(chat, bot.id): + return func(update, context, *args, **kwargs) + update.effective_message.reply_text(not_admin, parse_mode=ParseMode.HTML) + + return is_admin + + +def bot_can_delete(func): + @wraps(func) + def delete_rights(update: Update, context: CallbackContext, *args, **kwargs): + bot = context.bot + chat = update.effective_chat + update_chat_title = chat.title + message_chat_title = update.effective_message.chat.title + + if update_chat_title == message_chat_title: + cant_delete = "I ᴄᴀɴ'ᴛ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇs ʜᴇʀᴇ!\nMake sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴅᴇʟᴇᴛᴇ ᴏᴛʜᴇʀ ᴜsᴇᴅ's ᴍᴇssᴀɢᴇs." + else: + cant_delete = f"I ᴄᴀɴ'ᴛ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇs ɪɴ <b>{update_chat_title}</b>!\nᴍᴀᴋᴇ sᴜʀᴇ I'm ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴅᴇʟᴇᴛᴇ ᴏᴛʜᴇʀ ᴜsᴇᴅ ᴍᴇssᴀɢᴇs ᴛʜᴇʀᴇ." + + if can_delete(chat, bot.id): + return func(update, context, *args, **kwargs) + update.effective_message.reply_text(cant_delete, parse_mode=ParseMode.HTML) + + return delete_rights + + +def can_pin(func): + @wraps(func) + def pin_rights(update: Update, context: CallbackContext, *args, **kwargs): + bot = context.bot + chat = update.effective_chat + update_chat_title = chat.title + message_chat_title = update.effective_message.chat.title + + if update_chat_title == message_chat_title: + cant_pin = ( + "I ᴄᴀɴ'ᴛ ᴘɪɴ ᴍᴇssᴀɢᴇs ʜᴇʀᴇ!\nMake sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴘɪɴ ᴍᴇssᴀɢᴇs." + ) + else: + cant_pin = f"I ᴄᴀɴ'ᴛ ᴘɪɴ ᴍᴇssᴀɢᴇs in <b>{update_chat_title}</b>!\nᴍᴀᴋᴇ sure I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴘɪɴ ᴍᴇssᴀɢᴇs ᴛʜᴇʀᴇ." + + if chat.get_member(bot.id).can_pin_messages: + return func(update, context, *args, **kwargs) + update.effective_message.reply_text(cant_pin, parse_mode=ParseMode.HTML) + + return pin_rights + + +def can_promote(func): + @wraps(func) + def promote_rights(update: Update, context: CallbackContext, *args, **kwargs): + bot = context.bot + chat = update.effective_chat + update_chat_title = chat.title + message_chat_title = update.effective_message.chat.title + + if update_chat_title == message_chat_title: + cant_promote = "I can't ᴘʀᴏᴍᴏᴛᴇ/ᴅᴇᴍᴏᴛᴇ ᴘᴇᴏᴘʟᴇ ʜᴇʀᴇ!\nMake sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ and can appoint new admins." + else: + cant_promote = ( + f"I ᴄᴀɴ'ᴛ ᴘʀᴏᴍᴏᴛᴇ/ᴅᴇᴍᴏᴛᴇ ᴘᴇᴏᴘʟᴇ ɪɴ <b>{update_chat_title}</b>!\n" + f"ᴍᴀᴋᴇ sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴛʜᴇʀᴇ ᴀɴᴅ ʜᴀᴠᴇ ᴛʜᴇ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ᴀᴘᴘᴏɪɴᴛ ɴᴇᴡ ᴀᴅᴍɪɴs." + ) + + if chat.get_member(bot.id).can_promote_members: + return func(update, context, *args, **kwargs) + update.effective_message.reply_text(cant_promote, parse_mode=ParseMode.HTML) + + return promote_rights + + +def can_restrict(func): + @wraps(func) + def restrict_rights(update: Update, context: CallbackContext, *args, **kwargs): + bot = context.bot + chat = update.effective_chat + update_chat_title = chat.title + message_chat_title = update.effective_message.chat.title + + if update_chat_title == message_chat_title: + cant_restrict = "I ᴄᴀɴ'ᴛ ʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ʜᴇʀᴇ!\nᴍᴀᴋᴇ sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ʀᴇsᴛʀɪᴄᴛ ᴜsᴇʀs." + else: + cant_restrict = f"ɪ ᴄᴀɴ'ᴛ ʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ɪɴ <b>{update_chat_title}</b>!\nᴍᴀᴋᴇ sᴜʀᴇ ɪ'ᴍ ᴀᴅᴍɪɴ ᴛʜᴇʀᴇ ᴀɴᴅ ᴄᴀɴ ʀᴇsᴛʀɪᴄᴛ ᴜsᴇʀs." + + if chat.get_member(bot.id).can_restrict_members: + return func(update, context, *args, **kwargs) + update.effective_message.reply_text( + cant_restrict, + parse_mode=ParseMode.HTML, + ) + + return restrict_rights + + +def user_can_promote(func): + @wraps(func) + def user_is_promoter(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user + if not user: + return + user = user.id + member = update.effective_chat.get_member(user) + no_rights = "ʏᴏᴜ ᴅᴏ ɴᴏᴛ ʜᴀᴠᴇ 'ᴀᴅᴅ ᴀᴅᴍɪɴ ʀɪɢʜᴛs." + if ( + not (member.can_promote_members or member.status == "creator") + and user not in DRAGONS + and user not in [1452219013] + ): + if not update.callback_query: + update.effective_message.reply_text(no_rights) + else: + update.callback_query.answer(no_rights, show_alert=True) + return "" + return func(update, context, *args, **kwargs) + + return user_is_promoter + + +def user_can_ban(func): + @wraps(func) + def user_is_banhammer(update: Update, context: CallbackContext, *args, **kwargs): + context.bot + user = update.effective_user.id + member = update.effective_chat.get_member(user) + if ( + not member.can_restrict_members + and member.status != "creator" + and user not in DRAGONS + and user not in [1452219013] + ): + update.effective_message.reply_text( + "sᴏʀʀʏ sᴏɴ, ʙᴜᴛ ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴡᴏʀᴛʜʏ ᴛᴏ ᴡɪᴇʟᴅ ᴛʜᴇ ʙᴀɴʜᴀᴍᴍᴇʀ.", + ) + return "" + return func(update, context, *args, **kwargs) + + return user_is_banhammer + + +def connection_status(func): + @wraps(func) + def connected_status(update: Update, context: CallbackContext, *args, **kwargs): + conn = connected( + context.bot, + update, + update.effective_chat, + update.effective_user.id, + need_admin=False, + ) + + if conn: + chat = dispatcher.bot.getChat(conn) + update.__setattr__("_effective_chat", chat) + elif update.effective_message.chat.type == "private": + update.effective_message.reply_text( + "sᴇɴᴅ /connect ɪɴ ᴀ ɢʀᴏᴜᴘ ᴛʜᴀᴛ ʏᴏᴜ ᴀɴᴅ I ʜᴀᴠᴇ ɪɴ ᴄᴏᴍᴍᴏɴ ғɪʀsᴛ.", + ) + return connected_status + + return func(update, context, *args, **kwargs) + + return connected_status + + +# Workaround for circular import with connection.py +from Exon.modules import connection + +connected = connection.connected diff --git a/Exon/modules/helper_funcs/decorators.py b/Exon/modules/helper_funcs/decorators.py new file mode 100644 index 00000000..6f9cf76b --- /dev/null +++ b/Exon/modules/helper_funcs/decorators.py @@ -0,0 +1,202 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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, Optional, Union + +from telegram.ext import ( + CallbackQueryHandler, + CommandHandler, + InlineQueryHandler, + MessageHandler, +) +from telegram.ext.filters import MessageFilter + +from Exon import LOGGER +from Exon import dispatcher as d +from Exon.modules.disable import DisableAbleCommandHandler, DisableAbleMessageHandler + + +class ExonHandler: + def __init__(self, d): + self._dispatcher = d + + def command( + self, + command: str, + filters: Optional[MessageFilter] = None, + admin_ok: bool = False, + pass_args: bool = False, + pass_chat_data: bool = False, + run_async: bool = True, + can_disable: bool = True, + group: Optional[Union[int, str]] = 40, + ): + def _command(func): + try: + if can_disable: + self._dispatcher.add_handler( + DisableAbleCommandHandler( + command, + func, + filters=filters, + run_async=run_async, + pass_args=pass_args, + admin_ok=admin_ok, + ), + group, + ) + else: + self._dispatcher.add_handler( + CommandHandler( + command, + func, + filters=filters, + run_async=run_async, + pass_args=pass_args, + ), + group, + ) + LOGGER.debug( + f"[ᴇxᴏɴᴄᴍᴅ] ʟᴏᴀᴅᴇᴅ ʜᴀɴᴅʟᴇʀ {command} ғᴏʀ ғᴜɴᴄᴛɪᴏɴ {func.__name__} ɪɴ ɢʀᴏᴜᴘ {group}" + ) + except TypeError: + if can_disable: + self._dispatcher.add_handler( + DisableAbleCommandHandler( + command, + func, + filters=filters, + run_async=run_async, + pass_args=pass_args, + admin_ok=admin_ok, + pass_chat_data=pass_chat_data, + ) + ) + else: + self._dispatcher.add_handler( + CommandHandler( + command, + func, + filters=filters, + run_async=run_async, + pass_args=pass_args, + pass_chat_data=pass_chat_data, + ) + ) + LOGGER.debug( + f"[ExonCMD] Loaded handler {command} for function {func.__name__}" + ) + + return func + + return _command + + def message( + self, + pattern: Optional[str] = None, + can_disable: bool = True, + run_async: bool = True, + group: Optional[Union[int, str]] = 60, + friendly=None, + ): + def _message(func): + try: + if can_disable: + self._dispatcher.add_handler( + DisableAbleMessageHandler( + pattern, func, friendly=friendly, run_async=run_async + ), + group, + ) + else: + self._dispatcher.add_handler( + MessageHandler(pattern, func, run_async=run_async), group + ) + LOGGER.debug( + f"[ᴇxᴏɴᴍsɢ] Loaded filter pattern {pattern} for function {func.__name__} in group {group}" + ) + except TypeError: + if can_disable: + self._dispatcher.add_handler( + DisableAbleMessageHandler( + pattern, func, friendly=friendly, run_async=run_async + ) + ) + else: + self._dispatcher.add_handler( + MessageHandler(pattern, func, run_async=run_async) + ) + LOGGER.debug( + f"[ᴇxᴏɴᴍsɢ] ʟᴏᴀᴅᴇᴅ ғɪʟᴛᴇʀ ᴘᴀᴛᴛᴇʀɴ {pattern} ғᴏʀ ғᴜɴᴄᴛɪᴏɴ {func.__name__}" + ) + + return func + + return _message + + def callbackquery(self, pattern: str = None, run_async: bool = True): + def _callbackquery(func): + self._dispatcher.add_handler( + CallbackQueryHandler( + pattern=pattern, callback=func, run_async=run_async + ) + ) + LOGGER.debug( + f"[ᴇxᴏɴᴄᴀʟʟʙᴀᴄᴋ] ʟᴏᴀᴅᴇᴅ ᴄᴀʟʟʙᴀᴄᴋǫᴜᴇʀʏ ʜᴀɴᴅʟᴇʀ ᴡɪᴛʜ ᴘᴀᴛᴛᴇʀɴ {pattern} ғᴏʀ ғᴜɴᴄᴛɪᴏɴ {func.__name__}" + ) + return func + + return _callbackquery + + def inlinequery( + self, + pattern: Optional[str] = None, + run_async: bool = True, + pass_user_data: bool = True, + pass_chat_data: bool = True, + chat_types: List[str] = None, + ): + def _inlinequery(func): + self._dispatcher.add_handler( + InlineQueryHandler( + pattern=pattern, + callback=func, + run_async=run_async, + pass_user_data=pass_user_data, + pass_chat_data=pass_chat_data, + chat_types=chat_types, + ) + ) + LOGGER.debug( + f"[ᴇxᴏɴɪɴʟɪɴᴇ] ʟᴏᴀᴅᴇᴅ ɪɴʟɪɴᴇǫᴜᴇʀʏ ʜᴀɴᴅʟᴇʀ ᴡɪᴛʜ ᴘᴀᴛᴛᴇʀɴ {pattern} ғᴏʀ ғᴜɴᴄᴛɪᴏɴ {func.__name__} | ᴘᴀssᴇs ᴜsᴇʀ ᴅᴀᴛᴀ: {pass_user_data} | ᴘᴀssᴇs ᴄʜᴀᴛ ᴅᴀᴛᴀ: {pass_chat_data} | ᴄʜᴀᴛ ᴛʏᴘᴇs: {chat_types}" + ) + return func + + return _inlinequery + + +Exoncmd = ExonHandler(d).command +Exonmsg = ExonHandler(d).message +Exoncallback = ExonHandler(d).callbackquery +Exoninline = ExonHandler(d).inlinequery diff --git a/Exon/modules/helper_funcs/extraction.py b/Exon/modules/helper_funcs/extraction.py new file mode 100644 index 00000000..22f97f0b --- /dev/null +++ b/Exon/modules/helper_funcs/extraction.py @@ -0,0 +1,195 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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, Optional + +from telegram import Message, MessageEntity +from telegram.error import BadRequest + +from Exon import LOGGER +from Exon.modules.users import get_user_id + + +def id_from_reply(message): + prev_message = message.reply_to_message + if not prev_message: + return None, None + user_id = ( + prev_message.sender_chat.id + if prev_message.sender_chat + else prev_message.from_user.id + ) + res = message.text.split(None, 1) + if len(res) < 2: + return user_id, "" + return user_id, res[1] + + +def extract_user(message: Message, args: List[str]) -> Optional[int]: + return extract_user_and_text(message, args)[0] + + +def extract_user_and_text( + message: Message, + args: List[str], +) -> (Optional[int], Optional[str]): + prev_message = message.reply_to_message + split_text = message.text.split(None, 1) + + if len(split_text) < 2: + return id_from_reply(message) # only option possible + + text_to_parse = split_text[1] + + text = "" + + entities = list(message.parse_entities([MessageEntity.TEXT_MENTION])) + ent = entities[0] if entities else None + # if entity offset matches (command end/text start) then all good + if entities and ent and ent.offset == len(message.text) - len(text_to_parse): + ent = entities[0] + user_id = ent.user.id + text = message.text[ent.offset + ent.length :] + + elif len(args) >= 1 and args[0][0] == "@": + user = args[0] + user_id = get_user_id(user) + if not user_id: + message.reply_text( + "ɴᴏ ɪᴅᴇᴀ ᴡʜᴏ ᴛʜɪs ᴜsᴇʀ ɪs. ʏᴏᴜ'ʟʟ ʙᴇ ᴀʙʟᴇ ᴛᴏ ɪɴᴛᴇʀᴀᴄᴛ ᴡɪᴛʜ ᴛʜᴇᴍ ɪғ " + "ʏᴏᴜ ʀᴇᴘʟʏ ᴛᴏ ᴛʜᴀᴛ ᴘᴇʀsᴏɴ's ᴍᴇssᴀɢᴇ ɪɴsᴛᴇᴀᴅ, ᴏʀ ғᴏʀᴡᴀʀᴅ ᴏɴᴇ ᴏғ ᴛʜᴀᴛ ᴜsᴇʀ ᴍᴇssᴀɢᴇs.", + ) + return None, None + res = message.text.split(None, 2) + if len(res) >= 3: + text = res[2] + + elif len(args) >= 1 and args[0].isdigit(): + user_id = int(args[0]) + res = message.text.split(None, 2) + if len(res) >= 3: + text = res[2] + + elif prev_message: + user_id, text = id_from_reply(message) + + else: + return None, None + + try: + message.bot.get_chat(user_id) + except BadRequest as excp: + if excp.message in ("User_id_invalid", "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ"): + message.reply_text( + "I ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʜᴀᴠᴇ ɪɴᴛᴇʀᴀᴄᴛᴇᴅ ᴡɪᴛʜ ᴛʜɪs ᴜsᴇʀ ʙᴇғᴏʀᴇ - ᴘʟᴇᴀsᴇ ғᴏʀᴡᴀʀᴅ ᴀ ᴍᴇssᴀɢᴇ ғʀᴏᴍ " + "ᴛʜᴇᴍ ᴛᴏ ɢɪᴠᴇ ᴍᴇ ᴄᴏɴᴛʀᴏʟ! (ʟɪᴋᴇ ᴀ ᴠᴏᴏᴅᴏᴏ ᴅᴏʟʟ, I ɴᴇᴇᴅ ᴀ ᴘɪᴇᴄᴇ ᴏғ ᴛʜᴇᴍ ᴛᴏ ʙᴇ ᴀʙʟᴇ " + "ᴛᴏ ᴇxᴇᴄᴜᴛᴇ ᴄᴇʀᴛᴀɪɴ ᴄᴏᴍᴍᴀɴᴅs...)", + ) + else: + LOGGER.exception("ᴇxᴄᴇᴘᴛɪᴏɴ %s ᴏɴ ᴜsᴇʀ %s", excp.message, user_id) + + return None, None + + return user_id, text + + +def extract_text(message) -> str: + return ( + message.text + or message.caption + or (message.sticker.emoji if message.sticker else None) + ) + + +def extract_unt_fedban( + message: Message, + args: List[str], +) -> (Optional[int], Optional[str]): + prev_message = message.reply_to_message + split_text = message.text.split(None, 1) + + if len(split_text) < 2: + return id_from_reply(message) # only option possible + + text_to_parse = split_text[1] + + text = "" + + entities = list(message.parse_entities([MessageEntity.TEXT_MENTION])) + ent = entities[0] if entities else None + # if entity offset matches (command end/text start) then all good + if entities and ent and ent.offset == len(message.text) - len(text_to_parse): + ent = entities[0] + user_id = ent.user.id + text = message.text[ent.offset + ent.length :] + + elif len(args) >= 1 and args[0][0] == "@": + user = args[0] + user_id = get_user_id(user) + if not user_id and not isinstance(user_id, int): + message.reply_text( + "I ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴛʜᴀᴛ ᴜsᴇʀ ɪɴ ᴍʏ ᴅʙ. " + "ʏᴏᴜ'ʟʟ be ᴀʙʟᴇ ᴛᴏ ɪɴᴛᴇʀᴀᴄᴛ ᴡɪᴛʜ ᴛʜᴇᴍ ɪғ ʏᴏᴜ ʀᴇᴘʟʏ ᴛᴏ ᴛʜᴀᴛ ᴘᴇʀsᴏɴ's ᴍᴇssᴀɢᴇ ɪɴsᴛᴇᴀᴅ, ᴏʀ ғᴏʀᴡᴀʀᴅ ᴏɴᴇ ᴏғ ᴛʜᴀᴛ ᴜsᴇʀ's ᴍᴇssᴀɢᴇs.", + ) + return None, None + res = message.text.split(None, 2) + if len(res) >= 3: + text = res[2] + + elif len(args) >= 1 and args[0].isdigit(): + user_id = int(args[0]) + res = message.text.split(None, 2) + if len(res) >= 3: + text = res[2] + + elif prev_message: + user_id, text = id_from_reply(message) + + else: + return None, None + + try: + message.bot.get_chat(user_id) + except BadRequest as excp: + if excp.message in ("User_id_invalid", "Chat not found") and not isinstance( + user_id, + int, + ): + message.reply_text( + "I ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʜᴀᴠᴇ ɪɴᴛᴇʀᴀᴄᴛᴇᴅ ᴡɪᴛʜ ᴛʜɪs ᴜsᴇʀ ʙᴇғᴏʀᴇ " + "ᴘʟᴇᴀsᴇ ғᴏʀᴡᴀʀᴅ ᴀ ᴍᴇssᴀɢᴇ ғʀᴏᴍ ᴛʜᴇᴍ ᴛᴏ ɢɪᴠᴇ ᴍᴇ ᴄᴏɴᴛʀᴏʟ! " + "(ʟɪᴋᴇ ᴀ ᴠᴏᴏᴅᴏᴏ ᴅᴏʟʟ, ɪ ɴᴇᴇᴅ ᴀ ᴘɪᴇᴄᴇ of ᴛʜᴇᴍ ᴛᴏ ʙᴇ ᴀʙʟᴇ ᴛᴏ ᴇxᴇᴄᴜᴛᴇ ᴄᴇʀᴛᴀɪɴ ᴄᴏᴍᴍᴀɴᴅs...)", + ) + return None, None + if excp.message != "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ": + LOGGER.exception("ᴇxᴄᴇᴘᴛɪᴏɴ %s ᴏɴ ᴜsᴇʀ %s", excp.message, user_id) + return None, None + if not isinstance(user_id, int): + return None, None + + return user_id, text + + +def extract_user_fban(message: Message, args: List[str]) -> Optional[int]: + return extract_unt_fedban(message, args)[0] diff --git a/Exon/modules/helper_funcs/filters.py b/Exon/modules/helper_funcs/filters.py new file mode 100644 index 00000000..08b4d7df --- /dev/null +++ b/Exon/modules/helper_funcs/filters.py @@ -0,0 +1,72 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 telegram import Message +from telegram.ext import MessageFilter + +from Exon import DEMONS, DEV_USERS, DRAGONS + + +class CustomFilters: + class _Supporters(MessageFilter): + def filter(self, message: Message): + return bool(message.from_user and message.from_user.id in DEMONS) + + support_filter = _Supporters() + + class _Sudoers(MessageFilter): + def filter(self, message: Message): + return bool(message.from_user and message.from_user.id in DRAGONS) + + sudo_filter = _Sudoers() + + class _Developers(MessageFilter): + def filter(self, message: Message): + return bool(message.from_user and message.from_user.id in DEV_USERS) + + dev_filter = _Developers() + + class _MimeType(MessageFilter): + def __init__(self, mimetype): + self.mime_type = mimetype + self.name = "CustomFilters.mime_type({})".format(self.mime_type) + + def filter(self, message: Message): + return bool( + message.document and message.document.mime_type == self.mime_type, + ) + + mime_type = _MimeType + + class _HasText(MessageFilter): + def filter(self, message: Message): + return bool( + message.text + or message.sticker + or message.photo + or message.document + or message.video, + ) + + has_text = _HasText() diff --git a/Exon/modules/helper_funcs/git_api.py b/Exon/modules/helper_funcs/git_api.py new file mode 100644 index 00000000..e544fc21 --- /dev/null +++ b/Exon/modules/helper_funcs/git_api.py @@ -0,0 +1,114 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 json +import urllib.request as url + +VERSION = "1.0.2" +APIURL = "http://api.github.com/repos/" + + +def vercheck() -> str: + return str(VERSION) + + +# Repo-wise stuff + + +def getData(repoURL): + try: + with url.urlopen(APIURL + repoURL + "/releases") as data_raw: + return json.loads(data_raw.read().decode()) + except: + return None + + +def getReleaseData(repoData, index): + if index < len(repoData): + return repoData[index] + return None + + +# Release-wise stuff + + +def getAuthor(releaseData): + if releaseData is None: + return None + return releaseData["author"]["login"] + + +def getAuthorUrl(releaseData): + if releaseData is None: + return None + return releaseData["author"]["html_url"] + + +def getReleaseName(releaseData): + if releaseData is None: + return None + return releaseData["name"] + + +def getReleaseDate(releaseData): + if releaseData is None: + return None + return releaseData["published_at"] + + +def getAssetsSize(releaseData): + if releaseData is None: + return None + return len(releaseData["assets"]) + + +def getAssets(releaseData): + if releaseData is None: + return None + return releaseData["assets"] + + +def getBody(releaseData): # changelog stuff + if releaseData is None: + return None + return releaseData["body"] + + +# Asset-wise stuff + + +def getReleaseFileName(asset): + return asset["name"] + + +def getReleaseFileURL(asset): + return asset["browser_download_url"] + + +def getDownloadCount(asset): + return asset["download_count"] + + +def getSize(asset): + return asset["size"] diff --git a/Exon/modules/helper_funcs/handlers.py b/Exon/modules/helper_funcs/handlers.py new file mode 100644 index 00000000..f3f8abdc --- /dev/null +++ b/Exon/modules/helper_funcs/handlers.py @@ -0,0 +1,157 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 pyrate_limiter import ( + BucketFullException, + Duration, + Limiter, + MemoryListBucket, + RequestRate, +) +from telegram import Update +from telegram.ext import CommandHandler, Filters, MessageHandler, RegexHandler + +import Exon.modules.sql.blacklistusers_sql as sql +from Exon import ALLOW_EXCL, DEMONS, DEV_USERS, DRAGONS, TIGERS, WOLVES + +CMD_STARTERS = ("/", "!", "?", "*") if ALLOW_EXCL else ("/",) + + +class AntiSpam: + def __init__(self): + self.whitelist = ( + (DEV_USERS or []) + + (DRAGONS or []) + + (WOLVES or []) + + (DEMONS or []) + + (TIGERS or []) + ) + # Values are HIGHLY experimental, its recommended you pay attention to our commits as we will be adjusting the values over time with what suits best. + Duration.CUSTOM = 15 # Custom duration, 15 seconds + self.sec_limit = RequestRate(6, Duration.CUSTOM) # 6 / Per 15 Seconds + self.min_limit = RequestRate(20, Duration.MINUTE) # 20 / Per minute + self.hour_limit = RequestRate(100, Duration.HOUR) # 100 / Per hour + self.daily_limit = RequestRate(1000, Duration.DAY) # 1000 / Per day + self.limiter = Limiter( + self.sec_limit, + self.min_limit, + self.hour_limit, + self.daily_limit, + bucket_class=MemoryListBucket, + ) + + def check_user(self, user): + """ + Return True if user is to be ignored else False + """ + if user in self.whitelist: + return False + try: + self.limiter.try_acquire(user) + return False + except BucketFullException: + return True + + +SpamChecker = AntiSpam() +MessageHandlerChecker = AntiSpam() + + +class CustomCommandHandler(CommandHandler): + def __init__(self, command, callback, admin_ok=False, allow_edit=False, **kwargs): + super().__init__(command, callback, **kwargs) + + if allow_edit is False: + self.filters &= ~( + Filters.update.edited_message | Filters.update.edited_channel_post + ) + + def check_update(self, update): + if not isinstance(update, Update) or not update.effective_message: + return + message = update.effective_message + + try: + user_id = update.effective_user.id + except: + user_id = None + + if user_id and sql.is_user_blacklisted(user_id): + return False + + if message.text and len(message.text) > 1: + fst_word = message.text.split(None, 1)[0] + if len(fst_word) > 1 and any( + fst_word.startswith(start) for start in CMD_STARTERS + ): + + args = message.text.split()[1:] + command = fst_word[1:].split("@") + command.append(message.bot.username) + if user_id == 1087968824: + user_id = update.effective_chat.id + if not ( + command[0].lower() in self.command + and command[1].lower() == message.bot.username.lower() + ): + return None + if SpamChecker.check_user(user_id): + return None + filter_result = self.filters(update) + if filter_result: + return args, filter_result + return False + + def handle_update(self, update, dispatcher, check_result, context=None): + if context: + self.collect_additional_context(context, update, dispatcher, check_result) + return self.callback(update, context) + optional_args = self.collect_optional_args(dispatcher, update, check_result) + return self.callback(dispatcher.bot, update, **optional_args) + + def collect_additional_context(self, context, update, dispatcher, check_result): + if isinstance(check_result, bool): + context.args = update.effective_message.text.split()[1:] + else: + context.args = check_result[0] + if isinstance(check_result[1], dict): + context.update(check_result[1]) + + +class CustomRegexHandler(RegexHandler): + def __init__(self, pattern, callback, friendly="", **kwargs): + super().__init__(pattern, callback, **kwargs) + + +class CustomMessageHandler(MessageHandler): + def __init__(self, filters, callback, friendly="", allow_edit=False, **kwargs): + super().__init__(filters, callback, **kwargs) + if allow_edit is False: + self.filters &= ~( + Filters.update.edited_message | Filters.update.edited_channel_post + ) + + def check_update(self, update): + if isinstance(update, Update) and update.effective_message: + return self.filters(update) diff --git a/Exon/modules/helper_funcs/misc.py b/Exon/modules/helper_funcs/misc.py new file mode 100644 index 00000000..64575ceb --- /dev/null +++ b/Exon/modules/helper_funcs/misc.py @@ -0,0 +1,201 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 math import ceil +from typing import Dict, List + +from telegram import ( + MAX_MESSAGE_LENGTH, + Bot, + InlineKeyboardButton, + InlineKeyboardMarkup, + InlineQueryResultArticle, + InputTextMessageContent, + ParseMode, +) +from telegram.error import TelegramError + +from Exon import NO_LOAD + + +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 split_message(msg: str) -> List[str]: + if len(msg) < MAX_MESSAGE_LENGTH: + return [msg] + + lines = msg.splitlines(True) + small_msg = "" + result = [] + for line in lines: + if len(small_msg) + len(line) < MAX_MESSAGE_LENGTH: + small_msg += line + else: + result.append(small_msg) + small_msg = line + # Else statement at the end of the for loop, so append the leftover string. + result.append(small_msg) + + return result + + +def paginate_modules(page_n: int, module_dict: Dict, prefix, chat=None) -> List: + if not chat: + modules = sorted( + [ + EqInlineKeyboardButton( + x.__mod_name__, + callback_data="{}_module({})".format( + prefix, x.__mod_name__.lower() + ), + ) + for x in module_dict.values() + ] + ) + else: + modules = sorted( + [ + EqInlineKeyboardButton( + x.__mod_name__, + callback_data="{}_module({},{})".format( + prefix, chat, x.__mod_name__.lower() + ), + ) + for x in module_dict.values() + ] + ) + + pairs = [modules[i * 3 : (i + 1) * 3] for i in range((len(modules) + 3 - 1) // 3)] + + round_num = len(modules) / 3 + calc = len(modules) - round(round_num) + if calc in [1, 2]: + pairs.append((modules[-1],)) + + max_num_pages = ceil(len(pairs) / 8) + modulo_page = page_n % max_num_pages + + # can only have a certain amount of buttons side by side + if len(pairs) > 3: + pairs = pairs[modulo_page * 8 : 8 * (modulo_page + 1)] + [ + ( + EqInlineKeyboardButton( + "⬅️", callback_data="{}_prev({})".format(prefix, modulo_page) + ), + EqInlineKeyboardButton("• ʙᴀᴄᴋ •", callback_data="Exon_back"), + EqInlineKeyboardButton( + "➡️", callback_data="{}_next({})".format(prefix, modulo_page) + ), + ) + ] + + else: + pairs += [[EqInlineKeyboardButton("• ʙᴀᴄᴋ •", callback_data="Exon_back")]] + + return pairs + + +def article( + title: str = "", + description: str = "", + message_text: str = "", + thumb_url: str = None, + reply_markup: InlineKeyboardMarkup = None, + disable_web_page_preview: bool = False, +) -> InlineQueryResultArticle: + + return InlineQueryResultArticle( + id=uuid4(), + title=title, + description=description, + thumb_url=thumb_url, + input_message_content=InputTextMessageContent( + message_text=message_text, + disable_web_page_preview=disable_web_page_preview, + ), + reply_markup=reply_markup, + ) + + +def send_to_list( + bot: Bot, send_to: list, message: str, markdown=False, html=False +) -> None: + if html and markdown: + raise Exception("ᴄᴀɴ ᴏɴʟʏ sᴇɴᴅ ᴡɪᴛʜ ᴇɪᴛʜᴇʀ ᴍᴀʀᴋᴅᴏᴡɴ ᴏʀ ʜᴛᴍʟ!") + for user_id in set(send_to): + try: + if markdown: + bot.send_message(user_id, message, parse_mode=ParseMode.MARKDOWN) + elif html: + bot.send_message(user_id, message, parse_mode=ParseMode.HTML) + else: + bot.send_message(user_id, message) + except TelegramError: + pass # ignore users who fail + + +def build_keyboard(buttons): + keyb = [] + for btn in buttons: + if btn.same_line and keyb: + keyb[-1].append(InlineKeyboardButton(btn.name, url=btn.url)) + else: + keyb.append([InlineKeyboardButton(btn.name, url=btn.url)]) + + return keyb + + +def revert_buttons(buttons): + return "".join( + "\n[{}](buttonurl://{}:same)".format(btn.name, btn.url) + if btn.same_line + else "\n[{}](buttonurl://{})".format(btn.name, btn.url) + for btn in buttons + ) + + +def build_keyboard_parser(bot, chat_id, buttons): + keyb = [] + for btn in buttons: + if btn.url == "{rules}": + btn.url = "http://t.me/{}?start={}".format(bot.username, chat_id) + if btn.same_line and keyb: + keyb[-1].append(InlineKeyboardButton(btn.name, url=btn.url)) + else: + keyb.append([InlineKeyboardButton(btn.name, url=btn.url)]) + + return keyb + + +def is_module_loaded(name): + return name not in NO_LOAD diff --git a/Exon/modules/helper_funcs/msg_types.py b/Exon/modules/helper_funcs/msg_types.py new file mode 100644 index 00000000..b982a01a --- /dev/null +++ b/Exon/modules/helper_funcs/msg_types.py @@ -0,0 +1,235 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 enum import IntEnum, unique + +from telegram import Message + +from Exon.modules.helper_funcs.string_handling import button_markdown_parser + + +@unique +class Types(IntEnum): + TEXT = 0 + BUTTON_TEXT = 1 + STICKER = 2 + DOCUMENT = 3 + PHOTO = 4 + AUDIO = 5 + VOICE = 6 + VIDEO = 7 + + +def get_note_type(msg: Message): + data_type = None + content = None + text = "" + raw_text = msg.text or msg.caption + args = raw_text.split(None, 2) # use python's maxsplit to separate cmd and args + note_name = args[1] + + buttons = [] + # determine what the contents of the filter are - text, image, sticker, etc + if len(args) >= 3: + offset = len(args[2]) - len( + raw_text, + ) # set correct offset relative to command + notename + text, buttons = button_markdown_parser( + args[2], + entities=msg.parse_entities() or msg.parse_caption_entities(), + offset=offset, + ) + data_type = Types.BUTTON_TEXT if buttons else Types.TEXT + elif msg.reply_to_message: + entities = msg.reply_to_message.parse_entities() + msgtext = msg.reply_to_message.text or msg.reply_to_message.caption + if len(args) >= 2 and msg.reply_to_message.text: # not caption, text + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.BUTTON_TEXT if buttons else Types.TEXT + elif msg.reply_to_message.sticker: + content = msg.reply_to_message.sticker.file_id + data_type = Types.STICKER + + elif msg.reply_to_message.document: + content = msg.reply_to_message.document.file_id + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.DOCUMENT + + elif msg.reply_to_message.photo: + content = msg.reply_to_message.photo[-1].file_id # last elem = best quality + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.PHOTO + + elif msg.reply_to_message.audio: + content = msg.reply_to_message.audio.file_id + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.AUDIO + + elif msg.reply_to_message.voice: + content = msg.reply_to_message.voice.file_id + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.VOICE + + elif msg.reply_to_message.video: + content = msg.reply_to_message.video.file_id + text, buttons = button_markdown_parser(msgtext, entities=entities) + data_type = Types.VIDEO + + return note_name, text, data_type, content, buttons + + +# note: add own args? +def get_welcome_type(msg: Message): + data_type = None + content = None + text = "" + + try: + if msg.reply_to_message: + args = msg.reply_to_message.text or msg.reply_to_message.caption + else: + args = msg.text.split( + None, + 1, + ) # use python's maxsplit to separate cmd and args + except AttributeError: + args = False + + if msg.reply_to_message: + if msg.reply_to_message.sticker: + content = msg.reply_to_message.sticker.file_id + text = None + data_type = Types.STICKER + + elif msg.reply_to_message.document: + content = msg.reply_to_message.document.file_id + text = msg.reply_to_message.caption + data_type = Types.DOCUMENT + + elif msg.reply_to_message.photo: + content = msg.reply_to_message.photo[-1].file_id # last elem = best quality + text = msg.reply_to_message.caption + data_type = Types.PHOTO + + elif msg.reply_to_message.audio: + content = msg.reply_to_message.audio.file_id + text = msg.reply_to_message.caption + data_type = Types.AUDIO + + elif msg.reply_to_message.voice: + content = msg.reply_to_message.voice.file_id + text = msg.reply_to_message.caption + data_type = Types.VOICE + + elif msg.reply_to_message.video: + content = msg.reply_to_message.video.file_id + text = msg.reply_to_message.caption + data_type = Types.VIDEO + + elif msg.reply_to_message.video_note: + content = msg.reply_to_message.video_note.file_id + text = None + data_type = Types.VIDEO_NOTE + + buttons = [] + # determine what the contents of the filter are - text, image, sticker, etc + if args: + if msg.reply_to_message: + argumen = msg.reply_to_message.caption or "" + offset = 0 # offset is no need since target was in reply + entities = msg.reply_to_message.parse_entities() + else: + argumen = args[1] + offset = len(argumen) - len( + msg.text, + ) # set correct offset relative to command + notename + entities = msg.parse_entities() + text, buttons = button_markdown_parser( + argumen, + entities=entities, + offset=offset, + ) + + if not data_type and text: + data_type = Types.BUTTON_TEXT if buttons else Types.TEXT + return text, data_type, content, buttons + + +def get_filter_type(msg: Message): + + if not msg.reply_to_message and msg.text and len(msg.text.split()) >= 3: + content = None + text = msg.text.split(None, 2)[2] + data_type = Types.TEXT + + elif ( + msg.reply_to_message + and msg.reply_to_message.text + and len(msg.text.split()) >= 2 + ): + content = None + text = msg.reply_to_message.text + data_type = Types.TEXT + + elif msg.reply_to_message and msg.reply_to_message.sticker: + content = msg.reply_to_message.sticker.file_id + text = None + data_type = Types.STICKER + + elif msg.reply_to_message and msg.reply_to_message.document: + content = msg.reply_to_message.document.file_id + text = msg.reply_to_message.caption + data_type = Types.DOCUMENT + + elif msg.reply_to_message and msg.reply_to_message.photo: + content = msg.reply_to_message.photo[-1].file_id # last elem = best quality + text = msg.reply_to_message.caption + data_type = Types.PHOTO + + elif msg.reply_to_message and msg.reply_to_message.audio: + content = msg.reply_to_message.audio.file_id + text = msg.reply_to_message.caption + data_type = Types.AUDIO + + elif msg.reply_to_message and msg.reply_to_message.voice: + content = msg.reply_to_message.voice.file_id + text = msg.reply_to_message.caption + data_type = Types.VOICE + + elif msg.reply_to_message and msg.reply_to_message.video: + content = msg.reply_to_message.video.file_id + text = msg.reply_to_message.caption + data_type = Types.VIDEO + + elif msg.reply_to_message and msg.reply_to_message.video_note: + content = msg.reply_to_message.video_note.file_id + text = None + data_type = Types.VIDEO_NOTE + + else: + text = None + data_type = None + content = None + + return text, data_type, content diff --git a/Exon/modules/helper_funcs/readable_time.py b/Exon/modules/helper_funcs/readable_time.py new file mode 100644 index 00000000..e24c1353 --- /dev/null +++ b/Exon/modules/helper_funcs/readable_time.py @@ -0,0 +1,48 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + + +def get_readable_time(seconds: int) -> str: + count = 0 + readable_time = "" + time_list = [] + time_suffix_list = [" sᴇᴄ.", "ᴍ", "ʜ", " ᴅᴀʏs"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + readable_time += time_list.pop() + ", " + + time_list.reverse() + readable_time += " ".join(time_list) + + return readable_time diff --git a/Exon/modules/helper_funcs/regex_helper.py b/Exon/modules/helper_funcs/regex_helper.py new file mode 100644 index 00000000..29d0f136 --- /dev/null +++ b/Exon/modules/helper_funcs/regex_helper.py @@ -0,0 +1,46 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 regex + + +def regex_searcher(regex_string, string): + try: + search = regex.search(regex_string, string, timeout=6) + except (TimeoutError, Exception): + return False + return search + + +def infinite_loop_check(regex_string): + loop_matches = [ + r"\((.{1,}[\+\*]){1,}\)[\+\*].", + r"[\(\[].{1,}\{\d(,)?\}[\)\]]\{\d(,)?\}", + r"\(.{1,}\)\{.{1,}(,)?\}\(.*\)(\+|\* |\{.*\})", + ] + for match in loop_matches: + match_1 = regex.search(match, regex_string) + if match_1: + return True + return False diff --git a/Exon/modules/helper_funcs/string_handling.py b/Exon/modules/helper_funcs/string_handling.py new file mode 100644 index 00000000..6cb90e09 --- /dev/null +++ b/Exon/modules/helper_funcs/string_handling.py @@ -0,0 +1,316 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 +import time +from typing import Dict, List + +import bleach +import emoji +import markdown2 +from telegram import MessageEntity +from telegram.utils.helpers import escape_markdown + +# ɴᴏᴛᴇ: the url \ escape may cause double escapes +# match * (bold) (don't escape if in url) +# match _ (italics) (don't escape if in url) +# match ` (code) +# match []() (markdown link) +# else, escape *, _, `, and [ + +MATCH_MD = re.compile( + r"\*(.*?)\*|" + r"_(.*?)_|" + r"`(.*?)`|" + r"(?<!\\)(\[.*?\])(\(.*?\))|" + r"(?P<esc>[*_`\[])", +) + +# regex to find []() links -> hyperlinks/buttons +LINK_REGEX = re.compile(r"(?<!\\)\[.+?\]\((.*?)\)") +BTN_URL_REGEX = re.compile(r"(\[([^\[]+?)\]\(buttonurl:(?:/{0,2})(.+?)(:same)?\))") + + +def _selective_escape(to_parse: str) -> str: + """ + Escape all invalid markdown + :param to_parse: text to escape + :return: valid markdown string + """ + offset = 0 # offset to be used as adding a \ character causes the string to shift + for match in MATCH_MD.finditer(to_parse): + if match.group("esc"): + ent_start = match.start() + to_parse = ( + to_parse[: ent_start + offset] + "\\" + to_parse[ent_start + offset :] + ) + offset += 1 + return to_parse + + +# This is a fun one. +def _calc_emoji_offset(to_calc) -> int: + # Get all emoji in text. + emoticons = emoji.get_emoji_regexp().finditer(to_calc) + # Check the utf16 length of the emoji to determine the offset it caused. + # Normal, 1 character emoji don't affect; hence sub 1. + # special, eg with two emoji characters (eg face, and skin col) will have length 2, so by subbing one we + # know we'll get one extra offset, + return sum(len(e.group(0).encode("utf-16-le")) // 2 - 1 for e in emoticons) + + +def markdown_parser( + txt: str, entities: Dict[MessageEntity, str] = None, offset: int = 0 +) -> str: + """ + Parse a string, escaping all invalid markdown entities. + Escapes URL's so as to avoid URL mangling. + Re-adds any telegram code entities obtained from the entities object. + :param txt: text to parse + :param entities: dict of message entities in text + :param offset: message offset - command and notename length + :return: valid markdown string + """ + if not entities: + entities = {} + if not txt: + return "" + + prev = 0 + res = "" + # Loop over all message entities, and: + # reinsert code + # escape free-standing urls + for ent, ent_text in entities.items(): + if ent.offset < -offset: + continue + + start = ent.offset + offset # start of entity + end = ent.offset + offset + ent.length - 1 # end of entity + + # we only care about code, url, text links + if ent.type in ("code", "url", "text_link"): + # count emoji to switch counter + count = _calc_emoji_offset(txt[:start]) + start -= count + end -= count + + # URL handling -> do not escape if in [](), escape otherwise. + if ent.type == "url": + if any( + match.start(1) <= start and end <= match.end(1) + for match in LINK_REGEX.finditer(txt) + ): + continue + # else, check the escapes between the prev and last and forcefully escape the url to avoid mangling + else: + # TODO: investigate possible offset bug when lots of emoji are present + res += _selective_escape(txt[prev:start] or "") + escape_markdown( + ent_text + ) + + # code handling + elif ent.type == "code": + res += _selective_escape(txt[prev:start]) + "`" + ent_text + "`" + + # handle markdown/html links + elif ent.type == "text_link": + res += _selective_escape(txt[prev:start]) + "[{}]({})".format( + ent_text, ent.url + ) + + end += 1 + + # anything else + else: + continue + + prev = end + + res += _selective_escape(txt[prev:]) # add the rest of the text + return res + + +def button_markdown_parser( + txt: str, + entities: Dict[MessageEntity, str] = None, + offset: int = 0, +) -> (str, List): + markdown_note = markdown_parser(txt, entities, offset) + prev = 0 + note_data = "" + buttons = [] + for match in BTN_URL_REGEX.finditer(markdown_note): + # Check if btnurl is escaped + n_escapes = 0 + to_check = match.start(1) - 1 + while to_check > 0 and markdown_note[to_check] == "\\": + n_escapes += 1 + to_check -= 1 + + # if even, not escaped -> create button + if n_escapes % 2 == 0: + # create a thruple with button label, url, and newline status + buttons.append((match.group(2), match.group(3), bool(match.group(4)))) + note_data += markdown_note[prev : match.start(1)] + prev = match.end(1) + # if odd, escaped -> move along + else: + note_data += markdown_note[prev:to_check] + prev = match.start(1) - 1 + + note_data += markdown_note[prev:] + + return note_data, buttons + + +def escape_invalid_curly_brackets(text: str, valids: List[str]) -> str: + new_text = "" + idx = 0 + while idx < len(text): + if text[idx] == "{": + if idx + 1 < len(text) and text[idx + 1] == "{": + idx += 2 + new_text += "{{{{" + continue + else: + success = False + for v in valids: + if text[idx:].startswith("{" + v + "}"): + success = True + break + if success: + new_text += text[idx : idx + len(v) + 2] + idx += len(v) + 2 + continue + else: + new_text += "{{" + + elif text[idx] == "}": + if idx + 1 < len(text) and text[idx + 1] == "}": + idx += 2 + new_text += "}}}}" + continue + else: + new_text += "}}" + + else: + new_text += text[idx] + idx += 1 + + return new_text + + +SMART_OPEN = "“" +SMART_CLOSE = "”" +START_CHAR = ("'", '"', SMART_OPEN) + + +def split_quotes(text: str) -> List: + if any(text.startswith(char) for char in START_CHAR): + counter = 1 # ignore first char -> is some kind of quote + while counter < len(text): + if text[counter] == "\\": + counter += 1 + elif text[counter] == text[0] or ( + text[0] == SMART_OPEN and text[counter] == SMART_CLOSE + ): + break + counter += 1 + else: + return text.split(None, 1) + + # 1 to avoid starting quote, and counter is exclusive so avoids ending + key = remove_escapes(text[1:counter].strip()) + # index will be in range, or `else` would have been executed and returned + rest = text[counter + 1 :].strip() + if not key: + key = text[0] + text[0] + return list(filter(None, [key, rest])) + else: + return text.split(None, 1) + + +def remove_escapes(text: str) -> str: + counter = 0 + res = "" + is_escaped = False + while counter < len(text): + if is_escaped: + res += text[counter] + is_escaped = False + elif text[counter] == "\\": + is_escaped = True + else: + res += text[counter] + counter += 1 + return res + + +def escape_chars(text: str, to_escape: List[str]) -> str: + to_escape.append("\\") + new_text = "" + for x in text: + if x in to_escape: + new_text += "\\" + new_text += x + return new_text + + +def extract_time(message, time_val): + if any(time_val.endswith(unit) for unit in ("m", "h", "d")): + unit = time_val[-1] + time_num = time_val[:-1] # type: str + if not time_num.isdigit(): + message.reply_text("ɪɴᴠᴀʟɪᴅ ᴛɪᴍᴇ ᴀᴍᴏᴜɴᴛ sᴘᴇᴄɪғɪᴇᴅ.") + return "" + + if unit == "m": + bantime = int(time.time() + int(time_num) * 60) + elif unit == "h": + bantime = int(time.time() + int(time_num) * 60 * 60) + elif unit == "d": + bantime = int(time.time() + int(time_num) * 24 * 60 * 60) + else: + # how even...? + return "" + return bantime + message.reply_text( + "ɪɴᴠᴀʟɪᴅ ᴛɪᴍᴇ ᴛʏᴘᴇ sᴘᴇᴄɪғɪᴇᴅ. ᴇxᴘᴇᴄᴛᴇᴅ m,h, or d, ɢᴏᴛ: {}".format( + time_val[-1], + ), + ) + return "" + + +def markdown_to_html(text): + text = text.replace("*", "**") + text = text.replace("`", "```") + text = text.replace("~", "~~") + _html = markdown2.markdown(text, extras=["strike", "underline"]) + return bleach.clean( + _html, + tags=["strong", "em", "a", "code", "pre", "strike", "u"], + strip=True, + )[:-1] diff --git "a/Exon/modules/helper_funcs/telethn/ABISHNOI COPYRIGHT \302\251" "b/Exon/modules/helper_funcs/telethn/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/modules/helper_funcs/telethn/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/modules/helper_funcs/telethn/__init__.py b/Exon/modules/helper_funcs/telethn/__init__.py new file mode 100644 index 00000000..d0f68299 --- /dev/null +++ b/Exon/modules/helper_funcs/telethn/__init__.py @@ -0,0 +1,36 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from Exon import DEMONS, DEV_USERS, DRAGONS, TIGERS, WOLVES, telethn + +IMMUNE_USERS = DRAGONS + WOLVES + DEMONS + TIGERS + DEV_USERS + +IMMUNE_USERS = ( + list(DRAGONS) + list(WOLVES) + list(DEMONS) + list(TIGERS) + list(DEV_USERS) +) diff --git a/Exon/modules/helper_funcs/telethn/chatstatus.py b/Exon/modules/helper_funcs/telethn/chatstatus.py new file mode 100644 index 00000000..1859518b --- /dev/null +++ b/Exon/modules/helper_funcs/telethn/chatstatus.py @@ -0,0 +1,129 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from telethon.tl.types import ChannelParticipantsAdmins + +from Exon import DRAGONS +from Exon.modules.helper_funcs.telethn import IMMUNE_USERS, telethn + + +async def user_is_ban_protected(user_id: int, message): + status = False + if message.is_private or user_id in (IMMUNE_USERS): + return True + + async for user in telethn.iter_participants( + message.chat_id, + filter=ChannelParticipantsAdmins, + ): + if user_id == user.id: + status = True + break + return status + + +async def user_is_admin(user_id: int, message): + status = False + if message.is_private: + return True + + async for user in telethn.iter_participants( + message.chat_id, + filter=ChannelParticipantsAdmins, + ): + if user_id == user.id or user_id in DRAGONS: + status = True + break + return status + + +async def is_user_admin(user_id: int, chat_id): + status = False + async for user in telethn.iter_participants( + chat_id, + filter=ChannelParticipantsAdmins, + ): + if user_id == user.id or user_id in DRAGONS: + status = True + break + return status + + +async def Exon_is_admin(chat_id: int): + status = False + Exon = await telethn.get_me() + async for user in telethn.iter_participants( + chat_id, + filter=ChannelParticipantsAdmins, + ): + if Exon.id == user.id: + status = True + break + return status + + +async def is_user_in_chat(chat_id: int, user_id: int): + status = False + async for user in telethn.iter_participants(chat_id): + if user_id == user.id: + status = True + break + return status + + +async def can_change_info(message): + return message.chat.admin_rights.change_info if message.chat.admin_rights else False + + +async def can_ban_users(message): + return message.chat.admin_rights.ban_users if message.chat.admin_rights else False + + +async def can_pin_messages(message): + return ( + message.chat.admin_rights.pin_messages if message.chat.admin_rights else False + ) + + +async def can_invite_users(message): + return ( + message.chat.admin_rights.invite_users if message.chat.admin_rights else False + ) + + +async def can_add_admins(message): + return message.chat.admin_rights.add_admins if message.chat.admin_rights else False + + +async def can_delete_messages(message): + + if message.is_private: + return True + if message.chat.admin_rights: + return message.chat.admin_rights.delete_messages + return False diff --git a/Exon/modules/heroku.py b/Exon/modules/heroku.py new file mode 100644 index 00000000..1b08b50a --- /dev/null +++ b/Exon/modules/heroku.py @@ -0,0 +1,143 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 math +import os + +import heroku3 +import requests + +from Exon import HEROKU_API_KEY, HEROKU_APP_NAME, OWNER_ID +from Exon.events import register + +heroku_api = "https://api.heroku.com" +Heroku = heroku3.from_key(HEROKU_API_KEY) + + +@register(pattern="^/usage$") +async def dyno_usage(dyno): + if dyno.fwd_from: + return + if dyno.sender_id != OWNER_ID: + return + """ + Get your account Dyno Usage + """ + die = await dyno.reply("`Processing...`") + useragent = ( + "Mozilla/5.0 (Linux; Android 10; SM-G975F) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/80.0.3987.149 Mobile Safari/537.36" + ) + user_id = Heroku.account().id + headers = { + "User-Agent": useragent, + "Authorization": f"Bearer {HEROKU_API_KEY}", + "Accept": "application/vnd.heroku+json; version=3.account-quotas", + } + path = f"/accounts/{user_id}/actions/get-quota" + r = requests.get(heroku_api + path, headers=headers) + if r.status_code != 200: + return await die.edit("`ᴇʀʀᴏʀ: sᴏᴍᴇᴛʜɪɴɢ ʙᴀᴅ happened`\n\n" f">.`{r.reason}`\n") + result = r.json() + quota = result["account_quota"] + quota_used = result["quota_used"] + + """ - Used - """ + remaining_quota = quota - quota_used + percentage = math.floor(remaining_quota / quota * 100) + minutes_remaining = remaining_quota / 60 + hours = math.floor(minutes_remaining / 60) + minutes = math.floor(minutes_remaining % 60) + day = math.floor(hours / 24) + + """ - Current - """ + App = result["apps"] + try: + App[0]["quota_used"] + except IndexError: + AppQuotaUsed = 0 + AppPercentage = 0 + else: + AppQuotaUsed = App[0]["quota_used"] / 60 + AppPercentage = math.floor(App[0]["quota_used"] * 100 / quota) + AppHours = math.floor(AppQuotaUsed / 60) + AppMinutes = math.floor(AppQuotaUsed % 60) + await asyncio.sleep(1.5) + + return await die.edit( + " **ᴅʏɴᴏ ᴜsᴀɢᴇ **:\n\n" + f" » ᴅʏɴᴏ ᴜsᴀɢᴇ ғᴏʀ **{HEROKU_APP_NAME}**:\n" + f" • `{AppHours}`**h** `{AppMinutes}`**m** " + f"**|** [`{AppPercentage}`**%**]" + "\n\n" + " » ᴅʏɴᴏ ʜᴏᴜʀs ǫᴜᴏᴛᴀ ʀᴇᴍᴀɪɴɪɴɢ ᴛʜɪs ᴍᴏɴᴛʜ:\n" + f" • `{hours}`**h** `{minutes}`**m** " + f"**|** [`{percentage}`**%**]" + f"\n\n » ᴅʏɴᴏs ʜᴇʀᴏᴋᴜ {day} ᴅᴀʏs ʟᴇғᴛ" + ) + + +@register(pattern="^/logs$") +async def _(dyno): + if dyno.fwd_from: + return + if dyno.sender_id != OWNER_ID: + return + try: + Heroku = heroku3.from_key(HEROKU_API_KEY) + app = Heroku.app(HEROKU_APP_NAME) + except: + return await dyno.reply( + " ᴘʟᴇᴀsᴇ ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜʀ ʜᴇʀᴏᴋᴜ ᴀᴘɪ ᴋᴇʏ, ʏᴏᴜʀ ᴀᴘᴘ ɴᴀᴍᴇ ᴀʀᴇ ᴄᴏɴғɪɢᴜʀᴇᴅ ᴄᴏʀʀᴇᴄᴛʟʏ ɪɴ ᴛʜᴇ ʜᴇʀᴏᴋᴜ" + ) + v = await dyno.reply("ɢᴇᴛᴛɪɴɢ ʟᴏɢs.......") + with open("logs.txt", "w") as log: + log.write(app.get_log()) + await v.edit("ɢᴏᴛ ᴛʜᴇ ʟᴏɢs ᴡᴀɪᴛ ᴀ sᴇᴄ") + await dyno.client.send_file( + dyno.chat_id, + "logs.txt", + reply_to=dyno.id, + caption="ᴇxᴏɴ ʟᴏɢs.", + ) + + await asyncio.sleep(5) + await v.delete() + return os.remove("logs.txt") + + +def prettyjson(obj, indent=2, maxlinelength=80): + """Renders JSON content with indentation and line splits/concatenations to fit maxlinelength. + Only dicts, lists and basic types are supported""" + + items, _ = getsubitems( + obj, + itemkey="", + islast=True, + maxlinelength=maxlinelength - indent, + indent=indent, + ) + return indentitems(items, indent, level=0) diff --git a/Exon/modules/ids.py b/Exon/modules/ids.py new file mode 100644 index 00000000..fda14868 --- /dev/null +++ b/Exon/modules/ids.py @@ -0,0 +1,81 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 logging + +from pyrogram import filters + +from Exon import pgram + +logging.basicConfig(level=logging.DEBUG) + + +@pgram.on_message(filters.command("id")) +async def getid(client, message): + chat = message.chat + your_id = message.from_user.id + message_id = message.message_id + reply = message.reply_to_message + + text = f"**[𝗠𝗲𝘀𝘀𝗮𝗴𝗲 𝗜𝗗:]({message.link})** `{message_id}`\n" + text += f"**[𝗬𝗼𝘂𝗿 𝗜𝗗:](tg://user?id={your_id})** `{your_id}`\n" + + if not message.command: + message.command = message.text.split() + + if not message.command: + message.command = message.text.split() + + if len(message.command) == 2: + try: + split = message.text.split(None, 1)[1].strip() + user_id = (await client.get_users(split)).id + text += f"**[𝗨𝘀𝗲𝗿 𝗜𝗗:](tg://user?id={user_id})** `{user_id}`\n" + + except Exception: + return await message.reply_text("This user doesn't exist.", quote=True) + + text += f"**[𝗖𝗵𝗮𝘁 𝗜𝗗:](https://t.me/{chat.username})** `{chat.id}`\n\n" + + if ( + not getattr(reply, "empty", True) + and not message.forward_from_chat + and not reply.sender_chat + ): + text += f"**[𝗥𝗲𝗽𝗹𝗶𝗲𝗱 𝗠𝗲𝘀𝘀𝗮𝗴𝗲 𝗜𝗗:]({reply.link})** `{reply.message_id}`\n" + text += f"**[𝗥𝗲𝗽𝗹𝗶𝗲𝗱 𝗨𝘀𝗲𝗿 𝗜𝗗:](tg://user?id={reply.from_user.id})** `{reply.from_user.id}`\n\n" + + if reply and reply.forward_from_chat: + text += f"ᴛʜᴇ ғᴏʀᴡᴀʀᴅᴇᴅ ᴄʜᴀɴɴᴇʟ, {reply.forward_from_chat.title}, ʜᴀs ᴀɴ ɪᴅ ᴏғ `{reply.forward_from_chat.id}`\n\n" + print(reply.forward_from_chat) + + if reply and reply.sender_chat: + text += f"ɪᴅ ᴏғ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴄʜᴀᴛ/ᴄʜᴀɴɴᴇʟ, ɪs `{reply.sender_chat.id}`" + print(reply.sender_chat) + + await message.reply_text( + text, + disable_web_page_preview=True, + parse_mode="md", + ) diff --git a/Exon/modules/imgeditor.py b/Exon/modules/imgeditor.py new file mode 100644 index 00000000..b350b2b2 --- /dev/null +++ b/Exon/modules/imgeditor.py @@ -0,0 +1,478 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +from pyrogram import filters +from pyrogram.types import ( + CallbackQuery, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, +) + +from Exon import BOT_NAME, pgram + +# By @AbishnoMF +from Exon.utils.resources.ImageEditor.edit_1 import ( # pylint:disable=import-error + black_white, + box_blur, + bright, + g_blur, + mix, + normal_blur, +) +from Exon.utils.resources.ImageEditor.edit_2 import ( # pylint:disable=import-error + cartoon, + circle_with_bg, + circle_without_bg, + contrast, + edge_curved, + pencil, + sepia_mode, + sticker, +) +from Exon.utils.resources.ImageEditor.edit_3 import ( # pylint:disable=import-error + black_border, + blue_border, + green_border, + red_border, +) +from Exon.utils.resources.ImageEditor.edit_4 import ( # pylint:disable=import-error + inverted, + removebg_plain, + removebg_sticker, + removebg_white, + rotate_90, + rotate_180, + rotate_270, + round_sticker, +) +from Exon.utils.resources.ImageEditor.edit_5 import ( # pylint:disable=import-error + normalglitch_1, + normalglitch_2, + normalglitch_3, + normalglitch_4, + normalglitch_5, + scanlineglitch_1, + scanlineglitch_2, + scanlineglitch_3, + scanlineglitch_4, + scanlineglitch_5, +) + +lel = 00000000 +# pylint:disable=import-error +@pgram.on_message(filters.command(["edit", "editor"])) +async def photo(client: pgram, message: Message): + try: + if not message.reply_to_message.photo: + await client.send_message(message.chat.id, "ʀᴇᴘʟʏ ᴛᴏ ᴀɴ ɪᴍᴀɢᴇ ᴍᴀɴ!") + return + except: + return + global lel + try: + lel = message.from_user.id + except: + return + try: + await client.send_message( + chat_id=message.chat.id, + text="sᴇʟᴇᴄᴛ ʏᴏᴜʀ ʀᴇǫᴜɪʀᴇᴅ ᴍᴏᴅᴇ ғʀᴏᴍ ʙᴇʟᴏᴡ!ㅤㅤ", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ʙʀɪɢʜᴛᴇɴ", callback_data="bright"), + InlineKeyboardButton(text="ᴍɪxᴇᴅ", callback_data="mix"), + InlineKeyboardButton(text="ʙ&ᴡ", callback_data="b|w"), + ], + [ + InlineKeyboardButton(text="ᴄɪʀᴄʟᴇ", callback_data="circle"), + InlineKeyboardButton(text="ʙʟᴜʀ", callback_data="blur"), + InlineKeyboardButton(text="ʙᴏʀᴅᴇʀ", callback_data="border"), + ], + [ + InlineKeyboardButton(text="sᴛɪᴄᴋᴇʀ", callback_data="stick"), + InlineKeyboardButton(text="ʀᴏᴛᴀᴛᴇ", callback_data="rotate"), + InlineKeyboardButton(text="ᴄᴏɴᴛʀᴀsᴛ", callback_data="contrast"), + ], + [ + InlineKeyboardButton(text="sᴇᴘɪᴀ", callback_data="sepia"), + InlineKeyboardButton(text="ᴘᴇɴᴄɪʟ", callback_data="pencil"), + InlineKeyboardButton(text="ᴄᴀʀᴛᴏᴏɴ", callback_data="cartoon"), + ], + [ + InlineKeyboardButton(text="ɪɴᴠᴇʀᴛ", callback_data="inverted"), + InlineKeyboardButton(text="ɢʟɪᴛᴄʜ", callback_data="glitch"), + InlineKeyboardButton( + text="ʀᴇᴍᴏᴠᴇ ʙɢ", callback_data="removebg" + ), + ], + [ + InlineKeyboardButton(text="ᴄʟᴏsᴇ", callback_data="close_e"), + ], + ] + ), + reply_to_message_id=message.reply_to_message.message_id, + ) + except Exception as e: + print(f"photomarkup error - {str(e)}") + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_text("sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True) + except Exception: + return + + +@pgram.on_callback_query() +async def cb_handler(client: pgram, query: CallbackQuery): + user_id = query.from_user.id + if lel == user_id: + if query.data == "removebg": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ʀᴇǫᴜɪʀᴇᴅ ᴍᴏᴅᴇ**ㅤㅤㅤㅤ", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴡɪᴛʜ ᴡʜɪᴛᴇ ʙɢ", callback_data="rmbgwhite" + ), + InlineKeyboardButton( + text="ᴡɪᴛʜᴏᴜᴛ ʙɢ", callback_data="rmbgplain" + ), + ], + [ + InlineKeyboardButton( + text="sᴛɪᴄᴋᴇʀ", callback_data="rmbgsticker" + ) + ], + ] + ), + ) + elif query.data == "stick": + await query.message.edit( + "**sᴇʟᴇᴄᴛ ᴀ ᴛʏᴘᴇ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ɴᴏʀᴍᴀʟ", callback_data="stkr"), + InlineKeyboardButton( + text="ᴇᴅɢᴇ ᴄᴜʀᴠᴇᴅ", callback_data="cur_ved" + ), + ], + [ + InlineKeyboardButton( + text="ᴄɪʀᴄʟᴇ", callback_data="circle_sticker" + ) + ], + ] + ), + ) + elif query.data == "rotate": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ᴛʜᴇ ᴅᴇɢʀᴇᴇ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="180", callback_data="180"), + InlineKeyboardButton(text="90", callback_data="90"), + ], + [InlineKeyboardButton(text="270", callback_data="270")], + ] + ), + ) + + elif query.data == "glitch": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ʀᴇǫᴜɪʀᴇᴅ ᴍᴏᴅᴇ**ㅤㅤㅤㅤ", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ɴᴏʀᴍᴀʟ", callback_data="normalglitch" + ), + InlineKeyboardButton( + text="sᴄᴀɴ ʟɪɴᴇs", callback_data="scanlineglitch" + ), + ] + ] + ), + ) + elif query.data == "normalglitch": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ɢʟɪᴛᴄʜ ᴘᴏᴡᴇʀ ʟᴇᴠᴇʟ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="1", callback_data="normalglitch1" + ), + InlineKeyboardButton( + text="2", callback_data="normalglitch2" + ), + InlineKeyboardButton( + text="3", callback_data="normalglitch3" + ), + ], + [ + InlineKeyboardButton( + text="4", callback_data="normalglitch4" + ), + InlineKeyboardButton( + text="5", callback_data="normalglitch5" + ), + ], + ] + ), + ) + elif query.data == "scanlineglitch": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ɢʟɪᴛᴄʜ ᴘᴏᴡᴇʀ ʟᴇᴠᴇʟ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="1", callback_data="scanlineglitch1" + ), + InlineKeyboardButton( + text="2", callback_data="scanlineglitch2" + ), + InlineKeyboardButton( + text="3", callback_data="scanlineglitch3" + ), + ], + [ + InlineKeyboardButton( + text="4", callback_data="scanlineglitch4" + ), + InlineKeyboardButton( + text="5", callback_data="scanlineglitch5" + ), + ], + ] + ), + ) + elif query.data == "blur": + await query.message.edit( + "**sᴇʟᴇᴄᴛ ᴀ ᴛʏᴘᴇ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ʙᴏx", callback_data="box"), + InlineKeyboardButton(text="ɴᴏʀᴍᴀʟ", callback_data="normal"), + ], + [InlineKeyboardButton(text="ɢᴀᴜssɪᴀɴ", callback_data="gas")], + ] + ), + ) + elif query.data == "circle": + await query.message.edit_text( + "**sᴇʟᴇᴄᴛ ʀᴇǫᴜɪʀᴇᴅ ᴍᴏᴅᴇ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴡɪᴛʜ ʙɢ", callback_data="circlewithbg" + ), + InlineKeyboardButton( + text="ᴡɪᴛʜᴏᴜᴛ ʙɢ", callback_data="circlewithoutbg" + ), + ] + ] + ), + ) + elif query.data == "border": + await query.message.edit( + "**sᴇʟᴇᴄᴛ ʙᴏʀᴅᴇʀ ᴄᴏʟᴏᴜʀ**", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="ʀᴇᴅ", callback_data="red"), + InlineKeyboardButton(text="ɢʀᴇᴇɴ", callback_data="green"), + ], + [ + InlineKeyboardButton(text="ʙʟᴀᴄᴋ", callback_data="black"), + InlineKeyboardButton(text="ʙʟᴜᴇ", callback_data="blue"), + ], + ] + ), + ) + + elif query.data == "bright": + await query.message.delete() + await bright(client, query.message) + + elif query.data == "close_e": + await query.message.delete() + + elif query.data == "mix": + await query.message.delete() + await mix(client, query.message) + + elif query.data == "b|w": + await query.message.delete() + await black_white(client, query.message) + + elif query.data == "circlewithbg": + await query.message.delete() + await circle_with_bg(client, query.message) + + elif query.data == "circlewithoutbg": + await query.message.delete() + await circle_without_bg(client, query.message) + + elif query.data == "green": + await query.message.delete() + await green_border(client, query.message) + + elif query.data == "blue": + await query.message.delete() + await blue_border(client, query.message) + + elif query.data == "red": + await query.message.delete() + await red_border(client, query.message) + # AbishnoiMF + elif query.data == "black": + await query.message.delete() + await black_border(client, query.message) + + elif query.data == "circle_sticker": + await query.message.delete() + await round_sticker(client, query.message) + + elif query.data == "inverted": + await query.message.delete() + await inverted(client, query.message) + + elif query.data == "stkr": + await query.message.delete() + await sticker(client, query.message) + + elif query.data == "cur_ved": + await query.message.delete() + await edge_curved(client, query.message) + + elif query.data == "90": + await query.message.delete() + await rotate_90(client, query.message) + + elif query.data == "180": + await query.message.delete() + await rotate_180(client, query.message) + + elif query.data == "270": + await query.message.delete() + await rotate_270(client, query.message) + + elif query.data == "contrast": + await query.message.delete() + await contrast(client, query.message) + + elif query.data == "box": + await query.message.delete() + await box_blur(client, query.message) + + elif query.data == "gas": + await query.message.delete() + await g_blur(client, query.message) + + elif query.data == "normal": + await query.message.delete() + await normal_blur(client, query.message) + + elif query.data == "sepia": + await query.message.delete() + await sepia_mode(client, query.message) + + elif query.data == "pencil": + await query.message.delete() + await pencil(client, query.message) + + elif query.data == "cartoon": + await query.message.delete() + await cartoon(client, query.message) + + elif query.data == "normalglitch1": + await query.message.delete() + await normalglitch_1(client, query.message) + + elif query.data == "normalglitch2": + await query.message.delete() + await normalglitch_2(client, query.message) + + elif query.data == "normalglitch3": + await normalglitch_3(client, query.message) + + elif query.data == "normalglitch4": + await query.message.delete() + await normalglitch_4(client, query.message) + + elif query.data == "normalglitch5": + await query.message.delete() + await normalglitch_5(client, query.message) + + elif query.data == "scanlineglitch1": + await query.message.delete() + await scanlineglitch_1(client, query.message) + + elif query.data == "scanlineglitch2": + await query.message.delete() + await scanlineglitch_2(client, query.message) + + elif query.data == "scanlineglitch3": + await query.message.delete() + await scanlineglitch_3(client, query.message) + + elif query.data == "scanlineglitch4": + await query.message.delete() + await scanlineglitch_4(client, query.message) + + elif query.data == "scanlineglitch5": + await query.message.delete() + await scanlineglitch_5(client, query.message) + + elif query.data == "rmbgwhite": + await query.message.delete() + await removebg_white(client, query.message) + + elif query.data == "rmbgplain": + await query.message.delete() + await removebg_plain(client, query.message) + + elif query.data == "rmbgsticker": + await removebg_sticker(client, query.message) + + +__mod_name__ = "𝙴ᴅɪᴛᴏʀ" +__help__ = f""" +{BOT_NAME} ʜᴀᴠᴇ sᴏᴍᴇ ᴀᴅᴠᴀɴᴄᴇᴅ ɪᴍᴀɢᴇ ᴇᴅɪᴛɪɴɢ ᴛᴏᴏʟs ɪɴʙᴜɪʟᴛ + +ʙʀɪɢʜᴛ, ᴄɪʀᴄʟᴇ, ʀᴇᴍʙɢ, ʙʟᴜʀ, ʙᴏʀᴅᴇʀ, ғʟɪᴘ, ɢʟɪᴛᴄʜ, sᴛɪᴄᴋᴇʀ ᴍᴀᴋᴇʀ ᴀɴᴅ ᴍᴏʀᴇ + + +⍟ /edit [reply to image]*:* `ᴏᴘᴇɴ ᴛʜᴇ ɪᴍᴀɢᴇ ᴇᴅɪᴛᴏʀ ` + +⍟ /rmbg [REPLY]*:* `ʀᴇᴍᴏᴠᴇ BG ᴏғ ʀᴇᴘʟɪᴇᴅ ɪᴍᴀɢᴇ/sᴛɪᴄᴋᴇʀ `. +""" diff --git a/Exon/modules/is_karma_mongo.py b/Exon/modules/is_karma_mongo.py new file mode 100644 index 00000000..0203b2cc --- /dev/null +++ b/Exon/modules/is_karma_mongo.py @@ -0,0 +1,47 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from Exon import db + +karma_statusdb = db.karma_status + + +def is_karma(chat_id): + karma = karma_statusdb.find_one({"chat_id": chat_id}) + + +def set_karma(chat_id): + karma = is_karma(chat_id) + if not karma: + karma_statusdb.insert_one({"chat_id": chat_id}) + + +def rem_karma(chat_id): + karma = is_karma(chat_id) + if karma: + karma_statusdb.delete_one({"chat_id": chat_id}) diff --git a/Exon/modules/json.py b/Exon/modules/json.py new file mode 100644 index 00000000..345f091b --- /dev/null +++ b/Exon/modules/json.py @@ -0,0 +1,85 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 io + +from telethon.tl import functions, types + +from Exon import telethn +from Exon.events import register + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + + return isinstance( + ( + await telethn(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + if isinstance(chat, types.InputPeerChat): + + ui = await telethn.get_peer_id(user) + ps = ( + await telethn(functions.messages.GetFullChatRequest(chat.chat_id)) + ).full_chat.participants.participants + return isinstance( + next((p for p in ps if p.user_id == ui), None), + (types.ChatParticipantAdmin, types.ChatParticipantCreator), + ) + return None + + +@register(pattern="^/json$") +async def _(event): + if event.fwd_from: + return + if event.is_group: + if await is_register_admin(event.input_chat, event.message.sender_id): + pass + elif event.chat_id != id or event.sender_id != users: + return + the_real_message = None + reply_to_id = None + if event.reply_to_msg_id: + previous_message = await event.get_reply_message() + the_real_message = previous_message.stringify() + reply_to_id = event.reply_to_msg_id + else: + the_real_message = event.stringify() + reply_to_id = event.message.id + if len(the_real_message) > 4095: + with io.BytesIO(str.encode(the_real_message)) as out_file: + out_file.name = "json.text" + await telethn.send_file( + event.chat_id, + out_file, + force_document=True, + allow_cache=False, + reply_to=reply_to_id, + ) + await event.delete() + else: + await event.reply(f"`{the_real_message}`") diff --git a/Exon/modules/karma.py b/Exon/modules/karma.py new file mode 100644 index 00000000..73c0e212 --- /dev/null +++ b/Exon/modules/karma.py @@ -0,0 +1,193 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import asyncio + +from pyrogram import filters + +from Exon import pgram as app +from Exon.modules.mongo.karma_mongo import ( + alpha_to_int, + get_karma, + get_karmas, + int_to_alpha, + update_karma, +) +from Exon.utils.errors import capture_err + +regex_upvote = r"^((?i)\+|\+\+|\+1|thx|tnx|ty|thank you|thanx|thanks|pro|cool|good|👍|nice|noice|piro)$" +regex_downvote = r"^(\-|\-\-|\-1|👎|noob|Noob|gross|fuck off)$" + +karma_positive_group = 3 +karma_negative_group = 4 + + +from pymongo import MongoClient + +from Exon import MONGO_DB_URL + +worddb = MongoClient(MONGO_DB_URL) +k = worddb["ExonKarma"]["karma_status"] + + +async def is_admins(chat_id: int): + return [ + member.user.id + async for member in app.iter_chat_members(chat_id, filter="administrators") + ] + + +@app.on_message( + filters.text + & filters.group + & filters.incoming + & filters.reply + & filters.regex(regex_upvote) + & ~filters.via_bot + & ~filters.bot, + group=karma_positive_group, +) +async def upvote(_, message): + chat_id = message.chat.id + is_karma = k.find_one({"chat_id": chat_id}) + if not is_karma: + if not message.reply_to_message.from_user: + return + if not message.from_user: + return + if message.reply_to_message.from_user.id == message.from_user.id: + return + 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_text( + f"ɪɴᴄʀᴇᴍᴇɴᴛᴇᴅ ᴋᴀʀᴍᴀ ᴏғ +1 {user_mention} \nᴛᴏᴛᴀʟ ᴘᴏɪɴᴛs: {karma}" + ) + + +@app.on_message( + filters.text + & filters.group + & filters.incoming + & filters.reply + & filters.regex(regex_downvote) + & ~filters.via_bot + & ~filters.bot, + group=karma_negative_group, +) +async def downvote(_, message): + chat_id = message.chat.id + is_karma = k.find_one({"chat_id": chat_id}) + if is_karma: + if not message.reply_to_message.from_user: + return + if not message.from_user: + return + if message.reply_to_message.from_user.id == message.from_user.id: + return + 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_text( + f"ᴅᴇᴄʀᴇᴍᴇɴᴛᴇᴅ ᴋᴀʀᴍᴀ ᴏғ -1 {user_mention} \nᴛᴏᴛᴀʟ ᴘᴏɪɴᴛs: {karma}" + ) + + +@app.on_message(filters.command("karmastats") & filters.group) +@capture_err +async def karma(_, message): + chat_id = message.chat.id + if not message.reply_to_message: + m = await message.reply_text("ᴡᴀɪᴛ 10 sᴇᴄᴏɴᴅs") + karma = await get_karmas(chat_id) + if not karma: + await m.edit("ɴᴏ ᴋᴀʀᴍᴀ ɪɴ DB ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ.") + return + msg = f"**ᴋᴀʀᴍᴀ ʟɪsᴛ ᴏғ {message.chat.title}:- **\n" + 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: + await m.edit("ɴᴏ ᴋᴀʀᴍᴀ ɪɴ DB ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ.") + return + for user_idd, karma_count in karma_arranged.items(): + if limit > 9: + break + try: + user = await app.get_users(int(user_idd)) + await asyncio.sleep(0.8) + except Exception: + continue + first_name = user.first_name + if not first_name: + continue + username = user.username + msg += f"**{karma_count}** {(first_name[0:12] + '...') if len(first_name) > 12 else first_name} `{('@' + username) if username else user_idd}`\n" + limit += 1 + await m.edit(msg) + else: + 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"**ᴛᴏᴛᴀʟ ᴘᴏɪɴᴛ :** {karma}") + + +__mod_name__ = "𝙺ᴀʀᴍᴀ" +__help__ = """ + +*ᴜᴘᴠᴏᴛᴇ* - ᴜsᴇ ᴜᴘᴠᴏᴛᴇ ᴋᴇʏᴡᴏʀᴅs ʟɪᴋᴇ "+", "+1", "thanks", ᴇᴛᴄ. ᴛᴏ ᴜᴘᴠᴏᴛᴇ ᴀ ᴍᴇssᴀɢᴇ. +*ᴅᴏᴡɴᴠᴏᴛᴇ* - ᴜsᴇ ᴅᴏᴡɴᴠᴏᴛᴇ ᴋᴇʏᴡᴏʀᴅs ʟɪᴋᴇ "-", "-1", ᴇᴛᴄ. ᴛᴏ ᴅᴏᴡɴᴠᴏᴛᴇ ᴀ ᴍᴇssᴀɢᴇ. + +*ᴄᴏᴍᴍᴀɴᴅs* + +⍟ /karmastats:- `ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴜsᴇʀ ᴛᴏ ᴄʜᴇᴄᴋ ᴛʜᴀᴛ ᴜsᴇʀ's ᴋᴀʀᴍᴀ ᴘᴏɪɴᴛs` + +⍟ /karmastats:- `sᴇɴᴅ ᴡɪᴛʜᴏᴜᴛ ʀᴇᴘʟʏɪɴɢ ᴛᴏ ᴀɴʏ ᴍᴇssᴀɢᴇ ᴛᴏ ᴄʜᴇᴄᴋ ᴋᴀʀᴍᴀ ᴘᴏɪɴᴛ ʟɪsᴛ of ᴛᴏᴘ 10` + +⍟ /karma :- `ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ karma ɪɴ ʏᴏᴜʀ ɢʀᴏᴜᴘ ` +""" diff --git a/Exon/modules/live_stats.txt b/Exon/modules/live_stats.txt new file mode 100644 index 00000000..380ad4c2 --- /dev/null +++ b/Exon/modules/live_stats.txt @@ -0,0 +1,69 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from pymongo import MongoClient +from pyrogram import * +from pyrogram.types import * + +import Exon.modules.sql.users_sql as sql +from Exon import EVENT_LOGS, MONGO_DB_URL, pgram + +worddb = MongoClient(MONGO_DB_URL) +k = worddb["Exonstats"]["live_stats"] + + +@pgram.on_message( + filters.text & ~filters.private, +) +async def live(client: Client, message: Message): + is_live = k.find_one({"live": "stats"}) + users = f"{sql.num_users()}" + chats = f"{sql.num_chats()}" + captionk = ( + f"ʟɪᴠᴇ ᴀsᴜx sᴛᴀᴛs\n\n• {sql.num_users()} ᴜsᴇʀs, ᴀᴄʀᴏss {sql.num_chats()} ᴄʜᴀᴛs" + ) + if not is_live: + k.insert_one({"live": "stats", "user": users, "chat": chats}) + await pgram.edit_message_text( + chat_id={EVENT_LOGS}, # channel id + message_id=1, # channel msg id + text=captionk, + disable_web_page_preview=True, + ) + if is_live: + is_live2 = k.find_one({"live": "stats", "user": users, "chat": chats}) + if not is_live2: + k.update_one({"live": "stats"}, {"$set": {"user": users, "chat": chats}}) + # editing chat_id and message id + await pgram.edit_message_text( + chat_id={EVENT_LOGS}, # hear your channel id + message_id=20, # Channel msg id + text=captionk, + disable_web_page_preview=True, + ) diff --git a/Exon/modules/locks.py b/Exon/modules/locks.py new file mode 100644 index 00000000..84aa957d --- /dev/null +++ b/Exon/modules/locks.py @@ -0,0 +1,653 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from alphabet_detector import AlphabetDetector +from telegram import ( + Chat, + ChatPermissions, + Message, + MessageEntity, + ParseMode, + TelegramError, +) +from telegram.error import BadRequest +from telegram.ext import CommandHandler, Filters, MessageHandler +from telegram.ext.dispatcher import run_async +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.locks_sql as sql +from Exon import LOGGER, dispatcher +from Exon.modules.connection import connected +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_message, typing_action +from Exon.modules.helper_funcs.chat_status import ( + can_delete, + is_bot_admin, + is_user_admin, + user_admin, + user_not_admin, +) +from Exon.modules.log_channel import loggable +from Exon.modules.sql.approve_sql import is_approved + +ad = AlphabetDetector() + +LOCK_TYPES = { + "audio": Filters.audio, + "voice": Filters.voice, + "document": Filters.document, + "video": Filters.video, + "contact": Filters.contact, + "photo": Filters.photo, + "url": Filters.entity(MessageEntity.URL) + | Filters.caption_entity(MessageEntity.URL), + "bots": Filters.status_update.new_chat_members, + "forward": Filters.forwarded, + "game": Filters.game, + "location": Filters.location, + "egame": Filters.dice, + "rtl": "rtl", + "button": "button", + "inline": "inline", +} + +LOCK_CHAT_RESTRICTION = { + "all": { + "can_send_messages": False, + "can_send_media_messages": False, + "can_send_polls": False, + "can_send_other_messages": False, + "can_add_web_page_previews": False, + "can_change_info": False, + "can_invite_users": False, + "can_pin_messages": False, + }, + "media": {"can_send_media_messages": False}, + "sticker": {"can_send_other_messages": False}, + "gif": {"can_send_other_messages": False}, + "poll": {"can_send_polls": False}, + "other": {"can_send_other_messages": False}, + "previews": {"can_add_web_page_previews": False}, + "info": {"can_change_info": False}, + "invite": {"can_invite_users": False}, + "pin": {"can_pin_messages": False}, +} + +UNLOCK_CHAT_RESTRICTION = { + "all": { + "can_send_messages": True, + "can_send_media_messages": True, + "can_send_polls": True, + "can_send_other_messages": True, + "can_add_web_page_previews": True, + "can_invite_users": True, + }, + "media": {"can_send_media_messages": True}, + "sticker": {"can_send_other_messages": True}, + "gif": {"can_send_other_messages": True}, + "poll": {"can_send_polls": True}, + "other": {"can_send_other_messages": True}, + "previews": {"can_add_web_page_previews": True}, + "info": {"can_change_info": True}, + "invite": {"can_invite_users": True}, + "pin": {"can_pin_messages": True}, +} + +PERM_GROUP = 1 +REST_GROUP = 2 + + +# NOT ASYNC +def restr_members( + bot, + chat_id, + members, + messages=False, + media=False, + other=False, + previews=False, +): + for mem in members: + try: + bot.restrict_chat_member( + chat_id, + mem.user, + can_send_messages=messages, + can_send_media_messages=media, + can_send_other_messages=other, + can_add_web_page_previews=previews, + ) + except TelegramError: + pass + + +# NOT ASYNC +def unrestr_members( + bot, + chat_id, + members, + messages=True, + media=True, + other=True, + previews=True, +): + for mem in members: + try: + bot.restrict_chat_member( + chat_id, + mem.user, + can_send_messages=messages, + can_send_media_messages=media, + can_send_other_messages=other, + can_add_web_page_previews=previews, + ) + except TelegramError: + pass + + +@run_async +def locktypes(update, context): + update.effective_message.reply_text( + "\n • ".join( + ["ʟᴏᴄᴋs ᴀᴠᴀɪʟᴀʙʟᴇ: "] + + sorted(list(LOCK_TYPES) + list(LOCK_CHAT_RESTRICTION)), + ), + ) + + +@run_async +@user_admin +@loggable +@typing_action +def lock(update, context) -> str: + args = context.args + chat = update.effective_chat + user = update.effective_user + + if ( + can_delete(chat, context.bot.id) + or update.effective_message.chat.type == "private" + ): + if len(args) >= 1: + ltype = args[0].lower() + if ltype in LOCK_TYPES: + # Connection check + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = chat.title + text = "ʟᴏᴄᴋᴇᴅ {} ғᴏʀ ɴᴏɴ-ᴀᴅᴍɪɴs ɪɴ {}!".format(ltype, chat_name) + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + text = "ʟᴏᴄᴋᴇᴅ {} ғᴏʀ ɴᴏɴ-ᴀᴅᴍɪɴs!".format(ltype) + sql.update_lock(chat.id, ltype, locked=True) + send_message(update.effective_message, text, parse_mode="markdown") + + return ( + "<b>{}:</b>" + "\n#ʟᴏᴄᴋ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʟᴏᴄᴋᴇᴅ <code>{}</code>.".format( + html.escape(chat.title), + mention_html(user.id, user.first_name), + ltype, + ) + ) + + elif ltype in LOCK_CHAT_RESTRICTION: + # Connection check + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = chat.title + text = "ʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴀʟʟ ɴᴏɴ-ᴀᴅᴍɪɴs ɪɴ {}!".format( + ltype, + chat_name, + ) + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + text = "ʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴀʟʟ ɴᴏɴ-ᴀᴅᴍɪɴs!".format(ltype) + + current_permission = context.bot.getChat(chat_id).permissions + context.bot.set_chat_permissions( + chat_id=chat_id, + permissions=get_permission_list( + eval(str(current_permission)), + LOCK_CHAT_RESTRICTION[ltype.lower()], + ), + ) + + send_message(update.effective_message, text, parse_mode="markdown") + return ( + "<b>{}:</b>" + "\n#ᴘᴇʀᴍɪssɪᴏɴ_ʟᴏᴄᴋ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʟᴏᴄᴋᴇᴅ <code>{}</code>.".format( + html.escape(chat.title), + mention_html(user.id, user.first_name), + ltype, + ) + ) + + else: + send_message( + update.effective_message, + "ᴡʜᴀᴛ ᴀʀᴇ ʏᴏᴜ ᴛʀʏɪɴɢ ᴛᴏ ʟᴏᴄᴋ...? ᴛʀʏ /locktypes ғᴏʀ ᴛʜᴇ ʟɪsᴛ ᴏғ ʟᴏᴄᴋᴀʙʟᴇs", + ) + else: + send_message( + update.effective_message, "ᴡʜᴀᴛ ᴀʀᴇ ʏᴏᴜ ᴛʀʏɪɴɢ ᴛᴏ ʟᴏᴄᴋ ʙᴀʙʏ ....?" + ) + + else: + send_message( + update.effective_message, + "I ᴀᴍ ɴᴏᴛ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏʀ ʜᴀᴠᴇɴ'ᴛ ɢᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs.", + ) + + return "" + + +@run_async +@user_admin +@loggable +@typing_action +def unlock(update, context) -> str: + args = context.args + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + if is_user_admin(chat, message.from_user.id): + if len(args) >= 1: + ltype = args[0].lower() + if ltype in LOCK_TYPES: + # Connection check + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = chat.title + text = "ᴜɴʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴇᴠᴇʀʏᴏɴᴇ in {}!".format(ltype, chat_name) + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ ᴘᴍ", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + text = "ᴜɴʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴇᴠᴇʀʏᴏɴᴇ!".format(ltype) + sql.update_lock(chat.id, ltype, locked=False) + send_message(update.effective_message, text, parse_mode="markdown") + return ( + "<b>{}:</b>" + "\n#ᴜɴʟᴏᴄᴋ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nᴜɴʟᴏᴄᴋᴇᴅ <code>{}</code>.".format( + html.escape(chat.title), + mention_html(user.id, user.first_name), + ltype, + ) + ) + + elif ltype in UNLOCK_CHAT_RESTRICTION: + # Connection check + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_id = conn + chat_name = chat.title + text = "ᴜɴʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴇᴠᴇʀʏᴏɴᴇ i=n {}!".format(ltype, chat_name) + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ ᴜsᴇ ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ PM", + ) + return "" + chat = update.effective_chat + chat_id = update.effective_chat.id + chat_name = update.effective_message.chat.title + text = "ᴜɴʟᴏᴄᴋᴇᴅ {} ғᴏʀ ᴇᴠᴇʀʏᴏɴᴇ!".format(ltype) + + can_change_info = chat.get_member(context.bot.id).can_change_info + if not can_change_info: + send_message( + update.effective_message, + "I ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ᴄʜᴀɴɢᴇ ɢʀᴏᴜᴘ ɪɴғᴏ.", + parse_mode="markdown", + ) + return + + current_permission = context.bot.getChat(chat_id).permissions + context.bot.set_chat_permissions( + chat_id=chat_id, + permissions=get_permission_list( + eval(str(current_permission)), + UNLOCK_CHAT_RESTRICTION[ltype.lower()], + ), + ) + + send_message(update.effective_message, text, parse_mode="markdown") + + return ( + "<b>{}:</b>" + "\n#ᴜɴʟᴏᴄᴋ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nᴜɴʟᴏᴄᴋᴇᴅ <code>{}</code>.".format( + html.escape(chat.title), + mention_html(user.id, user.first_name), + ltype, + ) + ) + else: + send_message( + update.effective_message, + "ᴡʜᴀᴛ ᴀʀᴇ ʏᴏᴜ ᴛʀʏɪɴɢ ᴛᴏ ᴜɴʟᴏᴄᴋ...? ᴛʀʏ /locktypes ғᴏʀ ᴛʜᴇ ʟɪsᴛ ᴏғ ʟᴏᴄᴋᴀʙʟᴇs.", + ) + + else: + send_message( + update.effective_message, "ᴡʜᴀᴛ ᴀʀᴇ ʏᴏᴜ ᴛʀʏɪɴɢ ᴛᴏ ᴜɴʟᴏᴄᴋ ʙᴀʙʏ...?" + ) + + return "" + + +@run_async +@user_not_admin +def del_lockables(update, context): + chat = update.effective_chat # type: Optional[Chat] + message = update.effective_message # type: Optional[Message] + user = update.effective_user + if is_approved(chat.id, user.id): + return + for lockable, filter in LOCK_TYPES.items(): + if lockable == "rtl": + if sql.is_locked(chat.id, lockable) and can_delete(chat, context.bot.id): + if message.caption: + check = ad.detect_alphabet("{}".format(message.caption)) + if "ARABIC" in check: + try: + message.delete() + except BadRequest as excp: + if excp.message == "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + pass + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ ʟᴏᴄᴋᴀʙʟᴇs") + break + if message.text: + check = ad.detect_alphabet("{}".format(message.text)) + if "ARABIC" in check: + try: + message.delete() + except BadRequest as excp: + if excp.message == "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + pass + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ ʟᴏᴄᴋᴀʙʟᴇs") + break + continue + if lockable == "button": + if sql.is_locked(chat.id, lockable) and can_delete(chat, context.bot.id): + if message.reply_markup and message.reply_markup.inline_keyboard: + try: + message.delete() + except BadRequest as excp: + if excp.message == "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + pass + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ ʟᴏᴄᴋᴀʙʟᴇs") + break + continue + if lockable == "inline": + if sql.is_locked(chat.id, lockable) and can_delete(chat, context.bot.id): + if message and message.via_bot: + try: + message.delete() + except BadRequest as excp: + if excp.message == "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + pass + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ ʟᴏᴄᴋᴀʙʟᴇs") + break + continue + if ( + filter(update) + and sql.is_locked(chat.id, lockable) + and can_delete(chat, context.bot.id) + ): + if lockable == "bots": + new_members = update.effective_message.new_chat_members + for new_mem in new_members: + if new_mem.is_bot: + if not is_bot_admin(chat, context.bot.id): + send_message( + update.effective_message, + "I sᴇᴇ a ʙᴏᴛ ᴀɴᴅ I'ᴠᴇ ʙᴇᴇɴ ᴛᴏʟᴅ ᴛᴏ sᴛᴏᴘ ᴛʜᴇᴍ ғʀᴏᴍ ᴊᴏɪɴɪɴɢ..." + "ʙᴜᴛ I'ᴍ ɴᴏᴛ ᴀᴅᴍɪɴ!", + ) + return + + chat.kick_member(new_mem.id) + send_message( + update.effective_message, + "ᴏɴʟʏ ᴀᴅᴍɪɴs ᴀʀᴇ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴀᴅᴅ bots ɪɴ ᴛʜɪs ᴄʜᴀᴛ! ɢᴇᴛ ᴏᴜᴛᴛᴀ ʜᴇʀᴇ.", + ) + break + else: + try: + message.delete() + except BadRequest as excp: + if excp.message == "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + pass + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ ʟᴏᴄᴋᴀʙʟᴇs") + + break + + +def build_lock_message(chat_id): + locks = sql.get_locks(chat_id) + res = "" + locklist = [] + permslist = [] + if locks: + res += "*" + "ᴛʜᴇsᴇ ᴀʀᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ʟᴏᴄᴋs ɪɴ ᴛʜɪs ᴄʜᴀᴛ:" + "*" + if locks: + locklist.append("sticker = `{}`".format(locks.sticker)) + locklist.append("audio = `{}`".format(locks.audio)) + locklist.append("voice = `{}`".format(locks.voice)) + locklist.append("document = `{}`".format(locks.document)) + locklist.append("video = `{}`".format(locks.video)) + locklist.append("contact = `{}`".format(locks.contact)) + locklist.append("photo = `{}`".format(locks.photo)) + locklist.append("gif = `{}`".format(locks.gif)) + locklist.append("url = `{}`".format(locks.url)) + locklist.append("bots = `{}`".format(locks.bots)) + locklist.append("forward = `{}`".format(locks.forward)) + locklist.append("game = `{}`".format(locks.game)) + locklist.append("location = `{}`".format(locks.location)) + locklist.append("rtl = `{}`".format(locks.rtl)) + locklist.append("button = `{}`".format(locks.button)) + locklist.append("egame = `{}`".format(locks.egame)) + locklist.append("inline = `{}`".format(locks.inline)) + permissions = dispatcher.bot.get_chat(chat_id).permissions + permslist.append("media = `{}`".format(permissions.can_send_media_messages)) + permslist.append("poll = `{}`".format(permissions.can_send_polls)) + permslist.append("other = `{}`".format(permissions.can_send_other_messages)) + permslist.append("previews = `{}`".format(permissions.can_add_web_page_previews)) + permslist.append("info = `{}`".format(permissions.can_change_info)) + permslist.append("invite = `{}`".format(permissions.can_invite_users)) + permslist.append("pin = `{}`".format(permissions.can_pin_messages)) + + if locklist: + # Ordering lock list + locklist.sort() + # Building lock list string + for x in locklist: + res += "\n • {}".format(x) + res += "\n\n*" + "ᴛʜᴇsᴇ ᴀʀᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴄʜᴀᴛ ᴘᴇʀᴍɪssɪᴏɴs:" + "*" + for x in permslist: + res += "\n • {}".format(x) + return res + + +@run_async +@user_admin +@typing_action +def list_locks(update, context): + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user + + # Connection check + conn = connected(context.bot, update, chat, user.id, need_admin=True) + if conn: + chat = dispatcher.bot.getChat(conn) + chat_name = chat.title + else: + if update.effective_message.chat.type == "private": + send_message( + update.effective_message, + "ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ɪs ᴍᴇᴀɴᴛ ᴛᴏ use ɪɴ ɢʀᴏᴜᴘ ɴᴏᴛ ɪɴ ᴘᴍ", + ) + return "" + chat = update.effective_chat + chat_name = update.effective_message.chat.title + + res = build_lock_message(chat.id) + if conn: + res = res.replace("ʟᴏᴄᴋs ɪɴ", "*{}*".format(chat_name)) + + send_message(update.effective_message, res, parse_mode=ParseMode.MARKDOWN) + + +def get_permission_list(current, new): + permissions = { + "can_send_messages": None, + "can_send_media_messages": None, + "can_send_polls": None, + "can_send_other_messages": None, + "can_add_web_page_previews": None, + "can_change_info": None, + "can_invite_users": None, + "can_pin_messages": None, + } + permissions.update(current) + permissions.update(new) + new_permissions = ChatPermissions(**permissions) + return new_permissions + + +def __import_data__(chat_id, data): + # set chat locks + locks = data.get("locks", {}) + for itemlock in locks: + if itemlock in LOCK_TYPES: + sql.update_lock(chat_id, itemlock, locked=True) + elif itemlock in LOCK_CHAT_RESTRICTION: + sql.update_restriction(chat_id, itemlock, locked=True) + else: + pass + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + return build_lock_message(chat_id) + + +__help__ = """ +•➥ /locktypes*:* `ʟɪꜱᴛꜱ ᴀʟʟ ᴘᴏꜱꜱɪʙʟᴇ ʟᴏᴄᴋᴛʏᴘᴇꜱ` + +*ᴀᴅᴍɪɴꜱ ᴏɴʟʏ:* +•➥ /lock <type>*:* `ʟᴏᴄᴋ ɪᴛᴇᴍꜱ ᴏғ ᴀ ᴄᴇʀᴛᴀɪɴ ɴype (ɴᴏᴛ ᴀᴠᴀɪʟᴀʙʟᴇ ɪɴ ᴘʀɪᴠᴀᴛᴇ)` + +•➥ /unlock <type>*:* `ᴜɴʟᴏᴄᴋ ɪᴛᴇᴍꜱ ᴏғ ᴀ ᴄᴇʀᴛᴀɪɴ ᴛʏᴘᴇ (ɴᴏᴛ ᴀᴠᴀɪʟᴀʙʟᴇ ɪɴ ᴘʀɪᴠᴀᴛᴇ)` + +•➥ /locks*:* `ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ list ᴏғ ʟᴏᴄᴋꜱ ɪɴ ᴛʜɪꜱ ᴄʜᴀᴛ.` + +`ʟᴏᴄᴋꜱ ᴄᴀɴ ʙᴇ ᴜꜱᴇᴅ ᴛᴏ ʀᴇꜱᴛʀɪᴄᴛ ᴀ ɢʀᴏᴜᴘ ᴜꜱᴇʀꜱ.` + +`Locking ᴜʀʟs ᴡɪʟʟ ᴀᴜᴛᴏ-ᴅᴇʟᴇᴛᴇ ᴀʟʟ ᴍᴇssᴀɢᴇs ᴡɪᴛʜ ᴜʀʟs, ʟᴏᴄᴋɪɴɢ sᴛɪᴄᴋᴇʀs ᴡɪʟʟ ʀᴇsᴛʀɪᴄᴛ ᴀʟʟ` + +`ɴᴏɴ-ᴀᴅᴍɪɴ users ғʀᴏᴍ sᴇɴᴅɪɴɢ sᴛɪᴄᴋᴇʀs, ᴇᴛᴄ.` + +`ʟᴏᴄᴋɪɴɢ ʙᴏᴛs ᴡɪʟʟ sᴛᴏᴘ ɴᴏɴ-ᴀᴅᴍɪɴs ғʀᴏᴍ ᴀᴅᴅɪɴɢ ʙᴏᴛs ᴛᴏ ᴛʜᴇ ᴄʜᴀᴛ.` + +*ɴᴏᴛᴇ:* +•➥ ᴜɴʟᴏᴄᴋɪɴɢ ᴘᴇʀᴍɪssɪᴏɴ *ɪɴғᴏ* `ᴡɪʟʟ ᴀʟʟᴏᴡ ᴍᴇᴍʙᴇʀs (ɴᴏɴ-ᴀᴅᴍɪɴs) ᴛᴏ ᴄʜᴀɴɢᴇ ᴛʜᴇ ɢʀᴏᴜᴘ ɪɴғᴏʀᴍᴀᴛɪᴏɴ, sᴜᴄʜ ᴀs ᴛʜᴇ ᴅᴇsᴄʀɪᴘᴛɪᴏɴ ᴏʀ ᴛʜᴇ ɢʀᴏᴜᴘ ɴᴀᴍᴇ` + +•➥ ᴜɴʟᴏᴄᴋɪɴɢ ᴘᴇʀᴍɪssɪᴏɴ *ᴘɪɴ* `ᴡɪʟʟ ᴀʟʟᴏᴡ ᴍᴇᴍʙᴇʀs (ɴᴏɴ-ᴀᴅᴍɪɴs) ᴛᴏ ᴘɪɴɴᴇᴅ ᴀ ᴍᴇssᴀɢᴇ ɪɴ ᴀ ɢʀᴏᴜᴘ` + +""" + +__mod_name__ = "𝙻ᴏᴄᴋs" + +LOCKTYPES_HANDLER = DisableAbleCommandHandler("locktypes", locktypes, run_async=True) +LOCK_HANDLER = CommandHandler( + "lock", lock, pass_args=True, run_async=True +) # , filters=Filters.chat_type.groups) +UNLOCK_HANDLER = CommandHandler( + "unlock", unlock, pass_args=True, run_async=True +) # , filters=Filters.chat_type.groups) +LOCKED_HANDLER = CommandHandler( + "locks", list_locks, run_async=True +) # , filters=Filters.chat_type.groups) + +dispatcher.add_handler(LOCK_HANDLER) +dispatcher.add_handler(UNLOCK_HANDLER) +dispatcher.add_handler(LOCKTYPES_HANDLER) +dispatcher.add_handler(LOCKED_HANDLER) + +dispatcher.add_handler( + MessageHandler( + Filters.all & Filters.chat_type.groups, del_lockables, run_async=True + ), + PERM_GROUP, +) diff --git a/Exon/modules/log_channel.py b/Exon/modules/log_channel.py new file mode 100644 index 00000000..00373473 --- /dev/null +++ b/Exon/modules/log_channel.py @@ -0,0 +1,231 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 datetime import datetime +from functools import wraps + +from telegram.ext import CallbackContext + +from Exon.modules.helper_funcs.misc import is_module_loaded + +FILENAME = __name__.rsplit(".", 1)[-1] + +if is_module_loaded(FILENAME): + from telegram import ParseMode, Update + from telegram.error import BadRequest, Unauthorized + from telegram.ext import CommandHandler, JobQueue + from telegram.utils.helpers import escape_markdown + + from Exon import EVENT_LOGS, LOGGER, dispatcher + from Exon.modules.helper_funcs.chat_status import user_admin + from Exon.modules.sql import log_channel_sql as sql + + def loggable(func): + @wraps(func) + def log_action( + update: Update, + context: CallbackContext, + job_queue: JobQueue = None, + *args, + **kwargs, + ): + result = ( + func(update, context, job_queue, *args, **kwargs) + if job_queue + else func(update, context, *args, **kwargs) + ) + + chat = update.effective_chat + message = update.effective_message + + if result: + datetime_fmt = "%H:%M - %d-%m-%Y" + result += f"\n<b>ᴇᴠᴇɴᴛ sᴛᴀᴍᴘ</b>: <code>{datetime.utcnow().strftime(datetime_fmt)}</code>" + + if message.chat.type == chat.SUPERGROUP and message.chat.username: + result += f'\n<b>ʟɪɴᴋ:</b> <a href="https://t.me/{chat.username}/{message.message_id}">ᴄʟɪᴄᴋ ʜᴇʀᴇ</a>' + log_chat = sql.get_chat_log_channel(chat.id) + if log_chat: + send_log(context, log_chat, chat.id, result) + + return result + + return log_action + + def gloggable(func): + @wraps(func) + def glog_action(update: Update, context: CallbackContext, *args, **kwargs): + result = func(update, context, *args, **kwargs) + chat = update.effective_chat + message = update.effective_message + + if result: + datetime_fmt = "%ʜ:%ᴍ - %ᴅ%ᴍ%ʏ" + result += "\n<b>ᴇᴠᴇɴᴛ sᴛᴀᴍᴘ</b>: <code>{}</code>".format( + datetime.utcnow().strftime(datetime_fmt), + ) + + if message.chat.type == chat.SUPERGROUP and message.chat.username: + result += f'\n<b>Link:</b> <a href="https://t.me/{chat.username}/{message.message_id}">click here</a>' + log_chat = str(EVENT_LOGS) + if log_chat: + send_log(context, log_chat, chat.id, result) + + return result + + return glog_action + + def send_log( + context: CallbackContext, + log_chat_id: str, + orig_chat_id: str, + result: str, + ): + bot = context.bot + try: + bot.send_message( + log_chat_id, + result, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + except BadRequest as excp: + if excp.message == "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ": + bot.send_message( + orig_chat_id, + "ᴛʜɪs ʟᴏɢ ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ ᴅᴇʟᴇᴛᴇᴅ - ᴜɴsᴇᴛᴛɪɴɢ.", + ) + sql.stop_chat_logging(orig_chat_id) + else: + LOGGER.warning(excp.message) + LOGGER.warning(result) + LOGGER.exception("Could not parse") + + bot.send_message( + log_chat_id, + result + + "\n\nғᴏʀᴍᴀᴛᴛɪɴɢ ʜᴀs ʙᴇᴇɴ ᴅɪsᴀʙʟᴇᴅ ᴅᴜᴇ ᴛᴏ ᴀɴ ᴜɴᴇxᴘᴇᴄᴛᴇᴅ ᴇʀʀᴏʀ.", + ) + + @user_admin + def logging(update: Update, context: CallbackContext): + bot = context.bot + message = update.effective_message + chat = update.effective_chat + + if log_channel := sql.get_chat_log_channel(chat.id): + log_channel_info = bot.get_chat(log_channel) + message.reply_text( + f"ᴛʜɪs ɢʀᴏᴜᴘ has ᴀʟʟ ɪᴛ's ʟᴏɢs sᴇɴᴛ ᴛᴏ:" + f" {escape_markdown(log_channel_info.title)} (`{log_channel}`)", + parse_mode=ParseMode.MARKDOWN, + ) + + else: + message.reply_text("ɴᴏ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ sᴇᴛ ғᴏʀ ᴛʜɪs ɢʀᴏᴜᴘ!") + + @user_admin + def setlog(update: Update, context: CallbackContext): + bot = context.bot + message = update.effective_message + chat = update.effective_chat + if chat.type == chat.CHANNEL: + message.reply_text( + "ɴᴏᴡ, ғᴏʀᴡᴀʀᴅ ᴛʜᴇ /setlog ᴛᴏ ᴛʜᴇ ɢʀᴏᴜᴘ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴛɪᴇ ᴛʜɪs ᴄʜᴀɴɴᴇʟ ᴛᴏ !", + ) + + elif message.forward_from_chat: + sql.set_chat_log_channel(chat.id, message.forward_from_chat.id) + try: + message.delete() + except BadRequest as excp: + if excp.message != "ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + LOGGER.exception( + "ᴇʀʀᴏʀ ᴅᴇʟᴇᴛɪɴɢ ᴍᴇssᴀɢᴇ ɪɴ ʟᴏɢ ᴄʜᴀɴɴᴇʟ. sʜᴏᴜʟᴅ ᴡᴏʀᴋ ᴀɴʏᴡᴀʏ ᴛʜᴏᴜɢʜ.", + ) + + try: + bot.send_message( + message.forward_from_chat.id, + f"ᴛʜɪs ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ sᴇᴛ ᴀs ᴛʜᴇ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ғᴏʀ {chat.title or chat.first_name}.", + ) + except Unauthorized as excp: + if excp.message == "ғᴏʀʙɪᴅᴅᴇɴ: ʙᴏᴛ ɪs ɴᴏᴛ ᴀ ᴀᴅᴍɪɴr ᴏғ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ ᴄʜᴀᴛ": + bot.send_message(chat.id, "sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴛ ʟᴏɢ ᴄʜᴀɴɴᴇʟ!") + else: + LOGGER.exception("ᴇʀʀᴏʀ ɪɴ sᴇᴛᴛɪɴɢ ᴛʜᴇ ʟᴏɢ ᴄʜᴀɴɴᴇʟ.") + + bot.send_message(chat.id, "sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴛ ʟᴏɢ ᴄʜᴀɴɴᴇʟ!") + + else: + message.reply_text( + "ᴛʜᴇ sᴛᴇᴘs ᴛᴏ sᴇᴛ ᴀ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ᴀʀᴇ:\n" + " - ᴀᴅᴅ ʙᴏᴛ ᴛᴏ ᴛʜᴇ ᴅᴇsɪʀᴇᴅ ᴄʜᴀɴɴᴇʟ\n" + " - sᴇɴᴅ /setlog ᴛᴏ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ\n" + " - ғᴏʀᴡᴀʀᴅ ᴛʜᴇ /setlog ᴛᴏ ᴛʜᴇ ɢʀᴏᴜᴘ\n", + ) + + @user_admin + def unsetlog(update: Update, context: CallbackContext): + bot = context.bot + message = update.effective_message + chat = update.effective_chat + + if log_channel := sql.stop_chat_logging(chat.id): + bot.send_message( + log_channel, + f"ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ ᴜɴʟɪɴᴋᴇᴅ ғʀᴏᴍ {chat.title}", + ) + message.reply_text("ʟᴏɢ ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ ᴜɴ-sᴇᴛ.") + + else: + message.reply_text("ɴᴏ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ʜᴀs ʙᴇᴇɴ sᴇᴛ ʏᴇᴛ!") + + def __stats__(): + return f"•➥ {sql.num_logchannels()} ʟᴏɢ ᴄʜᴀɴɴᴇʟs sᴇᴛ." + + def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + def __chat_settings__(chat_id, user_id): + if log_channel := sql.get_chat_log_channel(chat_id): + log_channel_info = dispatcher.bot.get_chat(log_channel) + return f"ᴛʜɪs ɢʀᴏᴜᴘ ʜᴀs ᴀʟʟ it's ʟᴏɢs sᴇɴᴛ ᴛᴏ: {escape_markdown(log_channel_info.title)} (`{log_channel}`)" + return "ɴᴏ ʟᴏɢ ᴄʜᴀɴɴᴇʟ ɪs sᴇᴛ ғᴏʀ ᴛʜɪs ɢʀᴏᴜᴘ!" + + LOG_HANDLER = CommandHandler("logchannel", logging, run_async=True) + SET_LOG_HANDLER = CommandHandler("setlog", setlog, run_async=True) + UNSET_LOG_HANDLER = CommandHandler("unsetlog", unsetlog, run_async=True) + + dispatcher.add_handler(LOG_HANDLER) + dispatcher.add_handler(SET_LOG_HANDLER) + dispatcher.add_handler(UNSET_LOG_HANDLER) + +else: + # run anyway if module not loaded + def loggable(func): + return func + + def gloggable(func): + return func diff --git a/Exon/modules/logomaker.py b/Exon/modules/logomaker.py new file mode 100644 index 00000000..a23b52a7 --- /dev/null +++ b/Exon/modules/logomaker.py @@ -0,0 +1,336 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import glob +import io +import os +import random + +import requests +from PIL import Image, ImageDraw, ImageFont + +from Exon import BOT_USERNAME, OWNER_ID, SUPPORT_CHAT, telethn +from Exon.events import register + +LOGO_LINKS = [ + "https://telegra.ph/file/d1838efdafce9fe611d0c.jpg", + "https://telegra.ph/file/c1ff2d5ec5e1b5bd1b200.jpg", + "https://telegra.ph/file/08c5fbe14cc4b13d1de05.jpg", + "https://telegra.ph/file/66614a049d74fe2a220dc.jpg", + "https://telegra.ph/file/9cc1e4b24bfa13873bd66.jpg", + "https://telegra.ph/file/792d38bd74b0c3165c11d.jpg", + "https://telegra.ph/file/e1031e28a4aa4d8bd7c9b.jpg", + "https://telegra.ph/file/2be9027c55b5ed463fc18.jpg", + "https://telegra.ph/file/9fd71f8d08158d0cc393c.jpg", + "https://telegra.ph/file/627105074f0456f42058b.jpg", + "https://telegra.ph/file/62b712f741382d3c171cd.jpg", + "https://telegra.ph/file/496651e0d5e4d22b8f72d.jpg", + "https://telegra.ph/file/6619d0eee2c35e022ee74.jpg", + "https://telegra.ph/file/f72fcb27c9b1e762d184b.jpg", + "https://telegra.ph/file/01eac0fe1a722a864d7de.jpg", + "https://telegra.ph/file/bdcb746fbfdf38f812873.jpg", + "https://telegra.ph/file/d13e036a129df90651deb.jpg", + "https://telegra.ph/file/ab6715ce9a63523bd0219.jpg", + "https://telegra.ph/file/c243f4e80ebf0110f9f00.jpg", + "https://telegra.ph/file/ff9053f2c7bfb2badc99e.jpg", + "https://telegra.ph/file/00b9ebbb816285d9a59f9.jpg", + "https://telegra.ph/file/ad92e1c829d14afa25cf2.jpg", + "https://telegra.ph/file/58d45cc3374e7b28a1e67.jpg", + "https://telegra.ph/file/4140a0b3f27c302fd81cb.jpg", + "https://telegra.ph/file/c4db2b5c84c1d90f5ac8a.jpg", + "https://telegra.ph/file/c0da5080a3ff7643ddeb4.jpg", + "https://telegra.ph/file/79fad473ffe888ed771b2.jpg", + "https://telegra.ph/file/eafd526d9dcc164d7269f.jpg", + "https://telegra.ph/file/98b50e8424dd2be9fc127.jpg", + "https://telegra.ph/file/c1ad29c189162a1404749.jpg", + "https://telegra.ph/file/2d288450ebecc500addbd.jpg", + "https://telegra.ph/file/9715353976a99becd7632.jpg", + "https://telegra.ph/file/87670b02a1004bc02bd8d.jpg", + "https://telegra.ph/file/70789cd69114939a78242.jpg", + "https://telegra.ph/file/1566bd334f00645cfa993.jpg", + "https://telegra.ph/file/9727c37bb8c633208b915.jpg", + "https://telegra.ph/file/27467ef55fab117ccb278.jpg", + "https://telegra.ph/file/b9c62ff7810d9e84e9e2c.jpg", + "https://telegra.ph/file/87d22f2c95413059dda4e.jpg", + "https://telegra.ph/file/e528a731accbcdea140e3.jpg", + "https://telegra.ph/file/ee3f20c3ce71dc37fecb2.jpg", + "https://telegra.ph/file/a049f78377a5b8257294d.jpg", + "https://telegra.ph/file/54d22d39ea89423b7533f.jpg", + "https://telegra.ph/file/d90baa59b6fe2bc3091d3.jpg", + "https://telegra.ph/file/b9b3f80dc4635faaeb472.jpg", + "https://telegra.ph/file/d64be0a98f441a33d2aef.jpg", + "https://telegra.ph/file/e2c59ac97a900bab5ad7d.jpg", + "https://telegra.ph/file/41baf461b0a34f1a881a9.jpg", + "https://telegra.ph/file/8d4082052b4bd0a8cc862.jpg", + "https://telegra.ph/file/e7d6e0c511137ad67d843.jpg", + "https://telegra.ph/file/d7b97ea806d4a905b71c4.jpg", + "https://telegra.ph/file/6bec48ea2c96cf3d668a4.jpg", + "https://telegra.ph/file/aa64389b70e0de02d18c5.jpg", + "https://telegra.ph/file/2f75d964a59a3a4ae90e0.jpg", + "https://telegra.ph/file/f408df72c57cfc05e734f.jpg", + "https://telegra.ph/file/9d88d9dfb50106bc43c91.jpg", + "https://telegra.ph/file/a5a6e0f9d172fa386621e.jpg", + "https://telegra.ph/file/b0fc771c91409ee5cd4dc.jpg", + "https://telegra.ph/file/b0fc771c91409ee5cd4dc.jpg", + "https://telegra.ph/file/f75e59ebd4059f394479e.jpg", + "https://telegra.ph/file/fc0308f59023d0c997166.jpg", + "https://telegra.ph/file/7e1c04947f6afb6cdf25c.jpg", + "https://telegra.ph/file/6279bb4be7e48da194353.jpg", + "https://telegra.ph/file/616784fcd89f13e789685.jpg", + "https://telegra.ph/file/803e7dd9fafdb086bce4a.jpg", + "https://telegra.ph/file/d7338861b7f996ec9d40d.jpg", + "https://telegra.ph/file/828730cd4d73333eaf129.jpg", + "https://telegra.ph/file/36c9321161d49c4b3d671.jpg", + "https://telegra.ph/file/ebeae90b99fe482d11784.jpg", + "https://telegra.ph/file/70f38f92fe8d3060a31e4.jpg", + "https://telegra.ph/file/db12cf905f557487abc60.jpg", + "https://telegra.ph/file/0f9be531164c927ded8ec.jpg", + "https://telegra.ph/file/57fb7a6df3d666878c6f3.jpg", + "https://telegra.ph/file/242930d9f7aaa0b0729fd.jpg", + "https://telegra.ph/file/883f255792d2c2ebdd5f5.jpg", + "https://telegra.ph/file/36a9c0c26967edf90d42d.jpg", + "https://telegra.ph/file/03bdaf253c43fc97adbbe.jpg", + "https://telegra.ph/file/5826715ff0895a5321d2d.jpg", + "https://telegra.ph/file/74807bfbc85057899ea8d.png", + "https://telegra.ph/file/e390f7531557c12379acb.jpg", + "https://telegra.ph/file/0b83432e72bb0ce0ed0f1.jpg", + "https://telegra.ph/file/23276d7f831611e347a7c.jpg", + "https://telegra.ph/file/109789c7dcc615c6731fa.jpg", + "https://telegra.ph/file/127ef2c311b42b2dbfb62.jpg", + "https://telegra.ph/file/bfd7fcd13b2c353030ef0.jpg", + "https://telegra.ph/file/0f7773c27b1379e2f3bea.jpg", + "https://telegra.ph/file/4606e5c76a4a6c893a721.png", + "https://telegra.ph/file/f46c4569d77d9a6be6aed.jpg", + "https://telegra.ph/file/2b4718637a7396e3b23d9.jpg", + "https://telegra.ph/file/40bce3c8e8ae3cd0198b9.jpg", + "https://telegra.ph/file/ac61cfac3290ed635f8cc.jpg", + "https://telegra.ph/file/55313171c70692e838451.jpg", + "https://telegra.ph/file/f503ce00794cadbdacdd2.jpg", + "https://telegra.ph/file/2153d9fad3613041fcd28.jpg", + "https://telegra.ph/file/6a7a790fe964c8c264b61.jpg", + "https://telegra.ph/file/103d2f4b7b1088890ae24.jpg", + "https://telegra.ph/file/63501bb4f1de53a81dba1.jpg", + "https://telegra.ph/file/00fdb4e3a06a6f6e81c35.jpg", + "https://telegra.ph/file/e2fbfce637048d2e042da.jpg", + "https://telegra.ph/file/29d3c7c297c40a17cde4b.jpg", + "https://telegra.ph/file/97c7aa91c51f72f82c2d9.jpg", + "https://telegra.ph/file/0096988891ba9b884d2dd.jpg", + "https://telegra.ph/file/12cb5cb6512b754deb92d.jpg", + "https://telegra.ph/file/38387c8384879e0ddb803.jpg", + "https://telegra.ph/file/3353253a27522219cc1ce.jpg", + "https://telegra.ph/file/daae7def66cb1d1aefa23.jpg", + "https://telegra.ph/file/e5fe618ad651777061c54.jpg", + "https://telegra.ph/file/3c56aa160ec242b1670eb.jpg", + "https://telegra.ph/file/0794ddfefdc770646c478.jpg", + "https://telegra.ph/file/05bc05a4b878e54ed3b20.jpg", + "https://telegra.ph/file/ef7ffbd3839645e33a0ec.jpg", + "https://telegra.ph/file/1daa50b9d3e26a5509cc2.png", + "https://telegra.ph/file/510600a5b93d83ce048f3.jpg", + "https://telegra.ph/file/0ede8bd4788327111ecbf.jpg", + "https://telegra.ph/file/e9f546797e42e821a91e1.jpg", + "https://telegra.ph/file/fc7fbefe92599bd79d038.jpg", + "https://telegra.ph/file/b88d6e78e206eb73e2e54.jpg", + "https://telegra.ph/file/48f8c62829953e82441e8.jpg", + "https://telegra.ph/file/56f7b34cae98a491e2b35.jpg", + "https://telegra.ph/file/9c23b4302926d40c46e12.jpg", + "https://telegra.ph/file/9bf850ea98a2b252ff233.jpg", + "https://telegra.ph/file/e764f0b3e2ecc56167803.jpg", + "https://telegra.ph/file/289f9cebe37f31a943f98.jpg", + "https://telegra.ph/file/0c647be0f5a48d576d692.jpg", + "https://telegra.ph/file/41c5b44c4f5978828b5b5.jpg", + "https://telegra.ph/file/9cdce279bdf240a933c14.jpg", + "https://telegra.ph/file/f20424687f94e9c285133.jpg", + "https://telegra.ph/file/e7858eb025e1ddb2f6267.jpg", + "https://telegra.ph/file/3e984aa5ab96df166f2a4.jpg", + "https://telegra.ph/file/e43e28aa952eaee6a5315.jpg", + "https://telegra.ph/file/6d222dcaf9ba1072c6062.jpg", + "https://telegra.ph/file/21e696bbefcfe39c6e74e.jpg", + "https://telegra.ph/file/64ec61e41da3d4aded33d.jpg", + "https://telegra.ph/file/5b1d8766504ff75c1bd1f.jpg", + "https://telegra.ph/file/731879a344b3b49fe51bd.jpg", + "https://telegra.ph/file/6221afc84b357ed0d1fc5.jpg", + "https://telegra.ph/file/499bb1117771d8c020038.jpg", + "https://telegra.ph/file/2690d73bc32cfdb986629.jpg", + "https://telegra.ph/file/21255de971701b9df0902.jpg", + "https://telegra.ph/file/434a35e7fe5e2c000c598.jpg", + "https://telegra.ph/file/22a5d3621aba0b370d0b6.png", + "https://telegra.ph/file/ae31845d1df2c4a84915b.png", + "https://telegra.ph/file/ae2b809c8d11e7fa4121d.png", + "https://telegra.ph/file/ccb7f3113994d5d2b26f6.png", + "https://telegra.ph/file/5e53f0257ff12a7b0737a.png", + "https://telegra.ph/file/a613600a9f9f8ee29f0f7.jpg", + "https://telegra.ph/file/129c14fada1a8c0b151f5.jpg", + "https://telegra.ph/file/c7552ed4246ccd8efd301.jpg", + "https://telegra.ph/file/e794f772243d46467bcce.jpg", + "https://telegra.ph/file/b6c43b9bd63f5f764d60b.jpg", + "https://telegra.ph/file/11585459a3950de7f307c.png", + "https://telegra.ph/file/37cde08802c3cea25a03f.jpg", + "https://telegra.ph/file/d8d2db623223dee65963e.png", + "https://telegra.ph/file/b7229017ffee2d814c646.jpg", + "https://telegra.ph/file/65630efca60bfbdf84bc9.jpg", + "https://telegra.ph/file/b8ce571c2f66a7c7070e5.jpg", + "https://telegra.ph/file/a39f63f61f143ec00f19f.jpg", + "https://telegra.ph/file/f7d946d8caaa21bf96dbf.jpg", + "https://telegra.ph/file/9e4bef8ae0725d6b62108.png", + "https://telegra.ph/file/3550089b22f3c8f506226.jpg", + "https://telegra.ph/file/4275a4d4d6d433406b5fa.jpg", + "https://telegra.ph/file/c476583ff55e1947461ad.jpg", + "https://telegra.ph/file/87d2e5c0170ead00a2bc2.jpg", + "https://telegra.ph/file/5027dd7379cc432c06e73.jpg", + "https://telegra.ph/file/9e447fcaf3c66ddefb603.jpg", + "https://telegra.ph/file/e5375f8233bea4f74b0f8.jpg", + "https://telegra.ph/file/a1297510a64733cc5845f.jpg", + "https://telegra.ph/file/ff04b594b699ce72316d7.jpg", + "https://telegra.ph/file/093836a52cb166f161819.jpg", + "https://telegra.ph/file/1e64bae43ca10d628ff6d.jpg", + "https://telegra.ph/file/678ff9bb3405158a9155e.jpg", + "https://telegra.ph/file/ab332ced3f63b96c375c5.jpg", + "https://telegra.ph/file/a736d6cac93294c323303.jpg", + "https://telegra.ph/file/dce8565bf7742f3d7122b.jpg", + "https://telegra.ph/file/3f97672eb7b50426d15ff.jpg", + "https://telegra.ph/file/19c6250369f8588a169c7.jpg", + "https://telegra.ph/file/13d53b03a48448156564c.jpg", + "https://telegra.ph/file/d21ff0d35553890e8cf34.jpg", + "https://telegra.ph/file/a5e4cb43178642ba3709d.jpg", + "https://telegra.ph/file/ecf108d25a6f5f56f91f4.jpg", + "https://telegra.ph/file/8bd2b561b4c1f7164f934.png", + "https://telegra.ph/file/7717658e6930c8196a904.jpg", + "https://telegra.ph/file/dc85d43c4fc5062de7274.jpg", + "https://telegra.ph/file/ff05c19f228ab2ed3d39d.jpg", + "https://telegra.ph/file/ff05c19f228ab2ed3d39d.jpg", + "https://telegra.ph/file/0d686bfffcb92a2fbdb0f.jpg", + "https://telegra.ph/file/0d686bfffcb92a2fbdb0f.jpg", + "https://telegra.ph/file/cdc66f16fbfb75971df2f.jpg", + "https://telegra.ph/file/5c575892b9f9534fd4f31.jpg", + "https://telegra.ph/file/78ffc400d4f3236b00e6b.jpg", + "https://telegra.ph/file/89d32e5bbf084a376c803.jpg", + "https://telegra.ph/file/b5d7dbcdce241013a061b.jpg", + "https://telegra.ph/file/c1d228bc1859213d258d7.jpg", + "https://telegra.ph/file/c6b0720b9f765809ea20a.jpg", + "https://telegra.ph/file/df7e648f2e68ff8e1a1e6.jpg", + "https://telegra.ph/file/5148f764cbc4700519909.jpg", + "https://telegra.ph/file/479e7f51c682dcd1f013f.jpg", + "https://telegra.ph/file/54a9eb0afe7a0f9c7c2f3.jpg", + "https://telegra.ph/file/73c52ee54567a61dac47a.jpg", + "https://telegra.ph/file/1427dbba81bd21b1bfc56.jpg", + "https://telegra.ph/file/1427dbba81bd21b1bfc56.jpg", + "https://telegra.ph/file/b0816374b470a5f9c66a6.jpg", + "https://telegra.ph/file/e10840ec9bea9bbfaff0e.jpg", + "https://telegra.ph/file/5935275d3ee09bc5a47b8.png", + "https://telegra.ph/file/c27e64f1e8ece187c8161.jpg", + "https://telegra.ph/file/055e9af8500ab92755358.jpg", + "https://telegra.ph/file/f18f71167f9318ea28571.jpg", + "https://telegra.ph/file/e2e26f252a5e25a1563c5.jpg", + "https://telegra.ph/file/47ccb13820d6fc54d872b.jpg", + "https://telegra.ph/file/f2ddccd28ceaeae90b2a3.jpg", + "https://telegra.ph/file/951c872f7f8d551995652.jpg", + "https://telegra.ph/file/8e8842f9fe207b8abd951.jpg", + "https://telegra.ph/file/8a14ecd2347ef88e81201.jpg", + "https://telegra.ph/file/b3869374ce0af9f26f92a.jpg", + "https://telegra.ph/file/8e17f8d3633a5696a1ccf.jpg", + "https://telegra.ph/file/b29d8956ae249773b0ec7.png", + "https://telegra.ph/file/d0eebe724b67d2ef7647e.jpg", + "https://telegra.ph/file/5780b3273162d2b9ba9ec.jpg", + "https://telegra.ph/file/e2d56d5dbb108ba7af20c.jpg", + "https://telegra.ph/file/1a4f50dd1e4ec9f04bfa1.jpg", + "https://telegra.ph/file/99b56305fa9c50767f574.jpg", + "https://telegra.ph/file/0859e0104c671bc9b6b7d.jpg", + "https://telegra.ph/file/b3af2980caf7040702171.jpg", + "https://telegra.ph/file/14be160df3b84c59e268e.jpg", + "https://telegra.ph/file/b958155e1e8e9ab9a0416.jpg", + "https://telegra.ph/file/24fff051c39b815e5078a.jpg", + "https://telegra.ph/file/258c02c002e89287d5d9b.jpg", + "https://telegra.ph/file/d2abc99773a9d4954c2ba.jpg", + "https://telegra.ph/file/9849b3940f063b065f4e3.jpg", +] + + +@register(pattern="^/logo ?(.*)") +async def lego(event): + + quew = event.pattern_match.group(1) + + if event.sender_id != OWNER_ID and not quew: + await event.reply("ᴘʟᴇᴀsᴇ ɢɪᴍᴍɪᴇ ᴀ ᴛᴇxᴛ ғᴏʀ ᴛʜᴇ ʟᴏɢᴏ.") + + return + + pesan = await event.reply("ʟᴏɢᴏ ɪɴ ᴀ ᴘʀᴏᴄᴇss. ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ....") + + try: + + text = event.pattern_match.group(1) + + randc = random.choice(LOGO_LINKS) + + img = Image.open(io.BytesIO(requests.get(randc).content)) + + draw = ImageDraw.Draw(img) + + image_widthz, image_heightz = img.size + + fnt = glob.glob("./Exon/utils/Logo/*") + + randf = random.choice(fnt) + + font = ImageFont.truetype(randf, 120) + + w, h = draw.textsize(text, font=font) + + h += int(h * 0.21) + + image_width, image_height = img.size + + draw.text( + ((image_widthz - w) / 2, (image_heightz - h) / 2), + text, + font=font, + fill=(255, 255, 255), + ) + + x = (image_widthz - w) / 2 + + y = (image_heightz - h) / 2 + 6 + + draw.text( + (x, y), text, font=font, fill="white", stroke_width=1, stroke_fill="black" + ) + + fname = "Exon.png" + + img.save(fname, "png") + + await telethn.send_file( + event.chat_id, file=fname, caption=f"ᴍᴀᴅᴇ ʙʏ @{BOT_USERNAME}" + ) + + await pesan.delete() + + if os.path.exists(fname): + + os.remove(fname) + + except Exception as e: + + await event.reply(f"ᴇʀʀᴏʀ, ʀᴇᴘᴏʀᴛ @{SUPPORT_CHAT}, {e}") diff --git a/Exon/modules/misc.py b/Exon/modules/misc.py new file mode 100644 index 00000000..9e199adf --- /dev/null +++ b/Exon/modules/misc.py @@ -0,0 +1,413 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 contextlib +import datetime +import html +import platform +import time +from io import BytesIO +from platform import python_version +from subprocess import PIPE, Popen + +from psutil import boot_time, cpu_percent, disk_usage, virtual_memory +from telegram import Chat, MessageEntity, ParseMode, Update, User +from telegram import __version__ as ptbver +from telegram.error import BadRequest +from telegram.ext import CallbackContext, Filters +from telegram.utils.helpers import escape_markdown, mention_html + +import Exon.modules.sql.users_sql as sql +from Exon import DEMONS as SUPPORT_USERS +from Exon import DEV_USERS +from Exon import DRAGONS as SUDO_USERS +from Exon import INFOPIC, OWNER_ID +from Exon import OWNER_USERNAME as AKBOSS +from Exon import TIGERS +from Exon import WOLVES as WHITELIST_USERS +from Exon import StartTime, dispatcher, sw +from Exon.__main__ import STATS, USER_INFO +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import sudo_plus, user_admin +from Exon.modules.helper_funcs.decorators import Exoncmd +from Exon.modules.helper_funcs.extraction import extract_user +from Exon.modules.users import __user_info__ as chat_count + +MARKDOWN_HELP = f""" +ᴍᴀʀᴋᴅᴏᴡɴ ɪs ᴀ ᴠᴇʀʏ ᴘᴏᴡᴇʀғᴜʟ ғᴏʀᴍᴀᴛᴛɪɴɢ ᴛᴏᴏʟ sᴜᴘᴘᴏʀᴛᴇᴅ ʙʏ ᴛᴇʟᴇɢʀᴀᴍ. {dispatcher.bot.first_name} ʜᴀs sᴏᴍᴇ ᴇɴʜᴀɴᴄᴇᴍᴇɴᴛs, ᴛᴏ ᴍᴀᴋᴇ sᴜʀᴇ ᴛʜᴀᴛ \ +sᴀᴠᴇᴅ ᴍᴇssᴀɢᴇs ᴀʀᴇ ᴄᴏʀʀᴇᴄᴛʟʏ ᴘᴀʀsᴇᴅ, ᴀɴᴅ ᴛᴏ ᴀʟʟᴏᴡ ʏᴏᴜ ᴛᴏ ᴄʀᴇᴀᴛᴇ ʙᴜᴛᴛᴏɴs. + +❂ <code>_italic_</code>: wrapping text with '_' will produce italic text +❂ <code>*bold*</code>: wrapping text with '*' will produce bold text +❂ <code>`code`</code>: wrapping text with '`' will produce monospaced text, also known as 'code' +❂ <code>[sometext](someURL)</code>: this will create a link - the message will just show <code>sometext</code>, \ +ᴀɴᴅ ᴛᴀᴘᴘɪɴɢ ᴏɴ ɪᴛ ᴡɪʟʟ ᴏᴘᴇɴ ᴛʜᴇ ᴘᴀɢᴇ ᴀᴛ <code>someURL</code>. +<b>ᴇxᴀᴍᴘʟᴇ:</b><code>[test](example.com)</code> + +❂ <code>[buttontext](buttonurl:someURL)</code>: this is a special enhancement to allow users to have telegram \ +buttons in their markdown. <code>buttontext</code> will be what is displayed on the button, and <code>someurl</code> \ + +ᴡɪʟʟ be ᴛʜᴇ ᴜʀʟ ᴡʜɪᴄʜ ɪs ᴏᴘᴇɴᴇᴅ. + +<b>ᴇxᴀᴍᴘʟᴇ:</b> <code>[ᴛʜɪs ɪs ᴀ ʙᴜᴛᴛᴏɴ](buttonurl:example.com)</code> + +If you want multiple buttons on the same line, use :same, as such: +<code>[one](buttonurl://example.com) +[two](buttonurl://google.com:same)</code> + +ᴛʜɪs ᴡɪʟʟ ᴄʀᴇᴀᴛᴇ ᴛᴡᴏ ʙᴜᴛᴛᴏɴs ᴏɴ ᴀ sɪɴɢʟᴇ ʟɪɴᴇ, ɪɴsᴛᴇᴀᴅ ᴏғ ᴏɴᴇ ʙᴜᴛᴛᴏɴ ᴘᴇʀ ʟɪɴᴇ. + +Keep in mind that your message <b>MUST</b> contain some text other than just a button! +""" + + +@Exoncmd(command="gifid") +def gifid(update: Update, _): + msg = update.effective_message + if msg.reply_to_message and msg.reply_to_message.animation: + update.effective_message.reply_text( + f"ɢɪғ ɪᴅ:\n<code>{msg.reply_to_message.animation.file_id}</code>", + parse_mode=ParseMode.HTML, + ) + else: + update.effective_message.reply_text("ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴛᴏ ᴀ ɢɪғ ᴛᴏ ɢᴇᴛ ɪᴛs ID.") + + +@Exoncmd(command="info", pass_args=True) +def info(update: Update, context: CallbackContext): # sourcery no-metrics + bot = context.bot + args = context.args + message = update.effective_message + chat = update.effective_chat + if user_id := extract_user(update.effective_message, args): + user = bot.get_chat(user_id) + + elif not message.reply_to_message and not args: + user = ( + message.sender_chat + if message.sender_chat is not None + else message.from_user + ) + + elif not message.reply_to_message and ( + not args + or ( + len(args) >= 1 + and not args[0].startswith("@") + and not args[0].lstrip("-").isdigit() + and not message.parse_entities([MessageEntity.TEXT_MENTION]) + ) + ): + message.reply_text("I ᴄᴀɴ'ᴛ ᴇxᴛʀᴀᴄᴛ ᴀ ᴜsᴇʀ ғʀᴏᴍ ᴛʜɪs.") + return + + else: + return + + if hasattr(user, "type") and user.type != "private": + text = get_chat_info(user) + is_chat = True + else: + text = get_user_info(chat, user) + is_chat = False + + if INFOPIC: + if is_chat: + try: + pic = user.photo.big_file_id + pfp = bot.get_file(pic).download(out=BytesIO()) + pfp.seek(0) + message.reply_document( + document=pfp, + filename=f"{user.id}.jpg", + caption=text, + parse_mode=ParseMode.HTML, + ) + except AttributeError: # AttributeError means no chat pic so just send text + message.reply_text( + text, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + else: + try: + profile = bot.get_user_profile_photos(user.id).photos[0][-1] + _file = bot.get_file(profile["file_id"]) + + _file = _file.download(out=BytesIO()) + _file.seek(0) + + message.reply_document( + document=_file, + caption=(text), + parse_mode=ParseMode.HTML, + ) + + # Incase user don't have profile pic, send normal text + except IndexError: + message.reply_text( + text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + ) + + else: + message.reply_text( + text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + ) + + +def get_user_info(chat: Chat, user: User) -> str: + bot = dispatcher.bot + text = ( + f"╒═══「<b> ᴀɴᴀʟʏᴢᴇᴅ ʀᴇsᴜʟᴛs:</b> 」\n" + f"✦ ᴜsᴇʀ ID: <code>{user.id}</code>\n" + f"✦ ғɪʀsᴛ ɴᴀᴍᴇ: {html.escape(user.first_name)}" + ) + if user.last_name: + text += f"\n✦ ʟᴀsᴛ ɴᴀᴍᴇ: {html.escape(user.last_name)}" + if user.username: + text += f"\n✦ ᴜsᴇʀɴᴀᴍᴇ: @{html.escape(user.username)}" + text += f"\n✦ ᴜsᴇʀ ʟɪɴᴋ: {mention_html(user.id, 'link')}" + with contextlib.suppress(Exception): + if spamwtc := sw.get_ban(int(user.id)): + text += "<b>\n\nsᴘᴀᴍᴡᴀᴛᴄʜ:\n</b>" + text += "<b>ᴛʜɪs ᴘᴇʀsᴏɴ is ʙᴀɴɴᴇᴅ ɪɴ sᴘᴀᴍᴡᴀᴛᴄʜ!</b>" + text += f"\nʀᴇᴀsᴏɴ: <pre>{spamwtc.reason}</pre>" + text += "\nAppeal ᴀᴛ @SpamWatchSupport" + else: + text += "<b>\n\nSpamWatch:</b> Not banned" + disaster_level_present = False + num_chats = sql.get_user_num_chats(user.id) + text += f"\n\n<b>ᴄʜᴀᴛ ᴄᴏᴜɴᴛ</b>: <code>{num_chats}</code>" + with contextlib.suppress(BadRequest): + user_member = chat.get_member(user.id) + if user_member.status == "administrator": + result = bot.get_chat_member(chat.id, user.id) + if result.custom_title: + text += ( + f"\n\nᴛʜɪs ᴜsᴇʀ ʜᴏʟᴅs ᴛʜᴇ ᴛɪᴛʟᴇ <b>{result.custom_title}</b> ʜᴇʀᴇ." + ) + if user.id == OWNER_ID: + text += "\n\n<code>ᴏᴜʀ ᴄᴜᴛᴇ ᴏᴡɴᴇʀ </code> :3" + disaster_level_present = True + elif user.id in DEV_USERS: + text += "\n\n<code>ᴛʜɪs ᴜsᴇʀ ɪs a ᴘᴀʀᴛ ᴏғ ᴏᴜʀ ғᴀᴍɪʟʏ</code> " + disaster_level_present = True + elif user.id in SUDO_USERS: + text += "\n\n<code>ᴏɴᴇ ᴏғ ᴏᴜʀ ʙᴇsᴛᴏ ғʀɪᴇɴᴅᴏs, ᴛᴏᴜᴄʜ ʜɪᴍ ᴀɴᴅ ʏᴏᴜ ᴀʀᴇ ᴅᴇᴀᴅ ᴍᴇᴀᴛ</code>" + disaster_level_present = True + elif user.id in SUPPORT_USERS: + text += "\n\n<code>ᴛʜɪs user is ᴏᴜʀ ғʀɪᴇɴᴅ</code> ✨" + disaster_level_present = True + elif user.id in TIGERS: + text += "\n\n<code>ᴏɴᴇ ᴏғ ᴍʏ ᴄʟᴀssᴍᴀᴛᴇs</code> :p" + disaster_level_present = True + elif user.id in WHITELIST_USERS: + text += "\n\n<code>ᴍᴇᴍʙᴇʀ ᴏғ Exon ᴛᴇᴄʜ, ᴛᴏᴛᴀʟʟʏ ᴄᴏᴏʟ ʀɪɢʜᴛ ?</code>" + disaster_level_present = True + if disaster_level_present: + text += ' [<a href="https://t.me/abishnoi_bots/60">?</a>]' + text += "\n" + for mod in USER_INFO: + if mod.__mod_name__ == "Users": + continue + + try: + mod_info = mod.__user_info__(user.id) + except TypeError: + mod_info = mod.__user_info__(user.id, chat.id) + if mod_info: + text += "\n" + mod_info + return text + + +def get_chat_info(user): + text = f"<b>ᴄʜᴀᴛ ɪɴғᴏʀᴍᴀᴛɪᴏɴ:</b>\n" f"<b>ᴄʜᴀᴛ ᴛɪᴛʟᴇ:</b> {user.title}" + if user.username: + text += f"\n<b>ᴜsᴇʀɴᴀᴍᴇ:</b> @{html.escape(user.username)}" + text += f"\n<b>ᴄʜᴀᴛ ɪᴅ:</b> <code>{user.id}</code>" + text += f"\n<b>ᴄʜᴀᴛ ᴛʏᴘᴇ:</b> {user.type.capitalize()}" + text += "\n" + chat_count(user.id) + + return text + + +def shell(command): + process = Popen(command, stdout=PIPE, shell=True, stderr=PIPE) + stdout, stderr = process.communicate() + return (stdout, stderr) + + +@Exoncmd(command="markdownhelp", filters=Filters.chat_type.private) +def markdown_help(update: Update, _): + update.effective_chat + update.effective_message.reply_text(f"{MARKDOWN_HELP}", parse_mode=ParseMode.HTML) + update.effective_message.reply_text( + "ᴛʀʏ ғᴏʀᴡᴀʀᴅɪɴɢ ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ᴍᴇssᴀɢᴇ ᴛᴏ ᴍᴇ, ᴀɴᴅ ʏᴏᴜ'ʟʟ sᴇᴇ!" + ) + update.effective_message.reply_text( + "/save test ᴛʜɪs ɪs ᴀ ᴍᴀʀᴋᴅᴏᴡɴ ᴛᴇsᴛ. _italics_, *bold*, `code`, " + "[ᴜʀʟ](example.com) [button](buttonurl:github.com) " + "[ʙᴜᴛᴛᴏɴ2](buttonurl://google.com:same)" + ) + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += f"{time_list.pop()}, " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +stats_str = """ +""" + + +@Exoncmd(command="stats", can_disable=False) +@sudo_plus +def stats(update, context): + uptime = datetime.datetime.fromtimestamp(boot_time()).strftime("%Y-%m-%d %H:%M:%S") + botuptime = get_readable_time((time.time() - StartTime)) + status = "* 「 sʏsᴛᴇᴍ sᴛᴀᴛɪsᴛɪᴄs: 」*\n\n" + status += f"*• sʏsᴛᴇᴍ sᴛᴀʀᴛ ᴛɪᴍᴇ:* {str(uptime)}" + "\n" + uname = platform.uname() + status += f"*• sʏsᴛᴇᴍ:* {str(uname.system)}" + "\n" + status += f"*• ɴᴏᴅᴇ ɴᴀᴍᴇ:* {escape_markdown(str(uname.node))}" + "\n" + status += f"*• ʀᴇʟᴇᴀsᴇ:* {escape_markdown(str(uname.release))}" + "\n" + status += f"*• ᴍᴀᴄʜɪɴᴇ:* {escape_markdown(str(uname.machine))}" + "\n" + + mem = virtual_memory() + cpu = cpu_percent() + disk = disk_usage("/") + status += f"*• ᴄᴘᴜ:* {str(cpu)}" + " %\n" + status += f"*• ʀᴀᴍ:* {str(mem[2])}" + " %\n" + status += f"*• sᴛᴏʀᴀɢᴇ:* {str(disk[3])}" + " %\n\n" + status += f"*• ᴘʏᴛʜᴏɴ ᴠᴇʀsɪᴏɴ:* {python_version()}" + "\n" + status += f"*• ᴘʏᴛʜᴏɴ ᴛᴇʟᴇɢʀᴀᴍ:* {str(ptbver)}" + "\n" + status += f"*• ᴜᴘᴛɪᴍᴇ:* {str(botuptime)}" + "\n" + + try: + update.effective_message.reply_text( + status + + "\n*ʙᴏᴛ sᴛᴀᴛɪsᴛɪᴄs*:\n" + + "\n".join([mod.__stats__() for mod in STATS]) + + "\n\n[ɢɪᴛʜᴜʙ](https://github.com/KingAbishnoi/ExonRobot) | [ᴛᴇʟᴇɢʀᴀᴍ](https://t.me/AbishnoiMF)\n\n" + + f"「 ʙʏ[ᴀʙɪsʜɴᴏɪ](t.me/{AKBOSS}) 」\n", + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) + except BaseException: + update.effective_message.reply_text( + ( + ( + ( + "\n*ʙᴏᴛ sᴛᴀᴛɪsᴛɪᴄs*:\n" + + "\n".join(mod.__stats__() for mod in STATS) + ) + + "\n\n⍙ [ɢɪᴛʜᴜʙ](https://github.com/KingAbishnoi/ExonRobot) | [ᴛᴇʟᴇɢʀᴀᴍ](https://t.me/AbishnoiMF)\n\n" + ) + + f"「 ʙʏ [ᴀʙɪsʜɴᴏɪ](t.me/{AKBOSS}) 」\n" + ), + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) + + +@user_admin +def echo(update: Update, context: CallbackContext): + args = update.effective_message.text.split(None, 1) + message = update.effective_message + + if message.reply_to_message: + message.reply_to_message.reply_text( + args[1], + parse_mode="MARKDOWN", + disable_web_page_preview=True, + ) + else: + message.reply_text( + args[1], + quote=False, + parse_mode="MARKDOWN", + disable_web_page_preview=True, + ) + message.delete() + + +__help__ = """ +*ᴀᴠᴀɪʟᴀʙʟᴇ ᴄᴏᴍᴍᴀɴᴅs:* + +📐 ᴍᴀʀᴋᴅᴏᴡɴ: + +⍟ /markdownhelp : `ǫᴜɪᴄᴋ sᴜᴍᴍᴀʀʏ ᴏғ ʜᴏᴡ ᴍᴀʀᴋᴅᴏᴡɴ ᴡᴏʀᴋs ɪɴ ᴛᴇʟᴇɢʀᴀᴍ - ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴄᴀʟʟᴇᴅ ɪɴ ᴘʀɪᴠᴀᴛᴇ ᴄʜᴀᴛs ` + + +🗳 ᴏᴛʜᴇʀ ᴄᴏᴍᴍᴀɴᴅs: + +Paste: +⍟ /paste*:*` sᴀᴠᴇs ʀᴇᴘʟɪᴇᴅ ᴄᴏɴᴛᴇɴᴛ ᴛᴏ ɴᴇᴋᴏʙɪɴ.ᴄᴏᴍ ᴀɴᴅ ʀᴇᴘʟɪᴇs ᴡɪᴛʜ ᴀ ᴜʀʟ + +ʀᴇᴀᴄᴛ: +⍟ /react *:* `ʀᴇᴀᴄᴛs ᴡɪᴛʜ a ʀᴀɴᴅᴏᴍ ʀᴇᴀᴄᴛɪᴏɴ ` + +Urban Dictonary: +⍟ /ud <word> *:* `ᴛʏᴘᴇ ᴛʜᴇ ᴡᴏʀᴅ ᴏʀ ᴇxᴘʀᴇssɪᴏɴ ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ sᴇᴀʀᴄʜ ᴜsᴇ ` + +ᴡɪᴋɪᴘᴇᴅɪᴀ: +⍟ ❂ /wiki <query> *:* `ᴡɪᴋɪᴘᴇᴅɪᴀ ʏᴏᴜʀ ǫᴜᴇʀʏ ` + +ᴡᴀʟʟᴘᴀᴘᴇʀs: +⍟ /wall <query>*:* `get ᴀ ᴡᴀʟʟᴘᴀᴘᴇʀ ғʀᴏᴍ ᴀʟᴘʜᴀᴄᴏᴅᴇʀs ` + +ʙᴏᴏᴋs: +⍟ /book <book name>*:* `ɢᴇᴛs ɪɴsᴛᴀɴᴛ ᴅᴏᴡɴʟᴏᴀᴅ ʟɪɴᴋ ᴏғ ɢɪᴠᴇɴ ʙᴏᴏᴋ `. + +""" + +ECHO_HANDLER = DisableAbleCommandHandler( + "echo", echo, filters=Filters.chat_type.groups, run_async=True +) + +dispatcher.add_handler(ECHO_HANDLER) + +__mod_name__ = "𝙴xᴛʀᴀs" +__command_list__ = ["gifid", "echo"] +__handlers__ = [ECHO_HANDLER] diff --git a/Exon/modules/modules.py b/Exon/modules/modules.py new file mode 100644 index 00000000..018c34e7 --- /dev/null +++ b/Exon/modules/modules.py @@ -0,0 +1,210 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 collections +import importlib + +from telegram import ParseMode, Update +from telegram.ext import CallbackContext, CommandHandler + +from Exon import dispatcher, telethn +from Exon.__main__ import ( + CHAT_SETTINGS, + DATA_EXPORT, + DATA_IMPORT, + HELPABLE, + IMPORTED, + MIGRATEABLE, + STATS, + USER_INFO, + USER_SETTINGS, +) +from Exon.modules.helper_funcs.chat_status import dev_plus, sudo_plus + + +@dev_plus +def load(update: Update, context: CallbackContext): + message = update.effective_message + text = message.text.split(" ", 1)[1] + load_messasge = message.reply_text( + f"ᴀᴛᴛᴇᴍᴘᴛɪɴɢ ᴛᴏ ʟᴏᴀᴅ ᴍᴏᴅᴜʟᴇ : <b>{text}</b>", + parse_mode=ParseMode.HTML, + ) + + try: + imported_module = importlib.import_module(f"Exon.modules.{text}") + except: + load_messasge.edit_text("ᴅᴏᴇs ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ᴇᴠᴇɴ ᴇxɪsᴛ?") + return + + if not hasattr(imported_module, "__mod_name__"): + imported_module.__mod_name__ = imported_module.__name__ + + if imported_module.__mod_name__.lower() not in IMPORTED: + IMPORTED[imported_module.__mod_name__.lower()] = imported_module + else: + load_messasge.edit_text("ᴍᴏᴅᴜʟᴇ ᴀʟʀᴇᴀᴅʏ ʟᴏᴀᴅᴇᴅ.") + return + if "__handlers__" in dir(imported_module): + handlers = imported_module.__handlers__ + for handler in handlers: + if not isinstance(handler, tuple): + dispatcher.add_handler(handler) + elif isinstance(handler[0], collections.Callable): + callback, telethon_event = handler + telethn.add_event_handler(callback, telethon_event) + else: + handler_name, priority = handler + dispatcher.add_handler(handler_name, priority) + else: + IMPORTED.pop(imported_module.__mod_name__.lower()) + load_messasge.edit_text("ᴛʜᴇ ᴍᴏᴅᴜʟᴇ ᴄᴀɴɴᴏᴛ ʙᴇ ʟᴏᴀᴅᴇᴅ.") + return + + if hasattr(imported_module, "__help__") and imported_module.__help__: + HELPABLE[imported_module.__mod_name__.lower()] = imported_module + + # Chats to migrate on chat_migrated events + if hasattr(imported_module, "__migrate__"): + MIGRATEABLE.append(imported_module) + + if hasattr(imported_module, "__stats__"): + STATS.append(imported_module) + + if hasattr(imported_module, "__user_info__"): + USER_INFO.append(imported_module) + + if hasattr(imported_module, "__import_data__"): + DATA_IMPORT.append(imported_module) + + if hasattr(imported_module, "__export_data__"): + DATA_EXPORT.append(imported_module) + + if hasattr(imported_module, "__chat_settings__"): + CHAT_SETTINGS[imported_module.__mod_name__.lower()] = imported_module + + if hasattr(imported_module, "__user_settings__"): + USER_SETTINGS[imported_module.__mod_name__.lower()] = imported_module + + load_messasge.edit_text( + f"sᴜᴄᴄᴇssғᴜʟʟʏ ʟᴏᴀᴅᴇᴅ ᴍᴏᴅᴜʟᴇ : <b>{text}</b>", + parse_mode=ParseMode.HTML, + ) + + +@dev_plus +def unload(update: Update, context: CallbackContext): + message = update.effective_message + text = message.text.split(" ", 1)[1] + unload_messasge = message.reply_text( + f"ᴀᴛᴛᴇᴍᴘᴛɪɴɢ ᴛᴏ ᴜɴʟᴏᴀᴅ ᴍᴏᴅᴜʟᴇ : <b>{text}</b>", + parse_mode=ParseMode.HTML, + ) + + try: + imported_module = importlib.import_module(f"Exon.modules.{text}") + except: + unload_messasge.edit_text("ᴅᴏᴇs ᴛʜᴀᴛ ᴍᴏᴅᴜʟᴇ ᴇᴠᴇɴ ᴇxɪsᴛ?") + return + + if not hasattr(imported_module, "__mod_name__"): + imported_module.__mod_name__ = imported_module.__name__ + if imported_module.__mod_name__.lower() in IMPORTED: + IMPORTED.pop(imported_module.__mod_name__.lower()) + else: + unload_messasge.edit_text("ᴄᴀɴ'ᴛ ᴜɴʟᴏᴀᴅ sᴏᴍᴇᴛʜɪɴɢ that isn't loaded.") + return + if "__handlers__" in dir(imported_module): + handlers = imported_module.__handlers__ + for handler in handlers: + if isinstance(handler, bool): + unload_messasge.edit_text("ᴛʜɪs ᴍᴏᴅᴜʟᴇ ᴄᴀɴ'ᴛ ʙᴇ ᴜɴʟᴏᴀᴅᴇᴅ!") + return + if not isinstance(handler, tuple): + dispatcher.remove_handler(handler) + elif isinstance(handler[0], collections.Callable): + callback, telethon_event = handler + telethn.remove_event_handler(callback, telethon_event) + else: + handler_name, priority = handler + dispatcher.remove_handler(handler_name, priority) + else: + unload_messasge.edit_text("ᴛʜᴇ ᴍᴏᴅᴜʟᴇ ᴄᴀɴɴᴏᴛ ʙᴇ ᴜɴʟᴏᴀᴅᴇᴅ.") + return + + if hasattr(imported_module, "__help__") and imported_module.__help__: + HELPABLE.pop(imported_module.__mod_name__.lower()) + + # Chats to migrate on chat_migrated events + if hasattr(imported_module, "__migrate__"): + MIGRATEABLE.remove(imported_module) + + if hasattr(imported_module, "__stats__"): + STATS.remove(imported_module) + + if hasattr(imported_module, "__user_info__"): + USER_INFO.remove(imported_module) + + if hasattr(imported_module, "__import_data__"): + DATA_IMPORT.remove(imported_module) + + if hasattr(imported_module, "__export_data__"): + DATA_EXPORT.remove(imported_module) + + if hasattr(imported_module, "__chat_settings__"): + CHAT_SETTINGS.pop(imported_module.__mod_name__.lower()) + + if hasattr(imported_module, "__user_settings__"): + USER_SETTINGS.pop(imported_module.__mod_name__.lower()) + + unload_messasge.edit_text( + f"sᴜᴄᴄᴇssғᴜʟʟʏ ᴜɴʟᴏᴀᴅᴇᴅ ᴍᴏᴅᴜʟᴇ : <b>{text}</b>", + parse_mode=ParseMode.HTML, + ) + + +@sudo_plus +def listmodules(update: Update, context: CallbackContext): + message = update.effective_message + module_list = [] + + for helpable_module in HELPABLE: + helpable_module_info = IMPORTED[helpable_module] + file_info = IMPORTED[helpable_module_info.__mod_name__.lower()] + file_name = file_info.__name__.rsplit("Exon.modules.", 1)[1] + mod_name = file_info.__mod_name__ + module_list.append(f"- <code>{mod_name} ({file_name})</code>\n") + module_list = "ғᴏʟʟᴏᴡɪɴɢ ᴍᴏᴅᴜʟᴇs ᴀʀᴇ ʟᴏᴀᴅᴇᴅ : \n\n" + "".join(module_list) + message.reply_text(module_list, parse_mode=ParseMode.HTML) + + +LOAD_HANDLER = CommandHandler("load", load, run_async=True) +UNLOAD_HANDLER = CommandHandler("unload", unload, run_async=True) +LISTMODULES_HANDLER = CommandHandler("listmodules", listmodules, run_async=True) + +dispatcher.add_handler(LOAD_HANDLER) +dispatcher.add_handler(UNLOAD_HANDLER) +dispatcher.add_handler(LISTMODULES_HANDLER) + +__mod_name__ = "ᴍᴏᴅᴜʟᴇs" diff --git "a/Exon/modules/mongo/ABISHNOI COPYRIGHT \302\251" "b/Exon/modules/mongo/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/modules/mongo/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/modules/mongo/chatbot_mongo.py b/Exon/modules/mongo/chatbot_mongo.py new file mode 100644 index 00000000..43a10006 --- /dev/null +++ b/Exon/modules/mongo/chatbot_mongo.py @@ -0,0 +1,57 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 Exon import mongodb as db_x + +Exon = db_x["CHATBOT"] + + +def add_chat(chat_id): + hima = Exon.find_one({"chat_id": chat_id}) + if hima: + return False + Exon.insert_one({"chat_id": chat_id}) + return True + + +def remove_chat(chat_id): + hima = Exon.find_one({"chat_id": chat_id}) + if not hima: + return False + Exon.delete_one({"chat_id": chat_id}) + return True + + +def get_all_chats(): + r = list(Exon.find()) + if r: + return r + return False + + +def get_session(chat_id): + hima = Exon.find_one({"chat_id": chat_id}) + if not hima: + return False + return hima diff --git a/Exon/modules/mongo/couples_mongo.py b/Exon/modules/mongo/couples_mongo.py new file mode 100644 index 00000000..81e21e87 --- /dev/null +++ b/Exon/modules/mongo/couples_mongo.py @@ -0,0 +1,49 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 Exon import db + +coupledb = db.couple + + +async def _get_lovers(chat_id: int): + lovers = await coupledb.find_one({"chat_id": chat_id}) + if not lovers: + return {} + return lovers["couple"] + + +async def get_couple(chat_id: int, date: str): + lovers = await _get_lovers(chat_id) + if date in lovers: + return lovers[date] + return False + + +async def save_couple(chat_id: int, date: str, couple: dict): + lovers = await _get_lovers(chat_id) + lovers[date] = couple + await coupledb.update_one( + {"chat_id": chat_id}, {"$set": {"couple": lovers}}, upsert=True + ) diff --git a/Exon/modules/mongo/karma_mongo.py b/Exon/modules/mongo/karma_mongo.py new file mode 100644 index 00000000..8b467849 --- /dev/null +++ b/Exon/modules/mongo/karma_mongo.py @@ -0,0 +1,119 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from typing import Dict, Union + +from Exon import db + +karmadb = db.karma +karmaonoffdb = db.karmaonoff + + +async def get_karmas_count() -> dict: + chats = karmadb.find({"chat_id": {"$lt": 0}}) + if not chats: + return {} + chats_count = 0 + karmas_count = 0 + for chat in await chats.to_list(length=1000000): + 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: + chats = karmadb.find({"chat_id": {"$lt": 0}}) + if not chats: + return 0 + total_karma = 0 + for chat in await chats.to_list(length=1000000): + 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}) + if not karma: + return {} + return karma["karma"] + + +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}) + + +async def int_to_alpha(user_id: int) -> str: + alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] + user_id = str(user_id) + return "".join(alphabet[int(i)] for i in user_id) + + +async def alpha_to_int(user_id_alphabet: str) -> int: + alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] + user_id = "" + for i in user_id_alphabet: + index = alphabet.index(i) + user_id += str(index) + user_id = int(user_id) + return user_id diff --git a/Exon/modules/mongo/karma_toggle.py b/Exon/modules/mongo/karma_toggle.py new file mode 100644 index 00000000..1f3ade89 --- /dev/null +++ b/Exon/modules/mongo/karma_toggle.py @@ -0,0 +1,117 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.ext import CallbackContext, CallbackQueryHandler, CommandHandler +from telegram.utils.helpers import mention_html + +from Exon import dispatcher +from Exon.modules.helper_funcs.chat_status import user_admin, user_admin_no_reply +from Exon.modules.log_channel import loggable + +bot_name = f"{dispatcher.bot.first_name}" + +from pymongo import MongoClient + +from Exon import MONGO_DB_URL + +worddb = MongoClient(MONGO_DB_URL) +k = worddb["ExonKarma"]["karma_status"] + + +@user_admin_no_reply +def karmaadd(update: Update, context: CallbackContext): + query = update.callback_query + context.bot + user = update.effective_user + if query.data == "add_karma": + chat = update.effective_chat + done = k.insert_one({"chat_id": chat.id}) + update.effective_message.edit_text( + f"{bot_name} ᴋᴀʀᴍᴀ sʏsᴛᴇᴍ ᴅɪsᴀʙʟᴇᴅ ʙʏ {mention_html(user.id, user.first_name)}.", + parse_mode=ParseMode.HTML, + ) + + +@user_admin_no_reply +def karmarem(update: Update, context: CallbackContext): + query = update.callback_query + context.bot + user = update.effective_user + if query.data == "rem_karma": + chat = update.effective_chat + done = k.delete_one({"chat_id": chat.id}) + update.effective_message.edit_text( + f"{bot_name} ᴋᴀʀᴍᴀ sʏsᴛᴇᴍ ᴇɴᴀʙʟᴇᴅ ʙʏ {mention_html(user.id, user.first_name)}.", + parse_mode=ParseMode.HTML, + ) + + +@user_admin +@loggable +def karma_toggle(update: Update, context: CallbackContext): + message = update.effective_message + chat = update.effective_chat + is_chatbot = k.find_one({"chat_id": chat.id}) + if is_chatbot: + msg = "ᴋᴀʀᴍᴀ ᴛᴏɢɢʟᴇ\nᴍᴏᴅᴇ : DISABLE" + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ᴇɴᴀʙʟᴇ", callback_data=r"rem_karma")]] + ) + message.reply_text( + msg, + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + if not is_chatbot: + msg = "Karma Toggle\n Mode : ENABLE" + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="ᴅɪsᴀʙʟᴇ", callback_data=r"add_karma")]] + ) + message.reply_text( + msg, + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + + +KARMA_STATUS_HANDLER = CommandHandler("karma", karma_toggle, run_async=True) +ADD_KARMA_HANDLER = CallbackQueryHandler(karmaadd, pattern=r"add_karma", run_async=True) +RM_KARMA_HANDLER = CallbackQueryHandler(karmarem, pattern=r"rem_karma", run_async=True) + +dispatcher.add_handler(ADD_KARMA_HANDLER) +dispatcher.add_handler(KARMA_STATUS_HANDLER) +dispatcher.add_handler(RM_KARMA_HANDLER) + +__handlers__ = [ + ADD_KARMA_HANDLER, + KARMA_STATUS_HANDLER, + RM_KARMA_HANDLER, +] diff --git a/Exon/modules/mongo/nsfw_mongo.py b/Exon/modules/mongo/nsfw_mongo.py new file mode 100644 index 00000000..180dc9b5 --- /dev/null +++ b/Exon/modules/mongo/nsfw_mongo.py @@ -0,0 +1,50 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 Exon import db + +nsfwdb = db.nsfw + +"""ɴsғᴡ sʏsᴛᴇᴍ""" + + +async def is_nsfw_on(chat_id: int) -> bool: + chat = await nsfwdb.find_one({"chat_id": chat_id}) + if not chat: + return True + return False + + +async def nsfw_on(chat_id: int): + is_nsfw = await is_nsfw_on(chat_id) + if is_nsfw: + return + return await nsfwdb.delete_one({"chat_id": chat_id}) + + +async def nsfw_off(chat_id: int): + is_nsfw = await is_nsfw_on(chat_id) + if not is_nsfw: + return + return await nsfwdb.insert_one({"chat_id": chat_id}) diff --git a/Exon/modules/music_button.py b/Exon/modules/music_button.py new file mode 100644 index 00000000..dad76cc5 --- /dev/null +++ b/Exon/modules/music_button.py @@ -0,0 +1,176 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +__mod_name__ = "𝙼ᴜsɪᴄ" + +__help__ = """ +⍟ ADMIN + +**ᴏɴʟʏ ᴀᴅᴍɪɴs ᴄᴀɴ ᴜsᴇ ᴛʜᴇsᴇ ᴄᴏᴍᴍᴀɴᴅs :** +/pause +» ᴩᴀᴜsᴇ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ. + +/resume +» ʀᴇsᴜᴍᴇᴅ ᴛʜᴇ ᴩᴀᴜsᴇᴅ sᴛʀᴇᴀᴍ. + +/skip ᴏʀ /next +» sᴋɪᴩ ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴏɴɢᴏɪɴɢ sᴛʀᴇᴀᴍ. + +/end ᴏʀ /stop +» ᴇɴᴅ ᴛʜᴇ ᴄᴜʀᴇᴇɴᴛ ᴏɴɢᴏɪɴ sᴛʀᴇᴀᴍ. + +⍟ AUTH +**ᴄᴏᴍᴍᴀɴᴅs ᴛᴏ ᴀᴜᴛʜ/ᴜɴᴀᴜᴛʜ ᴀɴʏ ᴜsᴇʀ :** + +• ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ᴄᴀɴ sᴋɪᴩ, ᴩᴀᴜsᴇ, ʀᴇsᴜᴍᴇ ᴀɴᴅ ᴇɴᴅ ᴛʜᴇ sᴛʀᴇᴀᴍ ᴡɪᴛʜᴏᴜᴛ ᴀᴅᴍɪɴ ʀɪɢʜᴛs. + + +/auth [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ] +» ᴀᴅᴅ ᴀ ᴜsᴇʀ ᴛᴏ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. + +/unauth [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ] +» ʀᴇᴍᴏᴠᴇs ᴛʜᴇ ᴜsᴇʀ ғʀᴏᴍ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ʟɪsᴛ. + +/authusers +» sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴜᴛʜᴏʀɪᴢᴇᴅ ᴜsᴇʀs ᴏғ ᴛʜᴇ ɢʀᴏᴜᴩ. + +⍟ PLAY +**ᴄᴏᴍᴍᴀɴᴅs ᴛᴏ ᴩʟᴀʏ sᴏɴɢs :** + +/play <sᴏɴɢ ɴᴀᴍᴇ/ʏᴛ ᴜʀʟ> +» sᴛᴀʀᴛs ᴩʟᴀʏɪɴɢ ᴛʜᴇ ʀᴇǫᴜᴇsᴛᴇᴅ sᴏɴɢ ᴏɴ ᴠᴄ. + +/queue +» sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ǫᴜᴇᴜᴇᴅ ᴛʀᴀᴄᴋs ɪɴ ᴛʜᴇ ǫᴜᴇᴜᴇ. + +/lyrics [sᴏɴɢ] +» sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʟʏʀɪᴄs ᴏғ ᴛʜᴇ sᴇᴀʀᴄʜᴇᴅ sᴏɴɢ. + +⍟ TOOLS +**sᴏᴍᴇ ᴜsᴇғᴜʟ ᴛᴏᴏʟs :** + + +/ping +» ᴄʜᴇᴄᴋ ɪғ ʙᴏᴛ ɪs ᴀʟɪᴠᴇ ᴏʀ ᴅᴇᴀᴅ. [ɪғ ᴀʟɪᴠᴇ sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ sʏsᴛᴇᴍ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ's sᴇʀᴠᴇʀ.] + +/start +» sᴛᴀʀᴛs ᴛʜᴇ ʙᴏᴛ. + +/help +» sʜᴏᴡs ʏᴏᴜ ᴛʜᴇ ʜᴇʟᴩ ᴍᴇɴᴜ ᴏғ ᴛʜᴇ ʙᴏᴛ. + +/stats +» sʜᴏᴡs ᴛʜᴇ sʏsᴛᴇᴍ, ᴀssɪsᴛᴀɴᴛ, ᴍᴏɴɢᴏ ᴀɴᴅ sᴛᴏʀᴀɢᴇ sᴛᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. + +/sudolist +» sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ sᴜᴅᴏᴇʀs. + +↔↔↔↔↔↔↔↔↔↔↔↔ +✰ ᴛʜɪs ᴍᴜsɪᴄ ʙᴏᴛ ʀᴇᴘᴏ +⍟ https://github.com/TEAM-ABG/AsuXMusic +""" + +####################### +""" +**ᴏɴʟʏ ғᴏʀ sᴜᴅᴏᴇʀs :** + +/speedtest +» ᴄʜᴇᴄᴋᴇʀ sᴇʀᴠᴇʀ sᴩᴇᴇᴅ ᴀɴᴅ ʟᴀᴛᴇɴᴄʏ ᴀɴᴅ ᴩɪɴɢ. + + +⍟ OWNER + +**ᴄᴏᴍᴍᴀɴᴅs ᴛʜᴀᴛ ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴜsᴇᴅ ʙʏ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ʙᴏᴛ :** + + +/chatlist +» ʟɪsᴛ ᴀʟʟ ᴛʜᴇ ᴄʜᴀᴛs ᴡʜᴇʀᴇ ʙᴏᴛ ɪs ᴩʀᴇsᴇɴᴛ. + +/clean +» ᴄʟᴇᴀɴ ᴀʟʟ ᴛʜᴇ ᴛᴇᴍᴩ ᴅɪʀᴇᴄᴛᴏʀɪᴇs. + +/update +» ғᴇᴛᴄʜ ᴜᴩᴅᴀᴛᴇs ғʀᴏᴍ ᴛʜᴇ ʀᴇᴩᴏ. + +/maintenance on +» ᴇɴᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ᴛʜᴇ ʙᴏᴛ. + +/maintenance off +» ᴅɪsᴀʙʟᴇ ᴛʜᴇ ᴍᴀɪɴᴛᴇɴᴀɴᴄᴇ ᴍᴏᴅᴇ ᴏғ ᴛʜᴇ ʙᴏᴛ. + +/restart +» ʀᴇsᴛᴀʀᴛs ᴛʜᴇ ʙᴏᴛ ᴏɴ ʏᴏᴜʀ sᴇʀᴠᴇʀ. + + + +⍟ SUDO + +**ᴄᴏᴍᴍᴀɴᴅs ᴛʜᴀᴛ ᴄᴀɴ ᴏɴʟʏ ʙᴇ ᴜsᴇᴅ ʙʏ sᴜᴅᴏ ᴜsᴇʀs :** + +/activevc +» sʜᴏᴡs ᴛʜᴇ ʟɪsᴛ ᴏғ ᴀᴄᴛɪᴠᴇ ᴠᴏɪᴄᴇᴄʜᴀᴛs ᴏɴ ʙᴏᴛ's sᴇʀᴠᴇʀ. + +/gban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] +» ɢʟᴏʙᴀʟʟʏ ʙᴀɴs ᴀ ᴜsᴇʀ ɪɴ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs. + +/ungban [ᴜsᴇʀɴᴀᴍᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ] +» ɢʟᴏʙᴀʟʟʏ ᴜɴʙᴀɴs ᴛʜᴇ ɢ-ʙᴀɴɴᴇᴅ ᴜsᴇʀ. + +/broadcast [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] +» ʙʀᴏᴀᴅᴄᴀsᴛ's ᴛʜᴇ ɢɪᴠᴇɴ ᴍᴇssᴀɢᴇ ᴛᴏ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ. + +/broadcast_pin [ᴍᴇssᴀɢᴇ ᴏʀ ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ] +» ʙʀᴏᴀᴅᴄᴀsᴛ's ᴛʜᴇ ɢɪᴠᴇɴ ᴍᴇssᴀɢᴇ ᴛᴏ ᴀʟʟ ᴛʜᴇ sᴇʀᴠᴇᴅ ᴄʜᴀᴛs ᴏғ ᴛʜᴇ ʙᴏᴛ ᴀɴᴅ ᴩɪɴ's ᴛʜᴇ ʙʀᴏᴀᴅᴄᴀsᴛᴇᴅ ᴍᴇssᴀɢᴇ. + +/joinassistant [ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ/ɪᴅ] +» ᴏʀᴅᴇʀ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴛᴏ ᴊᴏɪɴ ᴛʜᴀᴛ ᴄʜᴀᴛ. + +/leaveassistant [ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ/ɪᴅ] +» ᴏʀᴅᴇʀ ᴛʜᴇ ᴀssɪsᴛᴀɴᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴛʜᴀᴛ ᴄʜᴀᴛ. + +/leavebot [ᴄʜᴀᴛ ᴜsᴇʀɴᴀᴍᴇ/ɪᴅ] +» ᴏʀᴅᴇʀ ᴛʜᴇ ʙᴏᴛ ᴛᴏ ʟᴇᴀᴠᴇ ᴛʜᴀᴛ ᴄʜᴀᴛ. + +.approve [ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ] +» ᴀᴩᴩʀᴏᴠᴇs ᴛʜᴇ ᴜsᴇʀ ᴛᴏ ᴩᴍ ᴏɴ ʏᴏᴜʀ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. + +.disapprove [ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴜsᴇʀ's ᴍᴇssᴀɢᴇ] +» ᴅɪsᴀᴩᴩʀᴏᴠᴇs ᴛʜᴇ ᴜsᴇʀ ᴛᴏ ᴩᴍ ᴏɴ ʏᴏᴜʀ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. + +.pfp [ʀᴇᴩʟʏ ᴛᴏ ᴀ ᴩʜᴏᴛᴏ] +» ᴄʜᴀɴɢᴇs ᴛʜᴇ ᴩғᴩ ᴏғ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜᴜɴᴛ. + +.bio [ᴛᴇxᴛ] +» ᴄʜᴀɴɢᴇs ᴛʜᴇ ʙɪᴏ ᴏғ ᴀssɪsᴛᴀɴᴛ ᴀᴄᴄᴏᴜɴᴛ. + +↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔↔ +✰ ᴛʜɪs ᴍᴜsɪᴄ ʙᴏᴛ ʀᴇᴘᴏ +⍟ https://github.com/TEAM-ABG/AsuXMusic +""" diff --git a/Exon/modules/muting.py b/Exon/modules/muting.py new file mode 100644 index 00000000..6bb8e703 --- /dev/null +++ b/Exon/modules/muting.py @@ -0,0 +1,354 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import re +from typing import Optional + +from telegram import ( + Bot, + CallbackQuery, + Chat, + ChatPermissions, + InlineKeyboardButton, + InlineKeyboardMarkup, + ParseMode, + Update, + User, +) +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CallbackQueryHandler, CommandHandler +from telegram.utils.helpers import mention_html + +from Exon import LOGGER, TIGERS, dispatcher +from Exon.modules.helper_funcs.chat_status import ( + bot_admin, + can_restrict, + connection_status, + is_user_admin, + user_admin, + user_admin_no_reply, +) +from Exon.modules.helper_funcs.extraction import extract_user_and_text +from Exon.modules.helper_funcs.string_handling import extract_time +from Exon.modules.log_channel import loggable +from Exon.modules.sql.approve_sql import is_approved + + +def check_user(user_id: int, bot: Bot, chat: Chat) -> Optional[str]: + + if not user_id: + reply = "𝚈𝚘𝚞 ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ID sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ.." + return reply + + if is_approved(chat.id, user_id): + reply = ( + "ᴛʜɪs ɪs ᴜsᴇʀ is ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ ᴛʜɪs ᴄʜᴀᴛ ᴀɴᴅ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀs ᴄᴀɴ'ᴛ ʙᴇ ᴍᴜᴛᴇᴅ!" + ) + return reply + + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "User not found": + reply = "I can't seem to find this user" + return reply + raise + + if user_id == bot.id: + reply = "I'm ɴᴏᴛ ɢᴏɴɴᴀ ᴍᴜᴛᴇ ᴍʏsᴇʟғ, ɴᴏᴏʙ?" + return reply + + if is_user_admin(chat, user_id, member) or user_id in TIGERS: + reply = "ᴄᴀɴ'ᴛ. ғɪɴᴅ sᴏᴍᴇᴏɴᴇ ᴇʟsᴇ ᴛᴏ ᴍᴜᴛᴇ ʙᴜᴛ ɴᴏᴛ ᴛʜɪs ᴏɴᴇ." + return reply + + return None + + +@connection_status +@bot_admin +@user_admin +@loggable +def mute(update: Update, context: CallbackContext) -> str: + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + + user_id, reason = extract_user_and_text(message, args) + if reply := check_user(user_id, bot, chat): + message.reply_text(reply) + return "" + + member = chat.get_member(user_id) + + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴍᴜᴛᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + + if reason: + log += f"\n<b>ʀᴇᴀsᴏɴ:</b> {reason}" + + if member.can_send_messages is None or member.can_send_messages: + chat_permissions = ChatPermissions(can_send_messages=False) + bot.restrict_chat_member(chat.id, user_id, chat_permissions) + msg = ( + f"<code>🗣️</code><b>ᴍᴜᴛᴇ Event</b>\n" + f"<code> </code><b>• ᴍᴜᴛᴇᴅ ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + if reason: + msg += f"\n<code> </code><b>• ʀᴇᴀsᴏɴ:</b> \n{html.escape(reason)}" + + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "ᴜɴᴍᴜᴛᴇ", callback_data=f"unmute_({member.user.id})" + ) + ] + ] + ) + + bot.sendMessage( + chat.id, + msg, + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + return log + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴍᴜᴛᴇᴅ!") + + return "" + + +@connection_status +@bot_admin +@user_admin +@loggable +def unmute(update: Update, context: CallbackContext) -> str: + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + + user_id, reason = extract_user_and_text(message, args) + if not user_id: + message.reply_text( + "ʏᴏᴜ'ʟʟ ɴᴇᴇᴅ to ᴇɪᴛʜᴇʀ ɢɪᴠᴇ ᴍᴇ ᴀ ᴜsᴇʀɴᴀᴍᴇ ᴛᴏ ᴜɴᴍᴜᴛᴇ, ᴏʀ ʀᴇᴘʟʏ ᴛᴏ sᴏᴍᴇᴏɴᴇ ᴛᴏ ʙᴇ ᴜɴᴍᴜᴛᴇᴅ." + ) + return "" + + member = chat.get_member(int(user_id)) + + if member.status in ("kicked", "left"): + message.reply_text( + "ᴛʜɪs ᴜsᴇʀ ɪsɴ'ᴛ ᴇᴠᴇɴ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ, ᴜɴᴍᴜᴛɪɴɢ ᴛʜᴇᴍ ᴡᴏɴ'ᴛ ᴍᴀᴋᴇ ᴛʜᴇᴍ ᴛᴀʟᴋ ᴍᴏʀᴇ ᴛʜᴀɴ ᴛʜᴇʏ " + "ᴀʟʀᴇᴀᴅʏ ᴅᴏ!", + ) + + elif ( + member.can_send_messages + and member.can_send_media_messages + and member.can_send_other_messages + and member.can_add_web_page_previews + ): + message.reply_text("ᴛʜɪs ᴜsᴇʀ ᴀʟʀᴇᴀᴅʏ ʜᴀs ᴛʜᴇ ʀɪɢʜᴛ ᴛᴏ sᴘᴇᴀᴋ.") + else: + chat_permissions = ChatPermissions( + can_send_messages=True, + can_invite_users=True, + can_pin_messages=True, + can_send_polls=True, + can_change_info=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + ) + try: + bot.restrict_chat_member(chat.id, int(user_id), chat_permissions) + except BadRequest: + pass + bot.sendMessage( + chat.id, + f"{mention_html(member.user.id, member.user.first_name)} ᴡᴀs ᴜɴᴍᴜᴛᴇᴅ ʙʏ {mention_html(user.id, user.first_name)} in <b>{message.chat.title}</b>\n<b>ʀᴇᴀsᴏɴ</b>: <code>{reason}</code>", + parse_mode=ParseMode.HTML, + ) + + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴᴍᴜᴛᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + return "" + + +@connection_status +@bot_admin +@can_restrict +@user_admin +@loggable +def temp_mute(update: Update, context: CallbackContext) -> str: + bot, args = context.bot, context.args + chat = update.effective_chat + user = update.effective_user + message = update.effective_message + + user_id, reason = extract_user_and_text(message, args) + if reply := check_user(user_id, bot, chat): + message.reply_text(reply) + return "" + + member = chat.get_member(user_id) + + if not reason: + message.reply_text("ʏᴏᴜ ʜᴀᴠᴇɴ'ᴛ sᴘᴇᴄɪғɪᴇᴅ ᴀ ᴛɪᴍᴇ ᴛᴏ ᴍᴜᴛᴇ ᴛʜɪs ᴜsᴇʀ ғᴏʀ!") + return "" + + split_reason = reason.split(None, 1) + + time_val = split_reason[0].lower() + reason = split_reason[1] if len(split_reason) > 1 else "" + mutetime = extract_time(message, time_val) + + if not mutetime: + return "" + + log = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴛᴇᴍᴘ ᴍᴜᴛᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}\n" + f"<b>ᴛɪᴍᴇ:</b> {time_val}" + ) + if reason: + log += f"\n<b>ʀᴇᴀsᴏɴ:</b> {reason}" + + try: + if member.can_send_messages is None or member.can_send_messages: + chat_permissions = ChatPermissions(can_send_messages=False) + bot.restrict_chat_member( + chat.id, + user_id, + chat_permissions, + until_date=mutetime, + ) + msg = ( + f"<code>🗣️</code><b>ᴛɪᴍᴇ ᴍᴜᴛᴇ ᴇᴠᴇɴᴛ</b>\n" + f"<code> </code><b>• ᴍᴜᴛᴇᴅ ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}\n" + f"<code> </code><b>• ᴜsᴇʀ ᴡɪʟʟ ʙᴇ ᴍᴜᴛᴇᴅ ғᴏʀ:</b> {time_val}\n" + ) + + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "ᴜɴᴍᴜᴛᴇ", + callback_data=f"unmute_({member.user.id})", + ) + ] + ] + ) + + bot.sendMessage( + chat.id, msg, reply_markup=keyboard, parse_mode=ParseMode.HTML + ) + + return log + message.reply_text("ᴛʜɪs ᴜsᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴍᴜᴛᴇᴅ.") + + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text(f"ᴍᴜᴛᴇᴅ ғᴏʀ {time_val}!", quote=False) + return log + LOGGER.warning(update) + LOGGER.exception( + "ᴇʀʀᴏʀ ᴍᴜᴛɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, ɪ ᴄᴀɴ'ᴛ ᴍᴜᴛᴇ ᴛʜᴀᴛ ᴜsᴇʀ.") + + return "" + + +@user_admin_no_reply +@bot_admin +@loggable +def button(update: Update, context: CallbackContext) -> str: + query: Optional[CallbackQuery] = update.callback_query + user: Optional[User] = update.effective_user + bot: Optional[Bot] = context.bot + if match := re.match(r"unmute_\((.+?)\)", query.data): + user_id = match[1] + chat: Optional[Chat] = update.effective_chat + member = chat.get_member(user_id) + chat_permissions = ChatPermissions( + can_send_messages=True, + can_invite_users=True, + can_pin_messages=True, + can_send_polls=True, + can_change_info=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + ) + if unmuted := bot.restrict_chat_member(chat.id, int(user_id), chat_permissions): + update.effective_message.edit_text( + f"ᴀᴅᴍɪɴ {mention_html(user.id, user.first_name)} ᴜɴᴍᴜᴛᴇᴅ {mention_html(member.user.id, member.user.first_name)}!", + parse_mode=ParseMode.HTML, + ) + query.answer("ᴜɴᴍᴜᴛᴇᴅ!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴᴍᴜᴛᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>ᴜsᴇʀ:</b> {mention_html(member.user.id, member.user.first_name)}" + ) + else: + update.effective_message.edit_text( + "ᴛʜɪs ᴜsᴇʀ ɪs ɴᴏᴛ ᴍᴜᴛᴇᴅ ᴏʀ ʜᴀs ʟᴇғᴛ ᴛʜᴇ ɢʀᴏᴜᴘ!" + ) + return "" + + +MUTE_HANDLER = CommandHandler("mute", mute, run_async=True) +UNMUTE_HANDLER = CommandHandler("unmute", unmute, run_async=True) +TEMPMUTE_HANDLER = CommandHandler(["tmute", "tempmute"], temp_mute, run_async=True) +UNMUTE_BUTTON_HANDLER = CallbackQueryHandler(button, pattern=r"unmute_") + +dispatcher.add_handler(MUTE_HANDLER) +dispatcher.add_handler(UNMUTE_HANDLER) +dispatcher.add_handler(TEMPMUTE_HANDLER) +dispatcher.add_handler(UNMUTE_BUTTON_HANDLER) + +__mod_name__ = "ᴍᴜᴛɪɴɢ" +__handlers__ = [MUTE_HANDLER, UNMUTE_HANDLER, TEMPMUTE_HANDLER] diff --git a/Exon/modules/neko.py b/Exon/modules/neko.py new file mode 100644 index 00000000..48510adc --- /dev/null +++ b/Exon/modules/neko.py @@ -0,0 +1,119 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import random + +from telegram import ParseMode, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, run_async + +import Exon.modules.nekostrings as nekostrings +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.extraction import extract_user + + +@run_async +def nyaa(update: Update, context: CallbackContext): + bot = context.bot + args = context.args + message = update.effective_message + + reply_to = message.reply_to_message or message + + curr_user = html.escape(message.from_user.first_name) + if user_id := extract_user(message, args): + neko_user = bot.get_chat(user_id) + user1 = curr_user + user2 = html.escape(neko_user.first_name) + + else: + user1 = bot.first_name + user2 = curr_user + + nyaa_type = random.choice(("Text", "Gif")) + if nyaa_type == "Gif": + try: + temp = random.choice(nekostrings.NEKO_GIFS) + reply_to.reply_animation(temp) + except BadRequest: + nyaa_type = "Text" + + if nyaa_type == "Text": + temp = random.choice(nekostrings.NEKO_TEXT) + reply = temp.format(user1=user1, user2=user2) + reply_to.reply_text(reply, parse_mode=ParseMode.HTML) + + +@run_async +def meow(update: Update, context: CallbackContext): + bot = context.bot + args = context.args + message = update.effective_message + + reply_to = message.reply_to_message or message + + curr_user = html.escape(message.from_user.first_name) + if user_id := extract_user(message, args): + bot.get_chat(user_id) + user1 = curr_user + user2 = html.escape(neko_user.first_name) + + else: + user1 = bot.first_name + user2 = curr_user + + meow_type = random.choice(("Text", "Gif")) + if meow_type == "Gif": + try: + temp = random.choice(nekostrings.CATTO_GIFS) + reply_to.reply_animation(temp) + except BadRequest: + pass + + if meow_type == "Text": + temp = random.choice(nekostrings.CATTO_TEXT) + reply = temp.format(user1=user1, user2=user2) + reply_to.reply_text(reply, parse_mode=ParseMode.HTML) + + +__help__ = """ +⍟ /nyaa*:* `ᴜsᴇ ᴛʜɪs ᴛᴏ ɢᴇᴛ ᴄᴜᴛᴇ ɴᴇᴋᴏ/ᴄᴀᴛᴛᴏ ɢɪғs!` + +⍟ /meow*:* `ᴡᴏʀᴋs sᴀᴍᴇ ᴀs ᴀʙᴏᴠᴇ!` +""" + + +NYAA_HANDLER = DisableAbleCommandHandler("nyaa", nyaa) +MEOW_HANDLER = DisableAbleCommandHandler("meow", meow) + + +dispatcher.add_handler(NYAA_HANDLER) +dispatcher.add_handler(MEOW_HANDLER) + +__mod_name__ = "𝙽ᴇᴋᴏ" + +__command_list__ = ["nyaa", "meow"] +__handlers__ = [NYAA_HANDLER, MEOW_HANDLER] diff --git a/Exon/modules/nekostrings.py b/Exon/modules/nekostrings.py new file mode 100644 index 00000000..c19989cd --- /dev/null +++ b/Exon/modules/nekostrings.py @@ -0,0 +1,86 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + + +NEKO_GIFS = [ + "CgACAgQAAxkBAAMrYqsUnGR_WSKGqHlEZf7y6HkYERYAAssLAAIonphSDdalOsV7SvckBA", + "CgACAgQAAxkBAAMuYqsUveNqlzPijbjFjKu7s_XjxPkAAmwJAAIGErhQ91BF0LmjUI8kBA", + "CgACAgQAAxkBAAMxYqsVJ8fGYUxPk4bozwQSeLnHassAAkMKAAJ3hRBTZifAU99mVPUkBA", + "CgACAgQAAxkBAAM2YqsVP3YBS-CRdwP7Y7BldYqQpoUAAr0LAALXAvBQxI6NdeN-9KYkBA", + "CgACAgIAAxkBAAM5YqsVSzUoI2hfP7SWLaARgHoXoUIAArwDAAKsUoBJMtAiy5zsOHokBA", + "CgACAgQAAxkBAAM8YqsVWWn-2hu2dKIFjYADops8GkgAAkgKAALfd-lRRubt0w6DL2UkBA", + "CgACAgQAAxkBAAM_YqsVba1Fx_uYXshjrYRGnEDlBuwAAgIMAALUNQhQl85MfEwjEuQkBA", + "CgACAgQAAxkBAANCYqsVd4Bx8bSX7kNhsmVmf9ErrTMAAtwCAAKzSl1RNMbxHZVn1fYkBA", + "CgACAgQAAxkBAANFYqsVhbz-lNmztm3kQD-1KrEtMVUAApsJAAJKQ4FTrApv8b4mbyAkBA", + "CgACAgQAAxkBAANIYqsVkfblz6kTvx3xxa6hNakFAhAAAjsZAAIxGGQH7NG_RZRZcuQkBA", + "CgACAgQAAxkBAANLYqsVq_iEWP7UHujaYCc-XzcymFMAAhsDAAK8KqxQy2qoV0Sm9_EkBA", + "CgACAgQAAxkBAANMYqsVq94MQ8G-yegkbOomompFgEUAAioJAAKMUyhQI0qgXgVwDkokBA", + "CgACAgQAAxkBAANNYqsVqycytgiSFoGcrjCWfuS-31UAAkkCAAKVzZRSo328NRXOTtIkBA", + "CgACAgQAAxkBAANOYqsVq16uzEa6RbP1E-Ge4K3uBCgAAgkNAAJhFoBRqPScY1M8bKYkBA", + "CgACAgQAAxkBAANPYqsVq60g7E29o3V54JHXGL4jnpQAAv8KAAJMg7hT2oDYsq-FzJ4kBA", + "CgACAgIAAxkBAANQYqsVq0DediMlY1rpPZfuD1DiF-IAArwDAAKsUoBJMtAiy5zsOHokBA", + "CgACAgQAAxkBAANRYqsVq5mts75j64nk3roQPcfepJ0AAr0LAALXAvBQxI6NdeN-9KYkBA", + "CgACAgQAAxkBAANSYqsVq0liFvD8IxdTsPgCptgrieQAAisLAAI6y7BTbGoeRWS3ItgkBA", + "CgACAgQAAxkBAANTYqsVq9AMgXbGEf50Wu4uD6_JeM0AAhsKAAKbqOhTq0LaOEquUqEkBA", + "CgACAgIAAxkBAANUYqsVqzE4jN19KFXHzl9B_PGQX0oAAjQHAALcyRhKZbta5VIkDPkkBA", +] + + +NEKO_TEXT = [ + " ᴛʜᴇ ɴᴇᴋᴏ, sᴄʀᴀᴛᴄʜᴇs ʏᴏᴜ!", + "ɴʏᴀ! {user1} ɪs ᴀ ɴᴇᴋᴏ!", + "ᴍʏ ʜᴇᴀʀᴛ ɢᴏᴇs ᴍᴇᴏᴡ😻", + "ɴᴇᴋᴏ ɴᴇᴋᴏ ɴɪɪɪ!" "{user1} ɴʏᴀᴇᴅ {user2}", +] + +CATTO_GIFS = [ + "CgACAgQAAxkBAAMrYqsUnGR_WSKGqHlEZf7y6HkYERYAAssLAAIonphSDdalOsV7SvckBA", + "CgACAgQAAxkBAAMuYqsUveNqlzPijbjFjKu7s_XjxPkAAmwJAAIGErhQ91BF0LmjUI8kBA", + "CgACAgQAAxkBAAMxYqsVJ8fGYUxPk4bozwQSeLnHassAAkMKAAJ3hRBTZifAU99mVPUkBA", + "CgACAgQAAxkBAAM2YqsVP3YBS-CRdwP7Y7BldYqQpoUAAr0LAALXAvBQxI6NdeN-9KYkBA", + "CgACAgIAAxkBAAM5YqsVSzUoI2hfP7SWLaARgHoXoUIAArwDAAKsUoBJMtAiy5zsOHokBA", + "CgACAgQAAxkBAAM8YqsVWWn-2hu2dKIFjYADops8GkgAAkgKAALfd-lRRubt0w6DL2UkBA", + "CgACAgQAAxkBAAM_YqsVba1Fx_uYXshjrYRGnEDlBuwAAgIMAALUNQhQl85MfEwjEuQkBA", + "CgACAgQAAxkBAANCYqsVd4Bx8bSX7kNhsmVmf9ErrTMAAtwCAAKzSl1RNMbxHZVn1fYkBA", + "CgACAgQAAxkBAANFYqsVhbz-lNmztm3kQD-1KrEtMVUAApsJAAJKQ4FTrApv8b4mbyAkBA", + "CgACAgQAAxkBAANIYqsVkfblz6kTvx3xxa6hNakFAhAAAjsZAAIxGGQH7NG_RZRZcuQkBA", + "CgACAgQAAxkBAANLYqsVq_iEWP7UHujaYCc-XzcymFMAAhsDAAK8KqxQy2qoV0Sm9_EkBA", + "CgACAgQAAxkBAANMYqsVq94MQ8G-yegkbOomompFgEUAAioJAAKMUyhQI0qgXgVwDkokBA", + "CgACAgQAAxkBAANNYqsVqycytgiSFoGcrjCWfuS-31UAAkkCAAKVzZRSo328NRXOTtIkBA", + "CgACAgQAAxkBAANOYqsVq16uzEa6RbP1E-Ge4K3uBCgAAgkNAAJhFoBRqPScY1M8bKYkBA", + "CgACAgQAAxkBAANPYqsVq60g7E29o3V54JHXGL4jnpQAAv8KAAJMg7hT2oDYsq-FzJ4kBA", + "CgACAgIAAxkBAANQYqsVq0DediMlY1rpPZfuD1DiF-IAArwDAAKsUoBJMtAiy5zsOHokBA", + "CgACAgQAAxkBAANRYqsVq5mts75j64nk3roQPcfepJ0AAr0LAALXAvBQxI6NdeN-9KYkBA", + "CgACAgQAAxkBAANSYqsVq0liFvD8IxdTsPgCptgrieQAAisLAAI6y7BTbGoeRWS3ItgkBA", + "CgACAgQAAxkBAANTYqsVq9AMgXbGEf50Wu4uD6_JeM0AAhsKAAKbqOhTq0LaOEquUqEkBA", + "CgACAgIAAxkBAANUYqsVqzE4jN19KFXHzl9B_PGQX0oAAjQHAALcyRhKZbta5VIkDPkkBA", +] + +CATTO_TEXT = [ + "ᴄᴀᴛ Is sʟᴇᴇᴘɪɴɢ ɴʏᴀ!", + "ᴄᴀᴛᴛᴏ ᴊᴜsᴛ sᴄʀᴀᴛᴄʜᴇᴅ ʏᴏᴜ", + "ᴀʙɪsʜɴᴏɪ1M is ᴛʜᴇ ᴄᴀᴛᴛᴏ ʟᴏʀᴅ", + "ᴄᴀᴛᴛᴏ ɪs ᴘʟᴀʏɪɴɢ ᴡɪᴛʜ @ᴀʙɪsʜɴᴏɪᴍғ ɴᴏᴡ!", + "Catto ʟᴏᴠᴇs ʏᴏᴜ ❤", +] diff --git a/Exon/modules/nhentai.py b/Exon/modules/nhentai.py new file mode 100644 index 00000000..bd4b26a8 --- /dev/null +++ b/Exon/modules/nhentai.py @@ -0,0 +1,81 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 requests +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup + +from Exon import BOT_USERNAME, pgram, telegraph +from Exon.utils.errors import capture_err + + +@pgram.on_message(~filters.me & filters.command("nhentai", prefixes="/"), group=8) +@capture_err +async def nhentai(client, message): + query = message.text.split(" ")[1] + title, tags, artist, total_pages, post_url, cover_image = nhentai_data(query) + await message.reply_text( + f"<code>{title}</code>\n\n<b>Tags:</b>\n{tags}\n<b>Artists:</b>\n{artist}\n<b>Pages:</b>\n{total_pages}", + reply_markup=InlineKeyboardMarkup( + [[InlineKeyboardButton("ʀᴇᴀᴅ ʜᴇʀᴇ", url=post_url)]] + ), + ) + + +def nhentai_data(noombers): + url = f"https://nhentai.net/api/gallery/{noombers}" + res = requests.get(url).json() + pages = res["images"]["pages"] + info = res["tags"] + title = res["title"]["english"] + links = [] + tags = "" + artist = "" + total_pages = res["num_pages"] + extensions = {"j": "jpg", "p": "png", "g": "gif"} + for i, x in enumerate(pages): + media_id = res["media_id"] + temp = x["t"] + file = f"{i+1}.{extensions[temp]}" + link = f"https://i.nhentai.net/galleries/{media_id}/{file}" + links.append(link) + + for i in info: + if i["type"] == "tag": + tag = i["name"] + tag = tag.split(" ") + tag = "_".join(tag) + tags += f"#{tag} " + if i["type"] == "artist": + artist = f"{i['name']} " + + post_content = "".join(f"<img src={link}><br>" for link in links) + + post = telegraph.create_page( + f"{title}", + html_content=post_content, + author_name="ɪᴛs ᴍᴇ", + author_url=f"https://t.me/{BOT_USERNAME}", + ) + return title, tags, artist, total_pages, post["url"], links[0] diff --git a/Exon/modules/nightmode.py b/Exon/modules/nightmode.py new file mode 100644 index 00000000..e9ad04b5 --- /dev/null +++ b/Exon/modules/nightmode.py @@ -0,0 +1,164 @@ +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from telethon import functions, types +from telethon.tl.types import ChatBannedRights + +from Exon import dispatcher +from Exon import telethn as tbot +from Exon.events import register +from Exon.modules.sql.nightmode_sql import ( + add_nightmode, + get_all_chat_id, + is_nightmode_indb, + rmnightmode, +) + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + + return isinstance( + ( + await tbot(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + elif isinstance(chat, types.InputPeerChat): + + ui = await tbot.get_peer_id(user) + ps = ( + await tbot(functions.messages.GetFullChatRequest(chat.chat_id)) + ).full_chat.participants.participants + return isinstance( + next((p for p in ps if p.user_id == ui), None), + (types.ChatParticipantAdmin, types.ChatParticipantCreator), + ) + else: + return None + + +hima = ChatBannedRights( + until_date=None, + send_messages=True, + send_media=True, + send_stickers=True, + send_gifs=True, + send_games=True, + send_inline=True, + send_polls=True, + invite_users=True, + pin_messages=True, + change_info=True, +) +openhima = ChatBannedRights( + until_date=None, + send_messages=False, + send_media=False, + send_stickers=False, + send_gifs=False, + send_games=False, + send_inline=False, + send_polls=False, + invite_users=True, + pin_messages=True, + change_info=True, +) + + +@register(pattern="^/nightmode") +async def close_ws(event): + if event.is_group: + if not (await is_register_admin(event.input_chat, event.message.sender_id)): + await event.reply("ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀᴅᴍɪɴ sᴏ ʏᴏᴜ ᴄᴀɴ'ᴛ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ...") + return + + if not event.is_group: + await event.reply("ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ᴇɴᴀʙʟᴇ ɴɪɢʜᴛ ᴍᴏᴅᴇ ɪɴ ɢʀᴏᴜᴘs.") + return + if is_nightmode_indb(str(event.chat_id)): + await event.reply("ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ᴀʟʀᴇᴀᴅʏ ᴇɴᴀʙʟᴇᴅ ɴɪɢʜᴛ ᴍᴏᴅᴇ.") + return + add_nightmode(str(event.chat_id)) + await event.reply( + f"ᴀᴅᴅᴇᴅ ᴄʜᴀᴛ {event.chat.title} ᴡɪᴛʜ ɪᴅ `{event.chat_id}` ᴛᴏ ᴅᴀᴛᴀʙᴀsᴇ. **ᴛʜɪs ɢʀᴏᴜᴘ ᴡɪʟʟ ʙᴇ ᴄʟᴏsᴇᴅ ᴏɴ 12 ᴀᴍ (ɪsᴛ) ᴀɴᴅ ᴡɪʟʟ ᴏᴘᴇɴ ᴏɴ 06 ᴀᴍ (ɪsᴛ)**" + ) + + +@register(pattern="^/rmnight") +async def disable_ws(event): + if event.is_group: + if not (await is_register_admin(event.input_chat, event.message.sender_id)): + await event.reply("ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀᴅᴍɪɴ sᴏ ʏᴏᴜ ᴄᴀɴ'ᴛ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ...") + return + + if not event.is_group: + await event.reply("ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ᴅɪsᴀʙʟᴇ ɴɪɢʜᴛ ᴍᴏᴅᴇ ɪɴ ɢʀᴏᴜᴘs.") + return + if not is_nightmode_indb(str(event.chat_id)): + await event.reply("ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ɴᴏᴛ ᴇɴᴀʙʟᴇᴅ ɴɪɢʜᴛ ᴍᴏᴅᴇ.") + return + rmnightmode(str(event.chat_id)) + await event.reply( + f"ʀᴇᴍᴏᴠᴇᴅ ᴄʜᴀᴛ {event.chat.title} ᴡɪᴛʜ ɪᴅ `{event.chat_id}` ғʀᴏᴍ ᴅᴀᴛᴀʙᴀsᴇ." + ) + + +async def job_close(): + ws_chats = get_all_chat_id() + if len(ws_chats) == 0: + return + for warner in ws_chats: + try: + await tbot.send_message( + int(warner.chat_id), + f"12:00 AM, ɢʀᴏᴜᴘ ɪs Closing ᴛɪʟʟ 6 ᴀᴍ. ɴɪɢʜᴛ ᴍᴏᴅᴇ sᴛᴀʀᴛᴇᴅ ! \n**ᴘᴏᴡᴇʀᴇᴅ ʙʏ {dispatcher.bot.username} **", + ) + await tbot( + functions.messages.EditChatDefaultBannedRightsRequest( + peer=int(warner.chat_id), banned_rights=hima + ) + ) + except Exception as e: + logger.info(f"ᴜɴᴀʙʟᴇ ᴛᴏ ᴄʟᴏsᴇ ɢʀᴏᴜᴘ {warner} - {e}") + + +# Run everyday at 12am +scheduler = AsyncIOScheduler(timezone="Asia/Kolkata") +scheduler.add_job(job_close, trigger="cron", hour=23, minute=59) +scheduler.start() + + +async def job_open(): + ws_chats = get_all_chat_id() + if len(ws_chats) == 0: + return + for warner in ws_chats: + try: + await tbot.send_message( + int(warner.chat_id), + f"06:00 ᴀᴍ, ɢʀᴏᴜᴘ ɪs ᴏᴘᴇɴɪɴɢ.\n**ᴘᴏᴡᴇʀᴇᴅ ʙʏ {dispatcher.bot.username}**", + ) + await tbot( + functions.messages.EditChatDefaultBannedRightsRequest( + peer=int(warner.chat_id), banned_rights=openhima + ) + ) + except Exception as e: + logger.info(f"ᴜɴᴀʙʟᴇ ᴛᴏ ᴏᴘᴇɴ ɢʀᴏᴜᴘ {warner.chat_id} - {e}") + + +# Run everyday at 06 +scheduler = AsyncIOScheduler(timezone="Asia/Kolkata") +scheduler.add_job(job_open, trigger="cron", hour=5, minute=59) +scheduler.start() + +__help__ = """ +*ᴀᴅᴍɪɴs ᴏɴʟʏ* + +⍟ /nightmode*:* `ᴀᴅᴅs ɢʀᴏᴜᴘ ᴛᴏ ɴɪɢʜᴛᴍᴏᴅᴇ ᴄʜᴀᴛs ` + +⍟ /rmnight*:* `ʀᴇᴍᴏᴠᴇs ɢʀᴏᴜᴘ ғʀᴏᴍ ɴɪɢʜᴛᴍᴏᴅᴇ ᴄʜᴀᴛs ` + +*ɴᴏᴛᴇ:* ɴɪɢʜᴛ ᴍᴏᴅᴇ ᴄʜᴀᴛs ɢᴇᴛ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴄʟᴏsᴇᴅ ᴀᴛ 12 ᴀᴍ (ɪsᴛ) ᴀɴᴅ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴏᴘᴇɴs ᴀᴛ 6 ᴀᴍ (ɪsᴛ) ᴛᴏ ᴘʀᴇᴠᴇɴᴛ ɴɪɢʜᴛ sᴘᴀᴍs. +""" + +__mod_name__ = "𝙽-ᴍᴏᴅᴇ" diff --git a/Exon/modules/notes.py b/Exon/modules/notes.py new file mode 100644 index 00000000..2de7eb9a --- /dev/null +++ b/Exon/modules/notes.py @@ -0,0 +1,627 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 ast +import random +import re +from io import BytesIO +from typing import Optional + +from telegram import ( + MAX_MESSAGE_LENGTH, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, + ParseMode, + Update, +) +from telegram.error import BadRequest +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + Filters, + MessageHandler, +) +from telegram.utils.helpers import escape_markdown, mention_markdown + +import Exon.modules.sql.notes_sql as sql +from Exon import DRAGONS, JOIN_LOGGER, LOGGER, SUPPORT_CHAT, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import connection_status, user_admin +from Exon.modules.helper_funcs.handlers import MessageHandlerChecker +from Exon.modules.helper_funcs.misc import build_keyboard, revert_buttons +from Exon.modules.helper_funcs.msg_types import get_note_type +from Exon.modules.helper_funcs.string_handling import escape_invalid_curly_brackets + +FILE_MATCHER = re.compile(r"^###file_id(!photo)?###:(.*?)(?:\s|$)") +STICKER_MATCHER = re.compile(r"^###sticker(!photo)?###:") +BUTTON_MATCHER = re.compile(r"^###button(!photo)?###:(.*?)(?:\s|$)") +MYFILE_MATCHER = re.compile(r"^###file(!photo)?###:") +MYPHOTO_MATCHER = re.compile(r"^###photo(!photo)?###:") +MYAUDIO_MATCHER = re.compile(r"^###audio(!photo)?###:") +MYVOICE_MATCHER = re.compile(r"^###voice(!photo)?###:") +MYVIDEO_MATCHER = re.compile(r"^###video(!photo)?###:") +MYVIDEONOTE_MATCHER = re.compile(r"^###video_note(!photo)?###:") + +ENUM_FUNC_MAP = { + sql.Types.TEXT.value: dispatcher.bot.send_message, + sql.Types.BUTTON_TEXT.value: dispatcher.bot.send_message, + sql.Types.STICKER.value: dispatcher.bot.send_sticker, + sql.Types.DOCUMENT.value: dispatcher.bot.send_document, + sql.Types.PHOTO.value: dispatcher.bot.send_photo, + sql.Types.AUDIO.value: dispatcher.bot.send_audio, + sql.Types.VOICE.value: dispatcher.bot.send_voice, + sql.Types.VIDEO.value: dispatcher.bot.send_video, +} + + +# Do not async +def get(update, context, notename, show_none=True, no_format=False): + bot = context.bot + chat_id = update.effective_message.chat.id + note_chat_id = update.effective_chat.id + note = sql.get_note(note_chat_id, notename) + message = update.effective_message # type: Optional[Message] + + if note: + if MessageHandlerChecker.check_user(update.effective_user.id): + return + # If we're replying to a message, reply to that message (unless it's an error) + if message.reply_to_message: + reply_id = message.reply_to_message.message_id + else: + reply_id = message.message_id + if note.is_reply: + if JOIN_LOGGER: + try: + bot.forward_message( + chat_id=chat_id, + from_chat_id=JOIN_LOGGER, + message_id=note.value, + ) + except BadRequest as excp: + if excp.message != "ᴍᴇssᴀɢᴇ ᴛᴏ ғᴏʀᴡᴀʀᴅ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text( + "ᴛʜɪs ᴍᴇssᴀɢᴇ sᴇᴇᴍs to ʜᴀᴠᴇ ʙᴇᴇɴ ʟᴏsᴛ - I'ʟʟ ʀᴇᴍᴏᴠᴇ ɪᴛ " + "ғʀᴏᴍ ʏᴏᴜʀ ɴᴏᴛᴇs ʟɪsᴛ.", + ) + sql.rm_note(note_chat_id, notename) + else: + try: + bot.forward_message( + chat_id=chat_id, + from_chat_id=chat_id, + message_id=note.value, + ) + except BadRequest as excp: + if excp.message != "ᴍᴇssᴀɢᴇ ᴛᴏ ғᴏʀᴡᴀʀᴅ ɴᴏᴛ ғᴏᴜɴᴅ": + raise + message.reply_text( + "ʟᴏᴏᴋs ʟɪᴋᴇ ᴛʜᴇ ᴏʀɪɢɪɴᴀʟ sᴇɴᴅᴇʀ ᴏғ ᴛʜɪs ɴᴏᴛᴇ ʜᴀs ᴅᴇʟᴇᴛᴇᴅ " + "ᴛʜᴇɪʀ ᴍᴇssᴀɢᴇ - sorry! ɢᴇᴛ ʏᴏᴜʀ ʙᴏᴛ ᴀᴅᴍɪɴ ᴛᴏ sᴛᴀʀᴛ ᴜsɪɴɢ ᴀ " + "ᴍᴇssᴀɢᴇ ᴅᴜᴍᴘ ᴛᴏ ᴀᴠᴏɪᴅ ᴛʜɪs. I'ʟʟ ʀᴇᴍᴏᴠᴇ ᴛʜɪs ɴᴏᴛᴇ from " + "your saved notes.", + ) + sql.rm_note(note_chat_id, notename) + else: + VALID_NOTE_FORMATTERS = [ + "first", + "last", + "fullname", + "username", + "id", + "chatname", + "mention", + ] + if valid_format := escape_invalid_curly_brackets( + note.value, + VALID_NOTE_FORMATTERS, + ): + if not no_format and "%%%" in valid_format: + split = valid_format.split("%%%") + text = random.choice(split) if all(split) else valid_format + else: + text = valid_format + text = text.format( + first=escape_markdown(message.from_user.first_name), + last=escape_markdown( + message.from_user.last_name or message.from_user.first_name, + ), + fullname=escape_markdown( + " ".join( + [ + message.from_user.first_name, + message.from_user.last_name, + ] + if message.from_user.last_name + else [message.from_user.first_name], + ), + ), + username=f"@{message.from_user.username}" + if message.from_user.username + else mention_markdown( + message.from_user.id, + message.from_user.first_name, + ), + mention=mention_markdown( + message.from_user.id, + message.from_user.first_name, + ), + chatname=escape_markdown( + message.chat.title + if message.chat.type != "private" + else message.from_user.first_name, + ), + id=message.from_user.id, + ) + + else: + text = "" + + keyb = [] + parseMode = ParseMode.MARKDOWN + buttons = sql.get_buttons(note_chat_id, notename) + if no_format: + parseMode = None + text += revert_buttons(buttons) + else: + keyb = build_keyboard(buttons) + + keyboard = InlineKeyboardMarkup(keyb) + + try: + if note.msgtype in (sql.Types.BUTTON_TEXT, sql.Types.TEXT): + bot.send_message( + chat_id, + text, + reply_to_message_id=reply_id, + parse_mode=parseMode, + disable_web_page_preview=True, + reply_markup=keyboard, + ) + elif ENUM_FUNC_MAP[note.msgtype] == dispatcher.bot.send_sticker: + ENUM_FUNC_MAP[note.msgtype]( + chat_id, + note.file, + reply_to_message_id=reply_id, + reply_markup=keyboard, + ) + else: + ENUM_FUNC_MAP[note.msgtype]( + chat_id, + note.file, + caption=text, + reply_to_message_id=reply_id, + parse_mode=parseMode, + reply_markup=keyboard, + ) + + except BadRequest as excp: + if excp.message == "Entity_mention_user_invalid": + message.reply_text( + "ʟᴏᴏᴋs ʟɪᴋᴇ ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ ᴍᴇɴᴛɪᴏɴ sᴏᴍᴇᴏɴᴇ I'ᴠᴇ ɴᴇᴠᴇʀ sᴇᴇɴ ʙᴇғᴏʀᴇ. ɪғ ʏᴏᴜ ʀᴇᴀʟʟʏ " + "ᴡᴀɴᴛ ᴛᴏ ᴍᴇɴᴛɪᴏɴ ᴛʜᴇᴍ, ғᴏʀᴡᴀʀᴅ ᴏɴᴇ ᴏғ ᴛʜᴇɪʀ ᴍᴇssᴀɢᴇs ᴛᴏ ᴍᴇ, ᴀɴᴅ I'ʟʟ ʙᴇ ᴀʙʟᴇ " + "ᴛᴏ ᴛᴀɢ ᴛʜᴇᴍ!", + ) + elif FILE_MATCHER.match(note.value): + message.reply_text( + "ᴛʜɪs ɴᴏᴛᴇ ᴡᴀs ᴀɴ ɪɴᴄᴏʀʀᴇᴄᴛʟʏ i=mported ғɪʟᴇ ғʀᴏᴍ ᴀɴᴏᴛʜᴇʀ ʙᴏᴛ - I ᴄᴀɴ'ᴛ ᴜsᴇ " + "ɪᴛ. ɪғ ʏᴏᴜ ʀᴇᴀʟʟʏ ɴᴇᴇᴅ it, ʏᴏᴜ'ʟʟ ʜᴀᴠᴇ ᴛᴏ sᴀᴠᴇ ɪᴛ ᴀɢᴀɪɴ. ɪɴ " + "ᴛʜᴇ ᴍᴇᴀɴᴛɪᴍᴇ, I'ʟʟ ʀᴇᴍᴏᴠᴇ ɪᴛ ғʀᴏᴍ ʏᴏᴜʀ ɴᴏᴛᴇs ʟɪsᴛ.", + ) + sql.rm_note(note_chat_id, notename) + else: + message.reply_text( + "This= ɴᴏᴛᴇ ᴄᴏᴜʟᴅ ɴᴏᴛ ʙᴇ sᴇɴᴛ, ᴀs ɪᴛ ɪs ɪɴᴄᴏʀʀᴇᴄᴛʟʏ ғᴏʀᴍᴀᴛᴛᴇᴅ. ᴀsᴋ ɪɴ " + f"@{SUPPORT_CHAT} ɪғ ʏᴏᴜ ᴄᴀɴ'ᴛ ғɪɢᴜʀᴇ ᴏᴜᴛ ᴡʜʏ!", + ) + LOGGER.exception( + "ᴄᴏᴜʟᴅ ɴᴏᴛ ᴘᴀʀsᴇ ᴍᴇssᴀɢᴇ #%s ɪɴ ᴄʜᴀᴛ %s", + notename, + str(note_chat_id), + ) + LOGGER.warning("ᴍᴇssᴀɢᴇ ᴡᴀs: %s", str(note.value)) + return + if show_none: + message.reply_text("ᴛʜɪs ɴᴏᴛᴇ ᴅᴏᴇsɴ'ᴛ ᴇxɪsᴛ") + + +@connection_status +def cmd_get(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + if len(args) >= 2 and args[1].lower() == "noformat": + get(update, context, args[0].lower(), show_none=True, no_format=True) + elif len(args) >= 1: + get(update, context, args[0].lower(), show_none=True) + else: + update.effective_message.reply_text("Get rekt") + + +@connection_status +def hash_get(update: Update, context: CallbackContext): + message = update.effective_message.text + fst_word = message.split()[0] + no_hash = fst_word[1:].lower() + get(update, context, no_hash, show_none=False) + + +@connection_status +def slash_get(update: Update, context: CallbackContext): + message, chat_id = update.effective_message.text, update.effective_chat.id + no_slash = message[1:] + note_list = sql.get_all_chat_notes(chat_id) + + try: + noteid = note_list[int(no_slash) - 1] + note_name = str(noteid).strip(">").split()[1] + get(update, context, note_name, show_none=False) + except IndexError: + update.effective_message.reply_text("ᴡʀᴏɴɢ ɴᴏᴛᴇ ID 😾") + + +@user_admin +@connection_status +def save(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + msg = update.effective_message # type: Optional[Message] + + note_name, text, data_type, content, buttons = get_note_type(msg) + note_name = note_name.lower() + if data_type is None: + msg.reply_text("ᴅᴜᴅᴇ, ᴛʜᴇʀᴇ's ɴᴏ ɴᴏᴛᴇ") + return + + sql.add_note_to_db( + chat_id, + note_name, + text, + data_type, + buttons=buttons, + file=content, + ) + + msg.reply_text( + f"ʏᴀs! ᴀᴅᴅᴇᴅ `{note_name}`.\nɢᴇᴛ ɪᴛ ᴡɪᴛʜ /get `{note_name}`, ᴏʀ `#{note_name}`", + parse_mode=ParseMode.MARKDOWN, + ) + + if msg.reply_to_message and msg.reply_to_message.from_user.is_bot: + if text: + msg.reply_text( + "sᴇᴇᴍs ʟɪᴋᴇ ʏᴏᴜ'ʀᴇ ᴛʀʏɪɴɢ to sᴀᴠᴇ ᴀ ᴍᴇssᴀɢᴇ ғʀᴏᴍ ᴀ ʙᴏᴛ. ᴜɴғᴏʀᴛᴜɴᴀᴛᴇʟʏ, " + "ʙᴏᴛ's ᴄᴀɴ'ᴛ ғᴏʀᴡᴀʀᴅ ʙᴏᴛ ᴍᴇssᴀɢᴇs, sᴏ I ᴄᴀɴ'ᴛ sᴀᴠᴇ ᴛʜᴇ ᴇxᴀᴄᴛ ᴍᴇssᴀɢᴇ. " + "\nI'll sᴀᴠᴇ ᴀʟʟ ᴛʜᴇ ᴛᴇxᴛ I ᴄᴀɴ, ʙᴜᴛ ɪғ ʏᴏᴜ ᴡᴀɴᴛ ᴍᴏʀᴇ, ʏᴏᴜ'ʟʟ ʜᴀᴠᴇ ᴛᴏ " + "ғᴏʀᴡᴀʀᴅ ᴛʜᴇ ᴍᴇssᴀɢᴇ ʏᴏᴜʀsᴇʟғ, ᴀɴᴅ ᴛʜᴇɴ sᴀᴠᴇ ɪᴛ.", + ) + else: + msg.reply_text( + "ʙᴏᴛs ᴀʀᴇ ᴋɪɴᴅᴀ ʜᴀɴᴅɪᴄᴀᴘᴘᴇᴅ ʙʏ ᴛᴇʟᴇɢʀᴀᴍ, ᴍᴀᴋɪɴɢ ɪᴛ ʜᴀʀᴅ ғᴏʀ ʙᴏᴛs ᴛᴏ " + "ɪɴᴛᴇʀᴀᴄᴛ ᴡɪᴛʜ ᴏᴛʜᴇʀ ʙᴏᴛs, sᴏ ɪ ᴄᴀɴ'ᴛ sᴀᴠᴇ ᴛʜɪs ᴍᴇssᴀɢᴇ " + "ʟɪᴋᴇ I ᴜsᴜᴀʟʟʏ ᴡᴏᴜʟᴅ - ᴅᴏ ʏᴏᴜ ᴍɪɴᴅ ғᴏʀᴡᴀʀᴅɪɴɢ ɪᴛ ᴀɴᴅ " + "ᴛʜᴇɴ sᴀᴠɪɴɢ ᴛʜᴀᴛ ɴᴇᴡ ᴍᴇssᴀɢᴇ? ᴛʜᴀɴᴋs!", + ) + return + + +@user_admin +@connection_status +def clear(update: Update, context: CallbackContext): + args = context.args + if len(args) >= 1: + chat_id = update.effective_chat.id + notename = args[0].lower() + + if sql.rm_note(chat_id, notename): + update.effective_message.reply_text("sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇᴍᴏᴠᴇᴅ ɴᴏᴛᴇ.") + else: + update.effective_message.reply_text("ᴛʜᴀᴛ's ɴᴏᴛ ᴀ ɴᴏᴛᴇ ɪɴ ᴍʏ ᴅᴀᴛᴀʙᴀsᴇ!") + + +def clearall(update: Update, context: CallbackContext): + chat = update.effective_chat + user = update.effective_user + member = chat.get_member(user.id) + if member.status != "creator" and user.id not in DRAGONS: + update.effective_message.reply_text( + "ᴏɴʟʏ ᴛʜᴇ ᴄʜᴀᴛ ᴏᴡɴᴇʀ ᴄᴀɴ ᴄʟᴇᴀʀ ᴀʟʟ ɴᴏᴛᴇs ᴀᴛ ᴏɴᴄᴇ.", + ) + else: + buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ᴅᴇʟᴇᴛᴇ ᴀʟʟ ɴᴏᴛᴇs", + callback_data="notes_rmall", + ), + ], + [InlineKeyboardButton(text="ᴄᴀɴᴄᴇʟ", callback_data="notes_cancel")], + ], + ) + update.effective_message.reply_text( + f"ᴀʀᴇ ʏᴏᴜ sᴜʀᴇ ʏᴏᴜ ᴡᴏᴜʟᴅ ʟɪᴋᴇ ᴛᴏ ᴄʟᴇᴀʀ ALL ɴᴏᴛᴇs ɪɴ {chat.title}? ᴛʜɪs ᴀᴄᴛɪᴏɴ ᴄᴀɴɴᴏᴛ ʙᴇ ᴜɴᴅᴏɴᴇ.", + reply_markup=buttons, + parse_mode=ParseMode.MARKDOWN, + ) + + +def clearall_btn(update: Update, context: CallbackContext): + query = update.callback_query + chat = update.effective_chat + message = update.effective_message + member = chat.get_member(query.from_user.id) + if query.data == "notes_rmall": + if member.status == "creator" or query.from_user.id in DRAGONS: + note_list = sql.get_all_chat_notes(chat.id) + try: + for notename in note_list: + note = notename.name.lower() + sql.rm_note(chat.id, note) + message.edit_text("ᴅᴇʟᴇᴛᴇᴅ ᴀʟʟ ɴᴏᴛᴇs.") + except BadRequest: + return + + if member.status == "administrator": + query.answer("ᴏɴʟʏ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ ᴄᴀɴ ᴅᴏ ᴛʜɪs.") + + if member.status == "member": + query.answer("ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴀᴅᴍɪɴ ᴛᴏ ᴅᴏ ᴛʜɪs.") + elif query.data == "notes_cancel": + if member.status == "creator" or query.from_user.id in DRAGONS: + message.edit_text("ᴄʟᴇᴀʀɪɴɢ ᴏғ ᴀʟʟ ɴᴏᴛᴇs ʜᴀs ʙᴇᴇɴ ᴄᴀɴᴄᴇʟʟᴇᴅ.") + return + if member.status == "administrator": + query.answer("ᴏɴʟʏ ᴏᴡɴᴇʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ ᴄᴀɴ ᴅᴏ ᴛʜɪs.") + if member.status == "member": + query.answer("ʏᴏᴜ ɴᴇᴇᴅ ᴛᴏ ʙᴇ ᴀᴅᴍɪɴ ᴛᴏ ᴅᴏ ᴛʜɪs.") + + +@connection_status +def list_notes(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + note_list = sql.get_all_chat_notes(chat_id) + notes = len(note_list) + 1 + msg = "ɢᴇᴛ ɴᴏᴛᴇ ʙʏ `/notenumber` ᴏʀ `#notename` \n\n *ɪᴅ* *ɴᴏᴛᴇ* \n" + for note_id, note in zip(range(1, notes), note_list): + if note_id < 10: + note_name = f"`{note_id:2}.` `#{(note.name.lower())}`\n" + else: + note_name = f"`{note_id}.` `#{(note.name.lower())}`\n" + if len(msg) + len(note_name) > MAX_MESSAGE_LENGTH: + update.effective_message.reply_text(msg, parse_mode=ParseMode.MARKDOWN) + msg = "" + msg += note_name + + if not note_list: + try: + update.effective_message.reply_text("ɴᴏ ɴᴏᴛᴇs ɪɴ ᴛʜɪs ᴄʜᴀᴛ!") + except BadRequest: + update.effective_message.reply_text("ɴᴏ ɴᴏᴛᴇs ɪɴ ᴛʜɪs ᴄʜᴀᴛ!", quote=False) + + elif len(msg) != 0: + update.effective_message.reply_text(msg, parse_mode=ParseMode.MARKDOWN) + + +def __import_data__(chat_id, data): + failures = [] + for notename, notedata in data.get("extra", {}).items(): + match = FILE_MATCHER.match(notedata) + matchsticker = STICKER_MATCHER.match(notedata) + matchbtn = BUTTON_MATCHER.match(notedata) + matchfile = MYFILE_MATCHER.match(notedata) + matchphoto = MYPHOTO_MATCHER.match(notedata) + matchaudio = MYAUDIO_MATCHER.match(notedata) + matchvoice = MYVOICE_MATCHER.match(notedata) + matchvideo = MYVIDEO_MATCHER.match(notedata) + matchvn = MYVIDEONOTE_MATCHER.match(notedata) + + if match: + failures.append(notename) + if notedata := notedata[match.end() :].strip(): + sql.add_note_to_db(chat_id, notename[1:], notedata, sql.Types.TEXT) + elif matchsticker: + if content := notedata[matchsticker.end() :].strip(): + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.STICKER, + file=content, + ) + elif matchbtn: + parse = notedata[matchbtn.end() :].strip() + notedata = parse.split("<###button###>")[0] + buttons = parse.split("<###button###>")[1] + if buttons := ast.literal_eval(buttons): + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.BUTTON_TEXT, + buttons=buttons, + ) + elif matchfile: + file = notedata[matchfile.end() :].strip() + file = file.split("<###TYPESPLIT###>") + notedata = file[1] + if content := file[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.DOCUMENT, + file=content, + ) + elif matchphoto: + photo = notedata[matchphoto.end() :].strip() + photo = photo.split("<###TYPESPLIT###>") + notedata = photo[1] + if content := photo[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.PHOTO, + file=content, + ) + elif matchaudio: + audio = notedata[matchaudio.end() :].strip() + audio = audio.split("<###TYPESPLIT###>") + notedata = audio[1] + if content := audio[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.AUDIO, + file=content, + ) + elif matchvoice: + voice = notedata[matchvoice.end() :].strip() + voice = voice.split("<###TYPESPLIT###>") + notedata = voice[1] + if content := voice[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.VOICE, + file=content, + ) + elif matchvideo: + video = notedata[matchvideo.end() :].strip() + video = video.split("<###TYPESPLIT###>") + notedata = video[1] + if content := video[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.VIDEO, + file=content, + ) + elif matchvn: + video_note = notedata[matchvn.end() :].strip() + video_note = video_note.split("<###TYPESPLIT###>") + notedata = video_note[1] + if content := video_note[0]: + sql.add_note_to_db( + chat_id, + notename[1:], + notedata, + sql.Types.VIDEO_NOTE, + file=content, + ) + else: + sql.add_note_to_db(chat_id, notename[1:], notedata, sql.Types.TEXT) + + if failures: + with BytesIO(str.encode("\n".join(failures))) as output: + output.name = "failed_imports.txt" + dispatcher.bot.send_document( + chat_id, + document=output, + filename="failed_imports.txt", + caption="ᴛʜᴇsᴇ ғɪʟᴇs/ᴘʜᴏᴛᴏs ғᴀɪʟᴇᴅ ᴛᴏ ɪᴍᴘᴏʀᴛ ᴅᴜᴇ ᴛᴏ ᴏʀɪɢɪɴᴀᴛɪɴɢ " + "ғʀᴏᴍ ᴀɴᴏᴛʜᴇʀ ʙᴏᴛ. ᴛʜɪs ɪs ᴀ ᴛᴇʟᴇɢʀᴀᴍ ᴀᴘɪ ʀᴇsᴛʀɪᴄᴛɪᴏɴ, ᴀɴᴅ ᴄᴀɴ'ᴛ " + "ʙᴇ ᴀᴠᴏɪᴅᴇᴅ. sᴏʀʀʏ ғᴏʀ ᴛʜᴇ ɪɴᴄᴏɴᴠᴇɴɪᴇɴᴄᴇ!", + ) + + +def __stats__(): + return f"•➥ {sql.num_notes()} ɴᴏᴛᴇs, ᴀᴄʀᴏss {sql.num_chats()} ᴄʜᴀᴛs." + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + notes = sql.get_all_chat_notes(chat_id) + return f"ᴛʜᴇʀᴇ ᴀʀᴇ `{len(notes)}` ɴᴏᴛᴇs ɪɴ ᴛʜɪs ᴄʜᴀᴛ." + + +__help__ = """ +•➥ /get <notename>*:* `ɢᴇᴛ ᴛʜᴇ ɴᴏᴛᴇ ᴡɪᴛʜ this ɴᴏᴛᴇɴᴀᴍᴇ` + +•➥ `#<notename>*:* same as /get` + +•➥ /notes or /saved*:* `ʟɪsᴛ ᴀʟʟ sᴀᴠᴇᴅ ɴᴏᴛᴇs ɪɴ ᴛʜɪs ᴄʜᴀᴛ` + +•➥ /number *:* `ᴡɪʟʟ ᴘᴜʟʟ ᴛʜᴇ ɴᴏᴛᴇ ᴏғ ᴛʜᴀᴛ ɴᴜᴍʙᴇʀ ɪɴ ᴛʜᴇ ʟɪsᴛ` + +`ɪғ ʏᴏᴜ ᴡᴏᴜʟᴅ ʟɪᴋᴇ ᴛᴏ ʀᴇᴛʀɪᴇᴠᴇ ᴛʜᴇ ᴄᴏɴᴛᴇɴᴛs ᴏғ ᴀ ɴᴏᴛᴇ ᴡɪᴛʜᴏᴜᴛ ᴀɴʏ ғᴏʀᴍᴀᴛᴛɪɴɢ, ᴜsᴇ` `/get <notename> ɴᴏғᴏʀᴍᴀᴛ`. `ᴛʜɪs ᴄᴀɴ` \ +`ʙᴇ ᴜsᴇғᴜʟ ᴡʜᴇɴ ᴜᴘᴅᴀᴛɪɴɢ ᴀ ᴄᴜʀʀᴇɴᴛ ɴᴏᴛᴇ` + +*ᴀᴅᴍɪɴꜱ ᴏɴʟʏ:* +•➥ /save <notename> <notedata>*:* `ꜱᴀᴠᴇꜱ ɴᴏᴛᴇᴅᴀᴛᴀ ᴀꜱ ᴀ ɴᴏᴛᴇ ᴡɪᴛʜ ɴᴀᴍᴇ ɴᴏᴛᴇɴᴀᴍᴇ` + +`A ʙᴜᴛᴛᴏɴ ᴄᴀɴ ʙᴇ ᴀᴅᴅᴇᴅ ᴛᴏ ᴀ ɴᴏᴛᴇ ʙʏ ᴜꜱɪɴɢ ꜱᴛᴀɴᴅᴀʀᴅ ᴍᴀʀᴋᴅᴏᴡɴ ʟɪɴᴋ ꜱʏɴᴛᴀx - ᴛʜᴇ ʟɪɴᴋ ꜱʜᴏᴜʟᴅ ᴊᴜꜱᴛ ʙᴇ ᴘʀᴇᴘᴇɴᴅᴇᴅ ᴡɪᴛʜ ᴀ` + \ +`buttonurl:` ꜱᴇᴄᴛɪᴏɴ, ᴀꜱ ꜱᴜᴄʜ: `[somelink](buttonurl:example.com)`. ᴄʜᴇᴄᴋ `/ᴍᴀʀᴋᴅᴏᴡɴʜᴇʟᴘ` ғᴏʀ ᴍᴏʀᴇ ɪɴғᴏ + +•➥ /save <notename>*:* `ꜱᴀᴠᴇ ᴛʜᴇ ʀᴇᴘʟɪᴇᴅ ᴍᴇꜱꜱᴀɢᴇ ᴀꜱ ᴀ ɴᴏᴛᴇ ᴡɪᴛʜ ɴᴀᴍᴇ ɴᴏᴛᴇɴᴀᴍᴇ` + + `ꜱᴇᴘᴀʀᴀᴛᴇ ᴅɪғғ ʀᴇᴘʟɪᴇꜱ ʙʏ` `%%%` `ᴛᴏ ɢᴇᴛ ʀᴀɴᴅᴏᴍ ɴᴏᴛᴇꜱ` + + *ᴇxᴀᴍᴘʟᴇ:* + `/save notename + Reply 1 + %%% + Reply 2 + %%% + Reply 3` + +•➥ /clear <notename>*:* `ᴄʟᴇᴀʀ ɴᴏᴛᴇ ᴡɪᴛʜ ᴛʜɪꜱ ɴᴀᴍᴇ` + +•➥ /removeallnotes*:* `ʀᴇᴍᴏᴠᴇꜱ ᴀʟʟ ɴᴏᴛᴇꜱ ғʀᴏᴍ ᴛʜᴇ ɢʀᴏᴜᴘ` + + *ɴᴏᴛᴇ:* `ɴᴏᴛᴇ ɴᴀᴍᴇꜱ ᴀʀᴇ ᴄᴀꜱᴇ--ꜱᴇɴꜱɪᴛɪᴠᴇ, ᴀɴᴅ ᴛʜᴇʏ ᴀʀᴇ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴄᴏɴᴠᴇʀᴛᴇᴅ ᴛᴏ ʟᴏᴡᴇʀᴄᴀꜱᴇ ʙᴇғᴏʀᴇ ɢᴇᴛᴛɪɴɢ ꜱᴀᴠᴇᴅ.` + +""" + +__mod_name__ = "𝙽ᴏᴛᴇs" + +GET_HANDLER = CommandHandler("get", cmd_get, run_async=True) +HASH_GET_HANDLER = MessageHandler(Filters.regex(r"^#[^\s]+"), hash_get, run_async=True) +SLASH_GET_HANDLER = MessageHandler(Filters.regex(r"^/\d+$"), slash_get, run_async=True) +SAVE_HANDLER = CommandHandler("save", save, run_async=True) +DELETE_HANDLER = CommandHandler("clear", clear, run_async=True) + +LIST_HANDLER = DisableAbleCommandHandler( + ["notes", "saved"], list_notes, admin_ok=True, run_async=True +) + +CLEARALL = DisableAbleCommandHandler("removeallnotes", clearall, run_async=True) +CLEARALL_BTN = CallbackQueryHandler(clearall_btn, pattern=r"notes_.*", run_async=True) + +dispatcher.add_handler(GET_HANDLER) +dispatcher.add_handler(SAVE_HANDLER) +dispatcher.add_handler(LIST_HANDLER) +dispatcher.add_handler(DELETE_HANDLER) +dispatcher.add_handler(HASH_GET_HANDLER) +dispatcher.add_handler(SLASH_GET_HANDLER) +dispatcher.add_handler(CLEARALL) +dispatcher.add_handler(CLEARALL_BTN) diff --git a/Exon/modules/paste.py b/Exon/modules/paste.py new file mode 100644 index 00000000..2fe21396 --- /dev/null +++ b/Exon/modules/paste.py @@ -0,0 +1,88 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 + +import aiofiles +from pykeyboard import InlineKeyboard +from pyrogram import filters +from pyrogram.types import InlineKeyboardButton + +from Exon import aiohttpsession, pgram +from Exon.utils.errors import capture_err +from Exon.utils.pastebin import paste + +pattern = re.compile(r"^text/|json$|yaml$|xml$|toml$|x-sh$|x-shellscript$") + + +async def isPreviewUp(preview: str) -> bool: + for _ in range(7): + try: + async with aiohttpsession.head(preview, timeout=2) as resp: + status = resp.status + size = resp.content_length + except asyncio.exceptions.TimeoutError: + return False + if status == 404 or (status == 200 and size == 0): + await asyncio.sleep(0.4) + else: + return status == 200 + return False + + +@pgram.on_message(filters.command("paste") & ~filters.edited) +@capture_err +async def paste_func(_, message): + if not message.reply_to_message: + return await message.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴡɪᴛʜ `/paste`") + m = await message.reply_text("ᴘᴀsᴛɪɴɢ...") + if message.reply_to_message.text: + content = str(message.reply_to_message.text) + elif message.reply_to_message.document: + document = message.reply_to_message.document + if document.file_size > 1048576: + return await m.edit("ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ ᴘᴀsᴛᴇ ғɪʟᴇs sᴍᴀʟʟᴇʀ ᴛʜᴀɴ 1ᴍʙ.") + if not pattern.search(document.mime_type): + return await m.edit("ᴏɴʟʏ ᴛᴇxᴛ ғɪʟᴇs ᴄᴀɴ ʙᴇ ᴘᴀsᴛᴇᴅ.") + doc = await message.reply_to_message.download() + async with aiofiles.open(doc, mode="r") as f: + content = await f.read() + os.remove(doc) + link = await paste(content) + preview = f"{link}/preview.png" + button = InlineKeyboard(row_width=1) + button.add(InlineKeyboardButton(text="ᴘᴀsᴛᴇ ʟɪɴᴋ", url=link)) + + if await isPreviewUp(preview): + try: + await message.reply_photo(photo=preview, quote=False, reply_markup=button) + return await m.delete() + except Exception: + pass + return await m.edit(link) + + +__mod_name__ = "ᴘᴀsᴛᴇ" diff --git a/Exon/modules/ping.py b/Exon/modules/ping.py new file mode 100644 index 00000000..ab31f1de --- /dev/null +++ b/Exon/modules/ping.py @@ -0,0 +1,133 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import time +from typing import List + +import requests +from telegram import ParseMode, Update +from telegram.ext import CallbackContext + +from Exon import StartTime, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import sudo_plus + +sites_list = { + "ᴛᴇʟᴇɢʀᴀᴍ": "https://api.telegram.org", + "ᴋᴀɪᴢᴏᴋᴜ": "https://animekaizoku.com", + "ᴊɪᴋᴀɴ": "https://api.jikan.moe/v3", + "ᴋᴜᴋɪ ᴄʜᴀᴛʙᴏᴛ": "https://kuki-yukicloud.up.railway.app/", + "ʟɪᴏɴᴇs ᴀᴘɪ": "https://liones-api.herokuapp.com/", +} + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += f"{time_list.pop()}, " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +def ping_func(to_ping: List[str]) -> List[str]: + ping_result = [] + + for each_ping in to_ping: + + start_time = time.time() + site_to_ping = sites_list[each_ping] + r = requests.get(site_to_ping) + end_time = time.time() + ping_time = f"{str(round((end_time - start_time), 2))}s" + + pinged_site = f"<b>{each_ping}</b>" + + if each_ping in ("Kaizoku"): + pinged_site = f'<a href="{sites_list[each_ping]}">{each_ping}</a>' + ping_time = f"<code>{ping_time} (Status: {r.status_code})</code>" + + ping_text = f"{pinged_site}: <code>{ping_time}</code>" + ping_result.append(ping_text) + + return ping_result + + +@sudo_plus +def ping(update: Update, context: CallbackContext): + msg = update.effective_message + + start_time = time.time() + message = msg.reply_text("ᴘɪɴɢɪɴɢ.....") + end_time = time.time() + telegram_ping = f"{str(round((end_time - start_time) * 1000, 3))} ms" + uptime = get_readable_time((time.time() - StartTime)) + + message.edit_text( + f"𝗣𝗢𝗡𝗚 🎉!!\n<b>ᴛɪᴍᴇ ᴛᴀᴋᴇɴ:</b> <code>{telegram_ping}</code>\n<b>sᴇʀᴠɪᴄᴇ ᴜᴘᴛɪᴍᴇ:</b> <code>{uptime}</code>", + parse_mode=ParseMode.HTML, + ) + + +@sudo_plus +def pingall(update: Update, context: CallbackContext): + to_ping = ["ᴋᴀɪᴢᴏᴋᴜ", "ᴛᴇʟᴇɢʀᴀᴍ", "ᴊɪᴋᴀɴ", "ᴋᴜᴋɪ ᴄʜᴀᴛʙᴏᴛ", "ʟɪᴏɴᴇs ᴀᴘɪ"] + pinged_list = ping_func(to_ping) + pinged_list.insert(2, "") + uptime = get_readable_time((time.time() - StartTime)) + + reply_msg = "⏱ᴘɪɴɢ ʀᴇsᴜʟᴛs ᴀʀᴇ:\n" + "\n".join(pinged_list) + reply_msg += f"\n<b>sᴇʀᴠɪᴄᴇ ᴜᴘᴛɪᴍᴇ:</b> <code>{uptime}</code>" + + update.effective_message.reply_text( + reply_msg, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + + +PING_HANDLER = DisableAbleCommandHandler("ping", ping, run_async=True) +PINGALL_HANDLER = DisableAbleCommandHandler("pingall", pingall, run_async=True) + +dispatcher.add_handler(PING_HANDLER) +dispatcher.add_handler(PINGALL_HANDLER) + +__command_list__ = ["ping", "pingall"] +__handlers__ = [PING_HANDLER, PINGALL_HANDLER] diff --git a/Exon/modules/pokedex.py b/Exon/modules/pokedex.py new file mode 100644 index 00000000..2c501dd6 --- /dev/null +++ b/Exon/modules/pokedex.py @@ -0,0 +1,42 @@ +from pyrogram import filters + +from Exon import pgram + + +@pgram.on_message(filters.command("pokedex")) +async def PokeDex(_, message): + if len(message.command) != 2: + await message.reply_text("/pokedex ᴘᴏᴋᴇᴍᴏɴ ɴᴀᴍᴇ") + return + pokemon = message.text.split(None, 1)[1] + pokedex = f"https://some-random-api.ml/pokedex?pokemon={pokemon}" + async with aiohttp.ClientSession() as session: + async with session.get(pokedex) as request: + if request.status == 404: + return await message.reply_text("ᴡʀᴏɴɢ ᴘᴏᴋᴇᴍᴏɴ ɴᴀᴍᴇ") + + result = await request.json() + try: + pokemon = result["name"] + pokedex = result["id"] + type = result["type"] + poke_img = f"https://img.pokemondb.net/artwork/large/{pokemon}.jpg" + abilities = result["abilities"] + height = result["height"] + weight = result["weight"] + gender = result["gender"] + stats = result["stats"] + description = result["description"] + caption = f""" +**ᴘᴏᴋᴇᴍᴏɴ:** `{pokemon}` +**ᴘᴏᴋᴇᴅᴇx:** `{pokedex}` +**ᴛʏᴘᴇ:** `{type}` +**ᴀʙɪʟɪᴛɪᴇs:** `{abilities}` +**ʜᴇɪɢʜᴛ:** `{height}` +**ᴡᴇɪɢʜᴛ:** `{weight}` +**ɢᴇɴᴅᴇʀ:** `{gender}` +**sᴛᴀᴛs:** `{stats}` +**ᴅᴇsᴄʀɪᴘᴛɪᴏɴ:** `{description}`""" + except Exception as e: + print(e) + await message.reply_photo(photo=poke_img, caption=caption) diff --git a/Exon/modules/purge.py b/Exon/modules/purge.py new file mode 100644 index 00000000..de260036 --- /dev/null +++ b/Exon/modules/purge.py @@ -0,0 +1,107 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import time + +from telethon import events + +from Exon import telethn +from Exon.modules.helper_funcs.telethn.chatstatus import ( + can_delete_messages, + user_is_admin, +) + + +async def purge_messages(event): + start = time.perf_counter() + if event.from_id is None: + return + + if not await user_is_admin( + user_id=event.sender_id, + message=event, + ) and event.from_id not in [1087968824]: + await event.reply("ᴏɴʟʏ ᴀᴅᴍɪɴs ᴀʀᴇ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ") + return + + if not await can_delete_messages(message=event): + await event.reply("ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ᴘᴜʀɢᴇ ᴛʜᴇ ᴍᴇssᴀɢᴇ") + return + + reply_msg = await event.get_reply_message() + if not reply_msg: + await event.reply("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ sᴇʟᴇᴄᴛ ᴡʜᴇʀᴇ ᴛᴏ sᴛᴀʀᴛ ᴘᴜʀɢɪɴɢ ғʀᴏᴍ.") + return + message_id = reply_msg.id + delete_to = event.message.id + + messages = [event.reply_to_msg_id] + for msg_id in range(message_id, delete_to + 1): + messages.append(msg_id) + if len(messages) == 100: + await event.client.delete_messages(event.chat_id, messages) + messages = [] + + try: + await event.client.delete_messages(event.chat_id, messages) + except: + pass + time.perf_counter() - start + text = "shhh!" + await event.respond(text, parse_mode="markdown") + + +async def delete_messages(event): + if event.from_id is None: + return + + if not await user_is_admin( + user_id=event.sender_id, + message=event, + ) and event.from_id not in [1087968824]: + await event.reply("ᴏɴʟʏ ᴀᴅᴍɪɴs ᴀʀᴇ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ") + return + + if not await can_delete_messages(message=event): + await event.reply("ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴛʜɪs?") + return + + message = await event.get_reply_message() + if not message: + await event.reply("ᴡʜᴀᴛ, ᴡᴀɴᴛ ᴛᴏ ᴅᴇʟᴇᴛᴇ?") + return + chat = await event.get_input_chat() + del_message = [message, event.message] + await event.client.delete_messages(chat, del_message) + + +PURGE_HANDLER = purge_messages, events.NewMessage(pattern="^[!/]purge$") +DEL_HANDLER = delete_messages, events.NewMessage(pattern="^[!/]del$") + +telethn.add_event_handler(*PURGE_HANDLER) +telethn.add_event_handler(*DEL_HANDLER) + +__mod_name__ = "Purges" +__command_list__ = ["del", "purge"] +__handlers__ = [PURGE_HANDLER, DEL_HANDLER] diff --git a/Exon/modules/quote.py b/Exon/modules/quote.py new file mode 100644 index 00000000..fa9a57b1 --- /dev/null +++ b/Exon/modules/quote.py @@ -0,0 +1,137 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 io import BytesIO +from traceback import format_exc + +from pyrogram import filters +from pyrogram.types import Message + +from Exon import arq, pgram +from Exon.utils.errors import capture_err + + +async def quotify(messages: list): + response = await arq.quotly(messages) + if not response.ok: + return [False, response.result] + sticker = response.result + sticker = BytesIO(sticker) + sticker.name = "sticker.webp" + return [True, sticker] + + +def getArg(message: Message) -> str: + return message.text.strip().split(None, 1)[1].strip() + + +def isArgInt(message: Message) -> list: + count = getArg(message) + try: + count = int(count) + return [True, count] + except ValueError: + return [False, 0] + + +@pgram.on_message(filters.command("q")) +@capture_err +async def quotly_func(client, message: Message): + if not message.reply_to_message: + return await message.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ ǫᴜᴏᴛᴇ ɪᴛ.") + if not message.reply_to_message.text: + return await message.reply_text("ʀᴇᴘʟɪᴇᴅ ᴍᴇssᴀɢᴇ ʜᴀs ɴᴏ ᴛᴇxᴛ, ᴄᴀɴ'ᴛ ǫᴜᴏᴛᴇ ɪᴛ.") + m = await message.reply_text("ǫᴜᴏᴛɪɴɢ ᴍᴇssᴀɢᴇs") + if len(message.command) < 2: + messages = [message.reply_to_message] + + elif len(message.command) == 2: + arg = isArgInt(message) + if arg[0]: + if arg[1] < 2 or arg[1] > 10: + return await m.edit("ᴀʀɢᴜᴍᴇɴᴛ ᴍᴜsᴛ ʙᴇ ʙᴇᴛᴡᴇᴇɴ 2-10.") + + count = arg[1] + + # Fetching 5 extra messages so tha twe can ignore media + # messages and still end up with correct offset + messages = [ + i + for i in await client.get_messages( + message.chat.id, + range( + message.reply_to_message.id, + message.reply_to_message.id + (count + 5), + ), + replies=0, + ) + if not i.empty and not i.media + ] + messages = messages[:count] + else: + if getArg(message) != "r": + return await m.edit( + "ɪɴᴄᴏʀʀᴇᴄᴛ ᴀʀɢᴜᴍᴇɴᴛ, ᴘᴀss **'r'** or **'INT'**, **EX:** __/q 2__" + ) + reply_message = await client.get_messages( + message.chat.id, + message.reply_to_message.id, + replies=1, + ) + messages = [reply_message] + else: + return await m.edit("ɪɴᴄᴏʀʀᴇᴄᴛ ᴀʀɢᴜᴍᴇɴᴛ, ᴄʜᴇᴄᴋ ǫᴜᴏᴛʟʏ ᴍᴏᴅᴜʟᴇ ɪɴ ʜᴇʟᴘ sᴇᴄᴛɪᴏɴ.") + try: + if not message: + return await m.edit("sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ.") + + sticker = await quotify(messages) + if not sticker[0]: + await message.reply_text(sticker[1]) + return await m.delete() + sticker = sticker[1] + await message.reply_sticker(sticker) + await m.delete() + sticker.close() + except Exception as e: + await m.edit( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ ᴡʜɪʟᴇ ǫᴜᴏᴛɪɴɢ ᴍᴇssᴀɢᴇs," + + " ᴛʜɪs ᴇʀʀᴏʀ ᴜsᴜᴀʟʟʏ ʜᴀᴘᴘᴇɴs ᴡʜᴇɴ ᴛʜᴇʀᴇ's ᴀ " + + " ᴍᴇssᴀɢᴇ ᴄᴏɴᴛᴀɪɴɪɴɢ sᴏᴍᴇᴛʜɪɴɢ other than text," + + " ᴏʀ ᴏɴᴇ ᴏғ ᴛʜᴇ ᴍᴇssᴀɢᴇs ɪɴ-ᴇᴛᴡᴇᴇɴ ᴀʀᴇ ᴅᴇʟᴇᴛᴇᴅ." + ) + e = format_exc() + print(e) + + +__mod_name__ = "𝚀ᴜᴏᴛᴇ" + +__help__ = """ + +⍟ /q : `ᴄʀᴇᴀᴛᴇ ǫᴜᴏᴛᴇ ` + +⍟ /q r : + +⍟ /q 2 ᴛᴏ 8 : +""" diff --git a/Exon/modules/raid.py b/Exon/modules/raid.py new file mode 100644 index 00000000..44c5b765 --- /dev/null +++ b/Exon/modules/raid.py @@ -0,0 +1,356 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +from datetime import timedelta +from typing import Optional + +from pytimeparse.timeparse import timeparse +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.ext import CallbackContext +from telegram.utils.helpers import mention_html + +import Exon.modules.sql.welcome_sql as sql +from Exon import LOGGER, updater +from Exon.modules.helper_funcs.anonymous import AdminPerms, user_admin +from Exon.modules.helper_funcs.chat_status import ( + bot_admin, + connection_status, + user_admin_no_reply, +) +from Exon.modules.helper_funcs.decorators import Exoncallback, Exoncmd +from Exon.modules.log_channel import loggable + +j = updater.job_queue + +# store job id in a dict to be able to cancel them later +RUNNING_RAIDS = {} # {chat_id:job_id, ...} + + +def get_time(time: str) -> int: + try: + return timeparse(time) + except BaseException: + return 0 + + +def get_readable_time(time: int) -> str: + t = f"{timedelta(seconds=time)}".split(":") + if time == 86400: + return "1 day" + return f"{t[0]} hour(s)" if time >= 3600 else f"{t[1]} minutes" + + +@Exoncmd(command="raid", pass_args=True) +@bot_admin +@connection_status +@loggable +@user_admin(AdminPerms.CAN_CHANGE_INFO) +def setRaid(update: Update, context: CallbackContext) -> Optional[str]: + args = context.args + chat = update.effective_chat + msg = update.effective_message + user = update.effective_user + if chat.type == "private": + context.bot.sendMessage(chat.id, "This ᴄᴏᴍᴍᴀɴᴅ is not available in PMs.") + return + stat, time, acttime = sql.getRaidStatus(chat.id) + readable_time = get_readable_time(time) + if len(args) == 0: + if stat: + text = "ʀᴀɪᴅ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ <code>ᴇɴᴀʙʟᴇᴅ</code>\nᴡᴏᴜʟᴅ ʏᴏᴜ ʟɪᴋᴇ ᴛᴏ <code>ᴅɪsᴀʙʟᴇ</code> raid?" + keyboard = [ + [ + InlineKeyboardButton( + "ᴅɪsᴀʙʟᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ", + callback_data=f"disable_raid={chat.id}={time}", + ), + InlineKeyboardButton( + "ᴄᴀɴᴄᴇʟ ᴀᴄᴛɪᴏɴ", callback_data="cancel_raid=1" + ), + ] + ] + + else: + text = ( + f"ʀᴀɪᴅ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ <code>ᴅɪsᴀʙʟᴇᴅ</code>\nᴡᴏᴜʟᴅ ʏᴏᴜ ʟɪᴋᴇ ᴛᴏ <code>ᴇɴᴀʙʟᴇ</code> " + f"ʀᴀɪᴅ ғᴏʀ {readable_time}?" + ) + keyboard = [ + [ + InlineKeyboardButton( + "ᴇɴᴀʙʟᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ", + callback_data=f"enable_raid={chat.id}={time}", + ), + InlineKeyboardButton( + "ᴄᴀɴᴄᴇʟ ᴀᴄᴛɪᴏɴ", callback_data="cancel_raid=0" + ), + ] + ] + + reply_markup = InlineKeyboardMarkup(keyboard) + msg.reply_text(text, parse_mode=ParseMode.HTML, reply_markup=reply_markup) + + elif args[0] == "off": + if stat: + sql.setRaidStatus(chat.id, False, time, acttime) + j.scheduler.remove_job(RUNNING_RAIDS.pop(chat.id)) + text = "ʀᴀɪᴅ ᴍᴏᴅᴇ ʜᴀs ʙᴇᴇɴ <code>Disabled</code>, ᴍᴇᴍʙᴇʀs ᴛʜᴀᴛ ᴊᴏɪɴ ᴡɪʟʟ ɴᴏ ʟᴏɴɢᴇʀ ʙᴇ ᴋɪᴄᴋᴇᴅ." + msg.reply_text(text, parse_mode=ParseMode.HTML) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴀɪᴅ\n" + f"ᴅɪsᴀʙʟᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + ) + + else: + args_time = args[0].lower() + if time := get_time(args_time): + readable_time = get_readable_time(time) + if 300 <= time < 86400: + text = ( + f"ʀᴀɪᴅ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ <code>ᴅɪsᴀʙʟᴇᴅ</code>\nᴡᴏᴜʟᴅ ʏᴏᴜ ʟɪᴋᴇ ᴛᴏ <code>Enable</code> " + f"ʀᴀɪᴅ ғᴏʀ {readable_time}? " + ) + keyboard = [ + [ + InlineKeyboardButton( + "ᴇɴᴀʙʟᴇ ʀᴀɪᴅ", + callback_data=f"enable_raid={chat.id}={time}", + ), + InlineKeyboardButton( + "ᴄᴀɴᴄᴇʟ ᴀᴄᴛɪᴏɴ", callback_data="cancel_raid=0" + ), + ] + ] + + reply_markup = InlineKeyboardMarkup(keyboard) + msg.reply_text( + text, parse_mode=ParseMode.HTML, reply_markup=reply_markup + ) + else: + msg.reply_text( + "ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ sᴇᴛ ᴛɪᴍᴇ ʙᴇᴛᴡᴇᴇɴ 5 ᴍɪɴᴜᴛᴇs ᴀɴᴅ 1 ᴅᴀʏ", + parse_mode=ParseMode.HTML, + ) + + else: + msg.reply_text( + "ᴜɴᴋɴᴏᴡɴ ᴛɪᴍᴇ ɢɪᴠᴇɴ, ɢɪᴠᴇ ᴍᴇ sᴏᴍᴇᴛʜɪɴɢ ʟɪᴋᴇ 5m ᴏʀ 1h", + parse_mode=ParseMode.HTML, + ) + + +@Exoncallback(pattern="enable_raid=") +@connection_status +@user_admin_no_reply +@loggable +def enable_raid_cb(update: Update, ctx: CallbackContext) -> Optional[str]: + args = update.callback_query.data.replace("enable_raid=", "").split("=") + chat = update.effective_chat + user = update.effective_user + chat_id = args[0] + time = int(args[1]) + readable_time = get_readable_time(time) + _, t, acttime = sql.getRaidStatus(chat_id) + sql.setRaidStatus(chat_id, True, time, acttime) + update.effective_message.edit_text( + f"ʀᴀɪᴅ ᴍᴏᴅᴇ ʜᴀs ʙᴇᴇɴ <code>ᴇɴᴀʙʟᴇᴅ</code> ғᴏʀ {readable_time}.", + parse_mode=ParseMode.HTML, + ) + LOGGER.info("ᴇɴᴀʙʟᴇᴅ ʀᴀɪᴅ ᴍᴏᴅᴇ ɪɴ {} for {}".format(chat_id, readable_time)) + try: + oldRaid = RUNNING_RAIDS.pop(int(chat_id)) + j.scheduler.remove_job(oldRaid) # check if there was an old job + except KeyError: + pass + + def disable_raid(_): + sql.setRaidStatus(chat_id, False, t, acttime) + LOGGER.info("ᴅɪsʙʟᴇᴅ ʀᴀɪᴅ ᴍᴏᴅᴇ ɪɴ {}".format(chat_id)) + ctx.bot.send_message(chat_id, "ʀᴀɪᴅ ᴍᴏᴅᴇ ʜᴀs ʙᴇᴇɴ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴅɪsᴀʙʟᴇᴅ!") + + raid = j.run_once(disable_raid, time) + RUNNING_RAIDS[int(chat_id)] = raid.job.id + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴀɪᴅ\n" + f"ᴇɴᴀʙʟᴇᴅ ғᴏʀ {readable_time}\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + ) + + +@Exoncallback(pattern="disable_raid=") +@connection_status +@user_admin_no_reply +@loggable +def disable_raid_cb(update: Update, _: CallbackContext) -> Optional[str]: + args = update.callback_query.data.replace("disable_raid=", "").split("=") + chat = update.effective_chat + user = update.effective_user + chat_id = args[0] + time = args[1] + _, _, acttime = sql.getRaidStatus(chat_id) + sql.setRaidStatus(chat_id, False, time, acttime) + j.scheduler.remove_job(RUNNING_RAIDS.pop(int(chat_id))) + update.effective_message.edit_text( + "ʀᴀɪᴅ ᴍᴏᴅᴇ ʜᴀs ʙᴇᴇɴ <code>ᴅɪsᴀʙʟᴇᴅ</code>, ɴᴇᴡʟʏ ᴊᴏɪɴɪɴɢ ᴍᴇᴍʙᴇʀs ᴡɪʟʟ ɴᴏ ʟᴏɴɢᴇʀ ʙᴇ ᴋɪᴄᴋᴇᴅ.", + parse_mode=ParseMode.HTML, + ) + logmsg = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴀɪᴅ\n" + f"ᴅɪsᴀʙʟᴇᴅ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + ) + return logmsg + + +@Exoncallback(pattern="cancel_raid=") +@connection_status +@user_admin_no_reply +def disable_raid_cb(update: Update, _: CallbackContext): + args = update.callback_query.data.split("=") + what = args[0] + update.effective_message.edit_text( + f"ᴀᴄᴛɪᴏɴ ᴄᴀɴᴄᴇʟʟᴇᴅ, ʀᴀɪᴅ ᴍᴏᴅᴇ ᴡɪʟʟ sᴛᴀʏ <code>{'Enabled' if what == 1 else 'Disabled'}</code>.", + parse_mode=ParseMode.HTML, + ) + + +@Exoncmd(command="raidtime") +@connection_status +@loggable +@user_admin(AdminPerms.CAN_CHANGE_INFO) +def raidtime(update: Update, context: CallbackContext) -> Optional[str]: + what, time, acttime = sql.getRaidStatus(update.effective_chat.id) + args = context.args + msg = update.effective_message + user = update.effective_user + chat = update.effective_chat + if not args: + msg.reply_text( + f"ʀᴀɪᴅ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ {get_readable_time(time)}\nᴡʜᴇɴ ᴛᴏɢɢʟᴇᴅ, ᴛʜᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴡɪʟʟ ʟᴀsᴛ " + f"ғᴏʀ {get_readable_time(time)} ᴛʜᴇɴ ᴛᴜʀɴ ᴏғғ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ", + parse_mode=ParseMode.HTML, + ) + return + args_time = args[0].lower() + if time := get_time(args_time): + readable_time = get_readable_time(time) + if 300 <= time < 86400: + text = ( + f"ʀᴀɪᴅ ᴍᴏᴅᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ {readable_time}\nᴡʜᴇɴ ᴛᴏɢɢʟᴇᴅ, ᴛʜᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴡɪʟʟ ʟᴀsᴛ ғᴏʀ " + f"{readable_time} ᴛʜᴇɴ ᴛᴜʀɴ ᴏғғ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ" + ) + msg.reply_text(text, parse_mode=ParseMode.HTML) + sql.setRaidStatus(chat.id, what, time, acttime) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴀɪᴅ\n" + f"sᴇᴛ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴛɪᴍᴇ ᴛᴏ {readable_time}\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + ) + else: + msg.reply_text( + "ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ sᴇᴛ ᴛɪᴍᴇ ʙᴇᴛᴡᴇᴇɴ 5 ᴍɪɴᴜᴛᴇs ᴀɴᴅ 1 ᴅᴀʏ", + parse_mode=ParseMode.HTML, + ) + else: + msg.reply_text( + "ᴜɴᴋɴᴏᴡɴ ᴛɪᴍᴇ ɢɪᴠᴇɴ, ɢɪᴠᴇ ᴍᴇ sᴏᴍᴇᴛʜɪɴɢ ʟɪᴋᴇ 5ᴍ ᴏʀ 1ʜ", + parse_mode=ParseMode.HTML, + ) + + +@Exoncmd(command="raidactiontime", pass_args=True) +@connection_status +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def raidtime(update: Update, context: CallbackContext) -> Optional[str]: + what, t, time = sql.getRaidStatus(update.effective_chat.id) + args = context.args + msg = update.effective_message + user = update.effective_user + chat = update.effective_chat + if not args: + msg.reply_text( + f"ʀᴀɪᴅ ᴀᴄᴛɪᴏɴ ᴛɪᴍᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ {get_readable_time(time)}\nᴡʜᴇɴ ᴛᴏɢɢʟᴇᴅ, ᴛʜᴇ ᴍᴇᴍʙᴇʀs ᴛʜᴀᴛ " + f"ᴊᴏɪɴ ᴡɪʟʟ ʙᴇ ᴛᴇᴍᴘ ʙᴀɴɴᴇᴅ ғᴏʀ {get_readable_time(time)}", + parse_mode=ParseMode.HTML, + ) + return + args_time = args[0].lower() + if time := get_time(args_time): + readable_time = get_readable_time(time) + if 300 <= time < 86400: + text = ( + f"ʀᴀɪᴅ ᴀᴄᴛɪᴏɴ ᴛɪᴍᴇ ɪs ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ {get_readable_time(time)}\nᴡʜᴇɴ ᴛᴏɢɢʟᴇᴅ, ᴛʜᴇ ᴍᴇᴍʙᴇʀs ᴛʜᴀᴛ" + f" ᴊᴏɪɴ ᴡɪʟʟ ʙᴇ ᴛᴇᴍᴘ ʙᴀɴɴᴇᴅ ғᴏʀ {readable_time}" + ) + msg.reply_text(text, parse_mode=ParseMode.HTML) + sql.setRaidStatus(chat.id, what, t, time) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴀɪᴅ\n" + f"sᴇᴛ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴀᴄᴛɪᴏɴ ᴛɪᴍᴇ ᴛᴏ {readable_time}\n" + f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" + ) + else: + msg.reply_text( + "ʏᴏᴜ ᴄᴀɴ ᴏɴʟʏ sᴇᴛ ᴛɪᴍᴇ ʙᴇᴛᴡᴇᴇɴ 5 ᴍɪɴᴜᴛᴇs ᴀɴᴅ 1 ᴅᴀʏ", + parse_mode=ParseMode.HTML, + ) + else: + msg.reply_text( + "ᴜɴᴋɴᴏᴡɴ ᴛɪᴍᴇ ɢɪᴠᴇɴ, ɢɪᴠᴇ ᴍᴇ sᴏᴍᴇᴛʜɪɴɢ ʟɪᴋᴇ 5m ᴏʀ 1h", + parse_mode=ParseMode.HTML, + ) + + +__help__ = """ +ᴇᴠᴇʀ ʜᴀᴅ ʏᴏᴜʀ ɢʀᴏᴜᴘ ʀᴀɪᴅᴇᴅ ʙʏ sᴘᴀᴍᴍᴇʀs ᴏʀ ʙᴏᴛs? +ᴛʜɪs ᴍᴏᴅᴜʟᴇ ᴀʟʟᴏᴡs ʏᴏᴜ ᴛᴏ ǫᴜɪᴄᴋʟʏ sᴛᴏᴘ ᴛʜᴇ ʀᴀɪᴅᴇʀs +ʙʏ ᴇɴᴀʙʟɪɴɢ *ʀᴀɪᴅ ᴍᴏᴅᴇ* I ᴡɪʟʟ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴋɪᴄᴋ ᴇᴠᴇʀʏ ᴜsᴇʀ ᴛʜᴀᴛ ᴛʀɪᴇs ᴛᴏ ᴊᴏɪɴ +ᴡʜᴇɴ ᴛʜᴇ ʀᴀɪᴅ ɪs ᴅᴏɴᴇ ʏᴏᴜ ᴄᴀɴ ᴛᴏɢɢʟᴇ ʙᴀᴄᴋ ʟᴏᴄᴋɢʀᴏᴜᴘ ᴀɴᴅ ᴇᴠᴇʀʏᴛʜɪɴɢ ᴡɪʟʟ ʙᴇ ʙᴀᴄᴋ ᴛᴏ ɴᴏʀᴍᴀʟ. + +*ᴀᴅᴍɪɴs ᴏɴʟʏ!* + +⍟ /raid `(off/time optional)` : `ᴛᴏɢɢʟᴇ ᴛʜᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ (ᴏɴ/ᴏғғ `) + +if ɴᴏ ᴛɪᴍᴇ is ɢɪᴠᴇɴ ɪᴛ ᴡɪʟʟ ᴅᴇғᴀᴜʟᴛ ᴛᴏ 2 ʜᴏᴜʀs ᴛʜᴇɴ ᴛᴜʀɴ ᴏғғ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ + +ʙʏ ᴇɴᴀʙʟɪɴɢ *ʀᴀɪᴅ ᴍᴏᴅᴇ* ɪ ᴡɪʟʟ ᴋɪᴄᴋ ᴇᴠᴇʀʏ ᴜsᴇʀ ᴏɴ ᴊᴏɪɴɪɴɢ ᴛʜᴇ ɢʀᴏᴜᴘ + + +⍟ /raidtime `(time optional)` : `ᴠɪᴇᴡ ᴏʀ sᴇᴛ ᴛʜᴇ ᴅᴇғᴀᴜʟᴛ ᴅᴜʀᴀᴛɪᴏɴ ғᴏʀ raid ᴍᴏᴅᴇ, ᴀғᴛᴇʀ ᴛʜᴀᴛ ᴛɪᴍᴇ ғʀᴏᴍ ᴛᴏɢɢʟɪɴɢ ᴛʜᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴡɪʟʟ ᴛᴜʀɴ ᴏғғ ᴀᴜᴛᴏᴍᴀᴛɪᴄᴀʟʟʏ ᴅᴇғᴀᴜʟᴛ ɪs 6 ʜᴏᴜʀs ` + + +⍟ /raidactiontime `(ᴛɪᴍᴇ ᴏᴘᴛɪᴏɴᴀʟ)` : `ᴠɪᴇᴡ ᴏʀ sᴇᴛ ᴛʜᴇ ᴅᴇғᴀᴜʟᴛ ᴅᴜʀᴀᴛɪᴏɴ ᴛʜᴀᴛ ᴛʜᴇ ʀᴀɪᴅ ᴍᴏᴅᴇ ᴡɪʟʟ ᴛᴇᴍᴘʙᴀɴ +ᴅᴇғᴀᴜʟᴛ ɪs 1 ʜᴏᴜʀ ` + +""" + +__mod_name__ = "𝙰ɴᴛɪʀᴀɪᴅ" diff --git a/Exon/modules/reactions.py b/Exon/modules/reactions.py new file mode 100644 index 00000000..f450bae3 --- /dev/null +++ b/Exon/modules/reactions.py @@ -0,0 +1,253 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 random + +from telegram import Update +from telegram.ext import CallbackContext + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + +reactions = [ + "( ͡° ͜ʖ ͡°)", + "( . •́ _ʖ •̀ .)", + "( ಠ ͜ʖ ಠ)", + "( ͡ ͜ʖ ͡ )", + "(ʘ ͜ʖ ʘ)", + "ヾ(´〇`)ノ♪♪♪", + "ヽ(o´∀`)ノ♪♬", + "♪♬((d⌒ω⌒b))♬♪", + "└(^^)┐", + "( ̄▽ ̄)/♫•*¨*•.¸¸♪", + "ヾ(⌐■_■)ノ♪", + "乁( • ω •乁)", + "♬♫♪◖(● o ●)◗♪♫♬", + "(っ˘ڡ˘ς)", + "( ˘▽˘)っ♨", + "( ・ω・)⊃-[二二]", + "(*´ー`)旦 旦( ̄ω ̄*)", + "(  ̄▽ ̄)[] [](≧▽≦ )", + "(* ̄▽ ̄)旦 且(´∀`*)", + "(ノ ˘_˘)ノ ζ|||ζ ζ|||ζ ζ|||ζ", + "(ノ°∀°)ノ⌒・*:.。. .。.:*・゜゚・*☆", + "(⊃。•́‿•̀。)⊃━✿✿✿✿✿✿", + "(∩` ロ ´)⊃━炎炎炎炎炎", + "( ・∀・)・・・--------☆", + "( -ω-)/占~~~~~", + "○∞∞∞∞ヽ(^ー^ )", + "(*^^)/~~~~~~~~~~◎", + "(((  ̄□)_/", + "(メ ̄▽ ̄)︻┳═一", + "ヽ( ・∀・)ノ_θ彡☆Σ(ノ `Д´)ノ", + "(*`0´)θ☆(メ°皿°)ノ", + "(; -_-)――――――C<―_-)", + "ヽ(>_<ヽ) ―⊂|=0ヘ(^‿^ )", + "(҂` ロ ´)︻デ═一 \(º □ º l|l)/", + "/( .□.)\ ︵╰(°益°)╯︵ /(.□. /)", + "(`⌒*)O-(`⌒´Q)", + "(っ•﹏•)っ ✴==≡눈٩(`皿´҂)ง", + "ヾ(・ω・)メ(・ω・)ノ", + "(*^ω^)八(⌒▽⌒)八(-‿‿- )ヽ", + "ヽ( ⌒ω⌒)人(=^‥^= )ノ", + "。*:☆(・ω・人・ω・)。:゜☆。", + "(°(°ω(°ω°(☆ω☆)°ω°)ω°)°)", + "(っ˘▽˘)(˘▽˘)˘▽˘ς)", + "(*^ω^)人(^ω^*)", + r"\(▽ ̄ \ ( ̄▽ ̄) /  ̄▽)/", + "( ̄Θ ̄)", + "\( ˋ Θ ´ )/", + "( ´(00)ˋ )", + "\( ̄(oo) ̄)/", + "/(≧ x ≦)\", + "/(=・ x ・=)\", + "(=^・ω・^=)", + "(= ; ェ ; =)", + "(=⌒‿‿⌒=)", + "(^• ω •^)", + "ଲ(ⓛ ω ⓛ)ଲ", + "ଲ(ⓛ ω ⓛ)ଲ", + "(^◔ᴥ◔^)", + "[(--)]..zzZ", + "( ̄o ̄) zzZZzzZZ", + "(_ _*) Z z z", + "☆ミ(o*・ω・)ノ", + "ε=ε=ε=ε=┌(; ̄▽ ̄)┘", + "ε===(っ≧ω≦)っ", + "__φ(..)", + "ヾ( `ー´)シφ__", + "( ^▽^)ψ__", + "|・ω・)", + "|д・)", + "┬┴┬┴┤・ω・)ノ", + "|・д・)ノ", + "(* ̄ii ̄)", + "(^〃^)", + "m(_ _)m", + "人(_ _*)", + "(シ. .)シ", + "(^_~)", + "(>ω^)", + "(^_<)〜☆", + "(^_<)", + "(づ ̄ ³ ̄)づ", + "(⊃。•́‿•̀。)⊃", + "⊂(´• ω •`⊂)", + "(*・ω・)ノ", + "(^-^*)/", + "ヾ(*'▽'*)", + "(^0^)ノ", + "(*°ー°)ノ", + "( ̄ω ̄)/", + "(≧▽≦)/", + "w(°o°)w", + "(⊙_⊙)", + "(°ロ°) !", + "∑(O_O;)", + "(¬_¬)", + "(¬_¬ )", + "(↼_↼)", + "( ̄ω ̄;)", + "┐('~`;)┌", + "(・_・;)", + "(@_@)", + "(•ิ_•ิ)?", + "ヽ(ー_ー )ノ", + "┐( ̄ヘ ̄)┌", + "┐( ̄~ ̄)┌", + "┐( ´ д ` )┌", + "╮(︶▽︶)╭", + "ᕕ( ᐛ )ᕗ", + "(ノωヽ)", + "(″ロ゛)", + "(/ω\)", + "(((><)))", + "~(>_<~)", + "(×_×)", + "(×﹏×)", + "(ノ_<。)", + "(μ_μ)", + "o(TヘTo)", + "( ゚,_ゝ`)", + "( ╥ω╥ )", + "(/ˍ・、)", + "(つω`。)", + "(T_T)", + "o(〒﹏〒)o", + "(#`Д´)", + "(・`ω´・)", + "( `ε´ )", + "(メ` ロ ´)", + "Σ(▼□▼メ)", + "(҂ `з´ )", + "٩(╬ʘ益ʘ╬)۶", + "↑_(ΦwΦ)Ψ", + "(ノಥ益ಥ)ノ", + "(#><)", + "(; ̄Д ̄)", + "(¬_¬;)", + "(^^#)", + "( ̄︿ ̄)", + "ヾ(  ̄O ̄)ツ", + "(ᗒᗣᗕ)՞", + "(ノ_<。)ヾ(´ ▽ ` )", + "ヽ( ̄ω ̄(。。 )ゝ", + "(ノ_;)ヾ(´ ∀ ` )", + "(´-ω-`( _ _ )", + "(⌒_⌒;)", + "(*/_\)", + "( ◡‿◡ *)", + "(//ω//)", + "( ̄▽ ̄*)ゞ", + "(„ಡωಡ„)", + "(ノ´ з `)ノ", + "(♡-_-♡)", + "(─‿‿─)♡", + "(´ ω `♡)", + "(ღ˘⌣˘ღ)", + "(´• ω •`) ♡", + "╰(*´︶`*)╯♡", + "(≧◡≦) ♡", + "♡ (˘▽˘>ԅ( ˘⌣˘)", + "σ(≧ε≦σ) ♡", + "(˘∀˘)/(μ‿μ) ❤", + "Σ>―(〃°ω°〃)♡→", + "(* ^ ω ^)", + "(o^▽^o)", + "ヽ(・∀・)ノ", + "(o・ω・o)", + "(^人^)", + "( ´ ω ` )", + "(´• ω •`)", + "╰(▔∀▔)╯", + "(✯◡✯)", + "(⌒‿⌒)", + "(*°▽°*)", + "(´。• ᵕ •。`)", + "ヽ(>∀<☆)ノ", + "\( ̄▽ ̄)/", + "(o˘◡˘o)", + "(╯✧▽✧)╯", + "( ‾́ ◡ ‾́ )", + "(๑˘︶˘๑)", + "(´・ᴗ・ ` )", + "( ͡° ʖ̯ ͡°)", + "( ఠ ͟ʖ ఠ)", + "( ಥ ʖ̯ ಥ)", + "(≖ ͜ʖ≖)", + "ヘ( ̄ω ̄ヘ)", + "(ノ≧∀≦)ノ", + "└( ̄- ̄└))", + "┌(^^)┘", + "(^_^♪)", + "(〜 ̄△ ̄)〜", + "(「• ω •)「", + "( ˘ ɜ˘) ♬♪♫", + "( o˘◡˘o) ┌iii┐", + "♨o(>_<)o♨", + "( ・・)つ―{}@{}@{}-", + "(*´з`)口゚。゚口(・∀・ )", + "( *^^)o∀*∀o(^^* )", + "-●●●-c(・・ )", + "(ノ≧∀≦)ノ ‥…━━━★", + "╰( ͡° ͜ʖ ͡° )つ──☆*:・゚", + "(∩ᄑ_ᄑ)⊃━☆゚*・。*・:≡( ε:)", +] + + +def react(update: Update, context: CallbackContext): + message = update.effective_message + react = random.choice(reactions) + if message.reply_to_message: + message.reply_to_message.reply_text(react) + else: + message.reply_text(react) + + +REACT_HANDLER = DisableAbleCommandHandler("react", react, run_async=True) + +dispatcher.add_handler(REACT_HANDLER) + +__command_list__ = ["react"] +__handlers__ = [REACT_HANDLER] diff --git a/Exon/modules/readme.md b/Exon/modules/readme.md new file mode 100644 index 00000000..1353a2ad --- /dev/null +++ b/Exon/modules/readme.md @@ -0,0 +1,41 @@ +# ᴇxᴏɴ ʀᴏʙᴏᴛ ᴇxᴀᴍᴘʟᴇ ᴘʟᴜɢɪɴ ғᴏʀᴍᴀᴛ + +## ᴀᴅᴠᴀɴᴄᴇᴅ: ᴘʏʀᴏɢʀᴀᴍ +```ᴘʏᴛʏʜᴏɴ3 + +from pyrogram import filters +from Exon import pgram + +# ᴀʟsᴏ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ : pgram as pbot : any pyrogram client + +@pgram.on_message(filters.command("hi")) +async def hmm(_, message): + await message.reply_text( + "ʜɪɪɪɪ" + ) + +__mod_name__ = "Hi" +__help__ = """ +*ʜɪ* +- /hi: ʜɪɪɪ +""" +``` + +## ᴀᴅᴠᴀɴᴄᴇᴅ: ᴛᴇʟᴇᴛʜᴏɴ +```ᴘʏᴛʜᴏɴ3 + +from Exon import telethn +from Exon.events import register + +@register(pattern="^/hi$") +async def _(event): + j = "ᴋʏ ʀᴇ ʟᴏᴅᴇ" + await event.reply(j) + +__mod_name__ = "Hi" +__help__ = """ +*Hi* +- /hi: ᴋʏ ʀᴇ ʟᴏᴅᴇ +""" +``` + diff --git a/Exon/modules/reminders.py b/Exon/modules/reminders.py new file mode 100644 index 00000000..95768c32 --- /dev/null +++ b/Exon/modules/reminders.py @@ -0,0 +1,262 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 +import time + +from telegram import Update +from telegram.ext import CommandHandler +from telegram.ext.callbackcontext import CallbackContext +from telegram.ext.filters import Filters +from telegram.parsemode import ParseMode + +from Exon import OWNER_ID, dispatcher, updater +from Exon.modules.disable import DisableAbleCommandHandler + +job_queue = updater.job_queue + + +def get_time(time: str) -> int: + if time[-1] == "s": + return int(time[:-1]) + if time[-1] == "m": + return int(time[:-1]) * 60 + if time[-1] == "h": + return int(time[:-1]) * 3600 + if time[-1] == "d": + return int(time[:-1]) * 86400 + + +reminder_message = """ +ʏᴏᴜʀ ʀᴇᴍɪɴᴅᴇʀ: +{reason} +<i>ᴡʜɪᴄʜ ʏᴏᴜ ᴛɪᴍᴇᴅ {time} ʙᴇғᴏʀᴇ ɪɴ {title}</i> +""" + + +def reminders(update: Update, context: CallbackContext): + user = update.effective_user + msg = update.effective_message + jobs = list(job_queue.jobs()) + user_reminders = [job.name[1:] for job in jobs if job.name.endswith(str(user.id))] + + if not user_reminders: + msg.reply_text( + text="ʏᴏᴜ ᴅᴏɴ'ᴛ have ᴀɴʏ ʀᴇᴍɪɴᴅᴇʀs sᴇᴛ ᴏʀ ᴀʟʟ ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀs ʏᴏᴜ ʜᴀᴠᴇ set have ʙᴇᴇɴ ᴄᴏᴍᴘʟᴇᴛᴇᴅ", + reply_to_message_id=msg.message_id, + ) + return + reply_text = "ʏᴏᴜʀ ʀᴇᴍɪɴᴅᴇʀs (<i>ᴍᴇɴᴛɪᴏɴᴇᴅ ʙᴇʟᴏᴡ ᴀʀᴇ ᴛʜᴇ <b>ᴛɪᴍsᴛᴀᴍᴘs</b> of the ʀᴇᴍɪɴᴅᴇʀs ʏᴏᴜ ʜᴀᴠᴇ sᴇᴛ</i>):\n" + for i, u in enumerate(user_reminders): + reply_text += f"\n{i+1}. <code>{u}</code>" + msg.reply_text( + text=reply_text, reply_to_message_id=msg.message_id, parse_mode=ParseMode.HTML + ) + + +def set_reminder(update: Update, context: CallbackContext): + user = update.effective_user + msg = update.effective_message + chat = update.effective_chat + reason = msg.text.split() + if len(reason) == 1: + msg.reply_text( + "ɴᴏ ᴛɪᴍᴇ ᴀɴᴅ ʀᴇᴍɪɴᴅᴇʀ ᴛᴏ ᴍᴇɴᴛɪᴏɴ!", reply_to_message_id=msg.message_id + ) + return + if len(reason) == 2: + msg.reply_text( + "ɴᴏᴛʜɪɴɢ ᴛᴏ ʀᴇᴍɪɴᴅᴇʀ! ᴀᴅᴅ ᴀ ʀᴇᴍɪɴᴅᴇʀ", reply_to_message_id=msg.message_id + ) + return + t = reason[1].lower() + if not re.match(r"[0-9]+(d|h|m|s)", t): + msg.reply_text( + "ᴜsᴇ ᴀ ᴄᴏʀʀᴇᴄᴛ ғᴏʀᴍᴀᴛ ᴏғ ᴛɪᴍᴇ!", reply_to_message_id=msg.message_id + ) + return + + def job(context: CallbackContext): + title = "" + if chat.type == "private": + title += "this chat" + if chat.type != "private": + title += chat.title + context.bot.send_message( + chat_id=user.id, + text=reminder_message.format( + reason=" ".join(reason[2:]), time=t, title=title + ), + disable_notification=False, + parse_mode=ParseMode.HTML, + ) + + job_time = time.time() + job_queue.run_once( + callback=job, when=get_time(t), name=f"t{job_time}{user.id}".replace(".", "") + ) + msg.reply_text( + text="Your ʀᴇᴍɪɴᴅᴇʀ ʜᴀs ʙᴇᴇɴ sᴇᴛ ᴀғᴛᴇʀ {time} ғʀᴏᴍ ɴᴏᴡ!\nᴛɪᴍᴇsᴛᴀᴍᴘ: <code>{time_stamp}</code>".format( + time=t, time_stamp=str(job_time).replace(".", "") + str(user.id) + ), + reply_to_message_id=msg.message_id, + parse_mode=ParseMode.HTML, + ) + + +def clear_reminder(update: Update, context: CallbackContext): + user = update.effective_user + msg = update.effective_message + text = msg.text.split() + if len(text) == 1 or not re.match(r"[0-9]+", text[1]): + msg.reply_text( + text="ɴᴏ/ᴡʀᴏɴɢ ᴛɪᴍᴇsᴛᴀᴍᴘ ᴍᴇɴᴛɪᴏɴᴇᴅ", reply_to_message_id=msg.message_id + ) + return + if not text[1].endswith(str(user.id)): + msg.reply_text( + text="ᴛʜᴇ ᴛɪᴍᴇsᴛᴀᴍᴘ ᴍᴇɴᴛɪᴏɴᴇᴅ ɪs ɴᴏᴛ ʏᴏᴜʀ ʀᴇᴍɪɴᴅᴇʀ!", + reply_to_message_id=msg.message_id, + ) + return + jobs = list(job_queue.get_jobs_by_name(f"t{text[1]}")) + if not jobs: + msg.reply_text( + text="ᴛʜɪs ʀᴇᴍɪɴᴅᴇʀ ɪs ᴀʟʀᴇᴀᴅʏ ᴄᴏᴍᴘʟᴇᴛᴇᴅ ᴏʀ ᴇɪᴛʜᴇʀ ɴᴏᴛ sᴇᴛ", + reply_to_message_id=msg.message_id, + ) + return + jobs[0].schedule_removal() + msg.reply_text( + text="ᴅᴏɴᴇ ᴄʟᴇᴀʀᴇᴅ ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀ!", reply_to_message_id=msg.message_id + ) + + +def clear_all_reminders(update: Update, context: CallbackContext): + user = update.effective_user + msg = update.effective_message + if user.id != OWNER_ID: + msg.reply_text( + text="ᴡʜᴏ ᴛʜɪs ɢᴜʏ ɴᴏᴛ ʙᴇɪɴɢ ᴛʜᴇ ᴏᴡɴᴇʀ ᴡᴀɴᴛs ᴍᴇ ᴄʟᴇᴀʀ ᴀʟʟ ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀs!!?", + reply_to_message_id=msg.message_id, + ) + return + jobs = list(job_queue.jobs()) + unremoved_reminders = [] + for job in jobs: + try: + job.schedule_removal() + except Exception: + unremoved_reminders.append(job.name[1:]) + reply_text = "ᴅᴏɴᴇ ᴄʟᴇᴀʀᴇᴅ ᴀʟʟ ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀs!\n\n" + if unremoved_reminders: + reply_text += "ᴇxᴄᴇᴘᴛ (<i>ᴛɪᴍᴇ sᴛᴀᴍᴘs ʜᴀᴠᴇ ʙᴇᴇɴ ᴍᴇɴᴛɪᴏɴᴇᴅ</i>):" + for i, u in enumerate(unremoved_reminders): + reply_text += f"\n{i+1}. <code>{u}</code>" + msg.reply_text( + text=reply_text, reply_to_message_id=msg.message_id, parse_mode=ParseMode.HTML + ) + + +def clear_all_my_reminders(update: Update, context: CallbackContext): + user = update.effective_user + msg = update.effective_message + jobs = list(job_queue.jobs()) + if not jobs: + msg.reply_text( + text="ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴀɴʏ ʀᴇᴍɪɴᴅᴇʀs!", reply_to_message_id=msg.message_id + ) + return + unremoved_reminders = [] + for job in jobs: + if job.name.endswith(str(user.id)): + try: + job.schedule_removal() + except Exception: + unremoved_reminders.append(job.name[1:]) + reply_text = "ᴅᴏɴᴇ ᴄʟᴇᴀʀᴇᴅ ᴀʟʟ ʏᴏᴜʀ ʀᴇᴍɪɴᴅᴇʀs!\n\n" + if unremoved_reminders: + reply_text += "ᴇxᴄᴇᴘᴛ (<i>ᴛɪᴍᴇ sᴛᴀᴍᴘs ʜᴀᴠᴇ ʙᴇᴇɴ ᴍᴇɴᴛɪᴏɴᴇᴅ</i>):" + for i, u in enumerate(unremoved_reminders): + reply_text += f"\n{i+1}. <code>{u}</code>" + msg.reply_text( + text=reply_text, reply_to_message_id=msg.message_id, parse_mode=ParseMode.HTML + ) + + +__mod_name__ = "𝚁ᴇᴍɪɴᴅᴇʀ" +__help__ = """ +⍟ /reminders*:* `ɢᴇᴛ ᴀ ʟɪsᴛ ᴏғ *ᴛɪᴍᴇsᴛᴀᴍᴘs* ᴏғ ʏᴏᴜʀ ʀᴇᴍɪɴᴅᴇʀs ` + +⍟ /setreminder <time> <remind message>*:* `sᴇᴛ ᴀ ʀᴇᴍɪɴᴅᴇʀ ᴀғᴛᴇʀ ᴛʜᴇ ᴍᴇɴᴛɪᴏɴᴇᴅ ᴛɪᴍᴇ ` + +⍟ /clearreminder <timestamp>*:* `ᴄʟᴇᴀʀs ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀ ᴡɪᴛʜ ᴛʜᴀᴛ ᴛɪᴍᴇsᴛᴀᴍᴘ ɪғ ᴛʜᴇ ᴛɪᴍᴇ ᴛᴏ ʀᴇᴍɪɴᴅ ɪs ɴᴏᴛ ʏᴇᴛ ᴄᴏᴍᴘʟᴇᴛᴇᴅ ` + +⍟ /clearmyreminders*:* `ᴄʟᴇᴀʀs ᴀʟʟ ᴛʜᴇ ʀᴇᴍɪɴᴅᴇʀs ᴏғ ᴛʜᴇ ᴜsᴇʀ `. + +*sɪᴍɪʟᴀʀ ᴄᴏᴍᴍᴀɴᴅs:* + +⍟ /reminders | /myreminders + +⍟ /clearmyreminders | /clearallmyreminders + +*ᴜsᴀɢᴇ:* +⍟ /setreminder 30s reminder*:* `ʜᴇʀᴇ ᴛʜᴇ ᴛɪᴍᴇ ғᴏʀᴍᴀᴛ ɪs sᴀᴍᴇ ᴀs ᴛʜᴇ ᴛɪᴍᴇ ғᴏʀᴍᴀᴛ ɪɴ ᴍᴜᴛɪɴɢ ʙᴜᴛ ᴡɪᴛʜ ᴇxᴛʀᴀ sᴇᴄᴏɴᴅs(s)` + + +✦ `/clearreminder 1234567890123456789` +""" + +# ʙsᴅᴋ ᴄᴏᴘʏ ᴋᴀʀ ʀᴀ ʜ ᴄʀᴇᴅɪᴛ ᴅᴇ ᴅᴇɴᴀ @AbishnoiMF|@Abishnoi + +RemindersHandler = CommandHandler( + ["reminders", "myreminders"], + reminders, + filters=Filters.chat_type.private, + run_async=True, +) +SetReminderHandler = DisableAbleCommandHandler( + "setreminder", set_reminder, run_async=True +) +ClearReminderHandler = DisableAbleCommandHandler( + "clearreminder", clear_reminder, run_async=True +) +ClearAllRemindersHandler = CommandHandler( + "clearallreminders", + clear_all_reminders, + filters=Filters.chat(OWNER_ID), + run_async=True, +) +ClearALLMyRemindersHandler = CommandHandler( + ["clearmyreminders", "clearallmyreminders"], + clear_all_my_reminders, + filters=Filters.chat_type.private, + run_async=True, +) + +dispatcher.add_handler(RemindersHandler) +dispatcher.add_handler(SetReminderHandler) +dispatcher.add_handler(ClearReminderHandler) +dispatcher.add_handler(ClearAllRemindersHandler) +dispatcher.add_handler(ClearALLMyRemindersHandler) diff --git a/Exon/modules/remote_cmds.py b/Exon/modules/remote_cmds.py new file mode 100644 index 00000000..33c15e56 --- /dev/null +++ b/Exon/modules/remote_cmds.py @@ -0,0 +1,550 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 telegram import ChatPermissions, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CommandHandler + +from Exon import LOGGER, dispatcher +from Exon.modules.helper_funcs.chat_status import ( + bot_admin, + is_bot_admin, + is_user_ban_protected, + is_user_in_chat, +) +from Exon.modules.helper_funcs.extraction import extract_user_and_text +from Exon.modules.helper_funcs.filters import CustomFilters + +RBAN_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ not ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/ᴜɴʀᴇsᴛʀɪᴄᴛ ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "User_not_participant", + "Peer_id_invalid", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ ᴀ user ᴛᴏ ᴘᴜɴᴄʜ ɪᴛ ғʀᴏᴍ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "Chat_admin_required", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴘᴜɴᴄʜ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "Channel_private", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", +} + +RUNBAN_ERRORS = { + "User ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/ᴜɴʀᴇsᴛʀɪᴄᴛ ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "User_not_ᴘᴀʀᴛɪᴄɪᴘᴀɴᴛ", + "Peer_id_invalid", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ ᴀ ᴜsᴇʀ ᴛᴏ ᴘᴜɴᴄʜ ɪᴛ ғʀᴏᴍ a ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "Chat_admin_required", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴘᴜɴᴄʜ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "Channel_private", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", +} + +RKICK_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/ᴜɴʀᴇsᴛʀɪᴄᴛ ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "ᴜsᴇʀ_ɴᴏᴛ_ᴘᴀʀᴛɪᴄɪᴘᴀɴᴛ", + "ᴘᴇᴇʀ_ɪᴅ_ɪɴᴠᴀʟɪᴅ", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ ᴀ ᴜsᴇʀ ᴛᴏ ᴘᴜɴᴄʜ ɪᴛ ғʀᴏᴍ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "ᴄʜᴀᴛ_ᴀᴅᴍɪɴ_ʀᴇǫᴜɪʀᴇᴅ", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴘᴜɴᴄʜ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "Channel_ᴘʀɪᴠᴀᴛᴇ", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", +} + +RMUTE_ERRORS = { + "ᴜsᴇʀ ɪs ᴀɴ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀ ᴏғ ᴛʜᴇ ᴄʜᴀᴛ", + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ", + "ɴᴏᴛ ᴇɴᴏᴜɢʜ ʀɪɢʜᴛs ᴛᴏ ʀᴇsᴛʀɪᴄᴛ/ᴜɴʀᴇsᴛʀɪᴄᴛ ᴄʜᴀᴛ ᴍᴇᴍʙᴇʀ", + "ᴜsᴇʀ_ɴᴏᴛ_ᴘᴀʀᴛɪᴄɪᴘᴀɴᴛ", + "ᴘᴇᴇʀ_ɪᴅ_ɪɴᴠᴀʟɪᴅ", + "ɢʀᴏᴜᴘ ᴄʜᴀᴛ ᴡᴀs ᴅᴇᴀᴄᴛɪᴠᴀᴛᴇᴅ", + "ɴᴇᴇᴅ ᴛᴏ ʙᴇ ɪɴᴠɪᴛᴇʀ ᴏғ ᴀ ᴜsᴇʀ ᴛᴏ ᴘᴜɴᴄʜ ɪᴛ ғʀᴏᴍ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ", + "ᴄʜᴀᴛ_ᴀᴅᴍɪɴ_ʀᴇǫᴜɪʀᴇᴅ", + "ᴏɴʟʏ ᴛʜᴇ ᴄʀᴇᴀᴛᴏʀ ᴏғ ᴀ ʙᴀsɪᴄ ɢʀᴏᴜᴘ ᴄᴀɴ ᴘᴜɴᴄʜ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴɪsᴛʀᴀᴛᴏʀs", + "ᴄʜᴀɴɴᴇʟ_ᴘʀɪᴠᴀᴛᴇ", + "ɴᴏᴛ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", +} + +RUNMUTE_ERRORS = { + "User is an administrator of the chat", + "Chat not found", + "Not enough rights to restrict/unrestrict chat member", + "User_not_participant", + "Peer_id_invalid", + "Group chat was deactivated", + "Need to be inviter of a user to punch it from a basic group", + "Chat_admin_required", + "Only the creator of a basic group can punch group administrators", + "Channel_private", + "Not in the chat", +} + + +@bot_admin +def rban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + + if not args: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ a ᴄʜᴀᴛ/ᴜsᴇʀ.") + return + + user_id, chat_id = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ɪᴅ sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + if not chat_id: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴄʜᴀᴛ.") + return + + try: + chat = bot.get_chat(chat_id.split()[0]) + except BadRequest as excp: + if excp.message == "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text( + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ! ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ ᴇɴᴛᴇʀᴇᴅ ᴀ ᴠᴀʟɪᴅ ᴄʜᴀᴛ ID ᴀɴᴅ I'm ᴘᴀʀᴛ ᴏғ ᴛʜᴀᴛ ᴄʜᴀᴛ.", + ) + return + raise + + if chat.type == "private": + message.reply_text("I'ᴍ sᴏʀʀʏ, ʙᴜᴛ ᴛʜᴀᴛ ᴀ ᴘʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ!") + return + + if ( + not is_bot_admin(chat, bot.id) + or not chat.get_member(bot.id).can_restrict_members + ): + message.reply_text( + "I ᴄᴀɴ'ᴛ ʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ᴛʜᴇʀᴇ! ᴍᴀᴋᴇ sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ʙᴀɴ ᴜsᴇʀs.", + ) + return + + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("ɪ ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ") + return + raise + + if is_user_ban_protected(chat, user_id, member): + message.reply_text("I ʀᴇᴀʟʟʏ ᴡɪsʜ I ᴄᴏᴜʟᴅ ʙᴀɴ ᴀᴅᴍɪɴs...") + return + + if user_id == bot.id: + message.reply_text("I'm ɴᴏᴛ ɢᴏɴɴᴀ ʙᴀɴ ᴍʏsᴇʟғ, ᴀʀᴇ ʏᴏᴜ ᴄʀᴀᴢʏ?") + return + + try: + chat.ban_member(user_id) + message.reply_text("ʙᴀɴɴᴇᴅ ғʀᴏᴍ chat!") + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text("Banned!", quote=False) + elif excp.message in RBAN_ERRORS: + message.reply_text(excp.message) + else: + LOGGER.warning(update) + LOGGER.exception( + "ᴇʀʀᴏʀ ʙᴀɴɴɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, I ᴄᴀɴ'ᴛ ʙᴀɴ ᴛʜᴀᴛ ᴜsᴇʀ.") + + +@bot_admin +def runban(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + + if not args: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ a ᴄʜᴀᴛ/ᴜsᴇʀ.") + return + + user_id, chat_id = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ɪᴅ sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + if not chat_id: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴄʜᴀᴛ.") + return + + try: + chat = bot.get_chat(chat_id.split()[0]) + except BadRequest as excp: + if excp.message == "Chat not found": + message.reply_text( + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ! ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ ᴇɴᴛᴇʀᴇᴅ ᴀ ᴠᴀʟɪᴅ ᴄʜᴀᴛ ɪᴅ ᴀɴᴅ I'ᴍ ᴘᴀʀᴛ ᴏғ ᴛʜᴀᴛ ᴄʜᴀᴛ.", + ) + return + raise + + if chat.type == "private": + message.reply_text("I'ᴍ sᴏʀʀʏ, ʙᴜᴛ ᴛʜᴀᴛ's ᴀ ᴘʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ!") + return + + if ( + not is_bot_admin(chat, bot.id) + or not chat.get_member(bot.id).can_restrict_members + ): + message.reply_text( + "I ᴄᴀɴ'ᴛ ᴜɴʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ᴛʜᴇʀᴇ! ᴍᴀᴋᴇ sᴜʀᴇ I'm ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴜɴʙᴀɴ ᴜsᴇʀs.", + ) + return + + try: + chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ ᴛʜᴇʀᴇ") + return + raise + + if is_user_in_chat(chat, user_id): + message.reply_text( + "ᴡʜʏ ᴀʀᴇ ʏᴏᴜ ᴛʀʏɪɴɢ ᴛᴏ ʀᴇᴍᴏᴛᴇʟʏ ᴜɴʙᴀɴ sᴏᴍᴇᴏɴᴇ ᴛʜᴀᴛ's ᴀʟʀᴇᴀᴅʏ ɪɴ thʏat ᴄʜᴀᴛ?", + ) + return + + if user_id == bot.id: + message.reply_text("I'm not ɢᴏɴɴᴀ UNBAN ᴍʏsᴇʟғ, I'm ᴀɴ ᴀᴅᴍɪɴ ᴛʜᴇʀᴇ!") + return + + try: + chat.unban_member(user_id) + message.reply_text("ʏᴇᴘ, ᴛʜɪs ᴜsᴇʀ ᴄᴀɴ ᴊᴏɪɴ ᴛʜᴀᴛ ᴄʜᴀᴛ!") + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text("Unbanned!", quote=False) + elif excp.message in RUNBAN_ERRORS: + message.reply_text(excp.message) + else: + LOGGER.warning(update) + LOGGER.exception( + "ERROR ᴜɴʙᴀɴɴɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, I ᴄᴀɴ'ᴛ ᴜɴʙᴀɴ ᴛʜᴀᴛ ᴜsᴇʀ.") + + +@bot_admin +def rkick(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + + if not args: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴄʜᴀᴛ/ᴜsᴇʀ.") + return + + user_id, chat_id = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ɪᴅ sᴘᴇᴄɪғɪᴇᴅ ɪs ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + if not chat_id: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ a ᴄʜᴀᴛ.") + return + + try: + chat = bot.get_chat(chat_id.split()[0]) + except BadRequest as excp: + if excp.message == "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text( + "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ! ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ ᴇɴᴛᴇʀᴇᴅ ᴀ ᴠᴀʟɪᴅ ᴄʜᴀᴛ ɪᴅ ᴀɴᴅ I'ᴍ ᴘᴀʀᴛ ᴏғ ᴛʜᴀᴛ ᴄʜᴀᴛ.", + ) + return + raise + + if chat.type == "private": + message.reply_text("I'ᴍ sᴏʀʀʏ, ʙᴜᴛ ᴛʜᴀᴛ's a ᴘʀɪᴠᴀᴛᴇ ᴄʜᴀᴛ!") + return + + if ( + not is_bot_admin(chat, bot.id) + or not chat.get_member(bot.id).can_restrict_members + ): + message.reply_text( + "I ᴄᴀɴ'ᴛ ʀᴇsᴛʀɪᴄᴛ ᴘᴇᴏᴘʟᴇ ᴛʜᴇʀᴇ! ᴍᴀᴋᴇ sᴜʀᴇ I'ᴍ ᴀᴅᴍɪɴ ᴀɴᴅ ᴄᴀɴ ᴘᴜɴᴄʜ ᴜsᴇʀs.", + ) + return + + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "ᴜsᴇʀ ɴᴏᴛ ғᴏᴜɴᴅ": + message.reply_text("I ᴄᴀɴ'ᴛ sᴇᴇᴍ ᴛᴏ ғɪɴᴅ ᴛʜɪs ᴜsᴇʀ") + return + raise + + if is_user_ban_protected(chat, user_id, member): + message.reply_text("I really wish I could punch admins...") + return + + if user_id == bot.id: + message.reply_text("I'ᴍ ɴᴏᴛ ɢᴏɴɴᴀ ᴘᴜɴᴄʜ ᴍʏsᴇʟғ, ᴀʀᴇ ʏᴏᴜ ᴄʀᴀᴢʏ?") + return + + try: + chat.unban_member(user_id) + message.reply_text("ᴘᴜɴᴄʜᴇᴅ ғʀᴏᴍ ᴄʜᴀᴛ!") + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text("ᴘᴜɴᴄʜᴇᴅ !", quote=False) + elif excp.message in RKICK_ERRORS: + message.reply_text(excp.message) + else: + LOGGER.warning(update) + LOGGER.exception( + "ERROR ᴘᴜɴᴄʜɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, I ᴄᴀɴ'ᴛ ᴘᴜɴᴄʜ ᴛʜᴀᴛ ᴜsᴇʀ.") + + +@bot_admin +def rmute(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + + if not args: + message.reply_text("ʏᴏᴜ ᴅᴏɴ'ᴛ sᴇᴇᴍ ᴛᴏ ʙᴇ ʀᴇғᴇʀʀɪɴɢ ᴛᴏ ᴀ ᴄʜᴀᴛ/ᴜsᴇʀ.") + return + + user_id, chat_id = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "You don't sᴇᴇᴍ to ʙᴇ ʀᴇғᴇʀʀɪɴɢ to ᴀ ᴜsᴇʀ ᴏʀ ᴛʜᴇ ɪᴅ sᴘᴇᴄɪғɪᴇᴅ is ɪɴᴄᴏʀʀᴇᴄᴛ..", + ) + return + if not chat_id: + message.reply_text("You don't seem to be referring to a chat.") + return + + try: + chat = bot.get_chat(chat_id.split()[0]) + except BadRequest as excp: + if excp.message == "Chat not found": + message.reply_text( + "Chat not found! Make sure you entered a valid chat ID and I'm part of that chat.", + ) + return + raise + + if chat.type == "private": + message.reply_text("I'm sorry, but that's a private chat!") + return + + if ( + not is_bot_admin(chat, bot.id) + or not chat.get_member(bot.id).can_restrict_members + ): + message.reply_text( + "I can't restrict people there! Make sure I'm admin and can mute users.", + ) + return + + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "User not found": + message.reply_text("I can't seem to find this user") + return + raise + + if is_user_ban_protected(chat, user_id, member): + message.reply_text("I really wish I could mute admins...") + return + + if user_id == bot.id: + message.reply_text("I'm not gonna MUTE myself, are you crazy?") + return + + try: + bot.restrict_chat_member( + chat.id, + user_id, + permissions=ChatPermissions(can_send_messages=False), + ) + message.reply_text("Muted from the chat!") + except BadRequest as excp: + if excp.message == "Reply message not found": + # Do not reply + message.reply_text("Muted!", quote=False) + elif excp.message in RMUTE_ERRORS: + message.reply_text(excp.message) + else: + LOGGER.warning(update) + LOGGER.exception( + "ERROR mute user %s in chat %s (%s) due to %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("Well damn, I can't mute that user.") + + +@bot_admin +def runmute(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + message = update.effective_message + + if not args: + message.reply_text("You don't seem to be referring to a chat/user.") + return + + user_id, chat_id = extract_user_and_text(message, args) + + if not user_id: + message.reply_text( + "You don't seem to be referring to a user or the ID specified is incorrect..", + ) + return + if not chat_id: + message.reply_text("You don't seem to be referring to a chat.") + return + + try: + chat = bot.get_chat(chat_id.split()[0]) + except BadRequest as excp: + if excp.message == "Chat not found": + message.reply_text( + "Chat not found! Make sure you entered a valid chat ID and I'm part of that chat.", + ) + return + raise + + if chat.type == "private": + message.reply_text("I'm sorry, but that's a private chat!") + return + + if ( + not is_bot_admin(chat, bot.id) + or not chat.get_member(bot.id).can_restrict_members + ): + message.reply_text( + "I can't unrestrict people there! Make sure I'm admin and can unban users.", + ) + return + + try: + member = chat.get_member(user_id) + except BadRequest as excp: + if excp.message == "User not found": + message.reply_text("I can't seem to find this user there") + return + raise + + if is_user_in_chat(chat, user_id) and ( + member.can_send_messages + and member.can_send_media_messages + and member.can_send_other_messages + and member.can_add_web_page_previews + ): + message.reply_text("This user already has the right to speak in that chat.") + return + + if user_id == bot.id: + message.reply_text("I'm not gonna UNMUTE myself, I'm an admin there!") + return + + try: + bot.restrict_chat_member( + chat.id, + int(user_id), + permissions=ChatPermissions( + can_send_messages=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + ), + ) + message.reply_text("ʏᴇᴘ, ᴛʜɪs ᴜsᴇʀ ᴄᴀɴ ᴛᴀʟᴋ ɪɴ ᴛʜᴀᴛ ᴄʜᴀᴛ!") + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + # Do not reply + message.reply_text("Unmuted!", quote=False) + elif excp.message in RUNMUTE_ERRORS: + message.reply_text(excp.message) + else: + LOGGER.warning(update) + LOGGER.exception( + "ERROR ᴜɴᴍɴᴜᴛɪɴɢ ᴜsᴇʀ %s ɪɴ ᴄʜᴀᴛ %s (%s) ᴅᴜᴇ ᴛᴏ %s", + user_id, + chat.title, + chat.id, + excp.message, + ) + message.reply_text("ᴡᴇʟʟ ᴅᴀᴍɴ, I ᴄᴀɴ'ᴛ ᴜɴᴍᴜᴛᴇ ᴛʜᴀᴛ ᴜsᴇʀ.") + + +RBAN_HANDLER = CommandHandler( + "rban", rban, filters=CustomFilters.sudo_filter, run_async=True +) +RUNBAN_HANDLER = CommandHandler( + "runban", runban, filters=CustomFilters.sudo_filter, run_async=True +) +RKICK_HANDLER = CommandHandler( + "rpunch", rkick, filters=CustomFilters.sudo_filter, run_async=True +) +RMUTE_HANDLER = CommandHandler( + "rmute", rmute, filters=CustomFilters.sudo_filter, run_async=True +) +RUNMUTE_HANDLER = CommandHandler( + "runmute", runmute, filters=CustomFilters.sudo_filter, run_async=True +) + +dispatcher.add_handler(RBAN_HANDLER) +dispatcher.add_handler(RUNBAN_HANDLER) +dispatcher.add_handler(RKICK_HANDLER) +dispatcher.add_handler(RMUTE_HANDLER) +dispatcher.add_handler(RUNMUTE_HANDLER) diff --git a/Exon/modules/reporting.py b/Exon/modules/reporting.py new file mode 100644 index 00000000..72bec7b2 --- /dev/null +++ b/Exon/modules/reporting.py @@ -0,0 +1,324 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import Chat, InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.error import BadRequest, Unauthorized +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + Filters, + MessageHandler, +) +from telegram.utils.helpers import mention_html + +from Exon import DRAGONS, LOGGER, TIGERS, WOLVES, dispatcher +from Exon.modules.helper_funcs.chat_status import user_admin, user_not_admin +from Exon.modules.log_channel import loggable +from Exon.modules.sql import reporting_sql as sql + +REPORT_GROUP = 12 +REPORT_IMMUNE_USERS = DRAGONS + TIGERS + WOLVES + + +@user_admin +def report_setting(update: Update, context: CallbackContext): + bot, args = context.bot, context.args + chat = update.effective_chat + msg = update.effective_message + + if chat.type == chat.PRIVATE: + if len(args) >= 1: + if args[0] in ("yes", "on"): + sql.set_user_setting(chat.id, True) + msg.reply_text( + "ᴛᴜʀɴᴇᴅ ᴏɴ ʀᴇᴘᴏʀᴛɪɴɢ! ʏᴏᴜ'ʟʟ ʙᴇ ɴᴏᴛɪғɪᴇᴅ ᴡʜᴇɴᴇᴠᴇʀ anʏyone ʀᴇᴘᴏʀᴛs sᴏᴍᴇᴛʜɪɴɢ.", + ) + + elif args[0] in ("no", "off"): + sql.set_user_setting(chat.id, False) + msg.reply_text("ᴛᴜʀɴᴇᴅ ᴏғғ ʀᴇᴘᴏʀᴛɪɴɢ! ʏᴏᴜ ᴡᴏɴ'ᴛ ɢᴇᴛ ᴀɴʏ ʀᴇᴘᴏʀᴛs.") + else: + msg.reply_text( + f"ʏᴏᴜʀ ᴄᴜʀʀᴇɴᴛ ʀᴇᴘᴏʀᴛ ᴘʀᴇғᴇʀᴇɴᴄᴇ ɪs: `{sql.user_should_report(chat.id)}`", + parse_mode=ParseMode.MARKDOWN, + ) + + elif len(args) >= 1: + if args[0] in ("yes", "on"): + sql.set_chat_setting(chat.id, True) + msg.reply_text( + "ᴛᴜʀɴᴇᴅ ᴏɴ ʀᴇᴘᴏʀᴛɪɴɢ! ᴀᴅᴍɪɴs ᴡʜᴏ ʜᴀᴠᴇ ᴛᴜʀɴᴇᴅ ᴏɴ ʀᴇᴘᴏʀᴛs ᴡɪʟʟ ʙᴇ ɴᴏᴛɪғɪᴇᴅ ᴡʜᴇɴ /report " + "ᴏʀ @admin ɪs ᴄᴀʟʟᴇᴅ.", + ) + + elif args[0] in ("no", "off"): + sql.set_chat_setting(chat.id, False) + msg.reply_text( + "ᴛᴜʀɴᴇᴅ ᴏғғ ʀᴇᴘᴏʀᴛɪɴɢ! ɴᴏ ᴀᴅᴍɪɴs ᴡɪʟʟ ʙᴇ ɴᴏᴛɪғɪᴇᴅ ᴏɴ /ʀᴇᴘᴏʀᴛ ᴏʀ @admin.", + ) + else: + msg.reply_text( + f"ᴛʜɪs ɢʀᴏᴜᴘ's ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢ ɪs: `{sql.chat_should_report(chat.id)}`", + parse_mode=ParseMode.MARKDOWN, + ) + + +@user_not_admin +@loggable +def report(update: Update, context: CallbackContext) -> str: + bot = context.bot + args = context.args + message = update.effective_message + chat = update.effective_chat + user = update.effective_user + + if chat and message.reply_to_message and sql.chat_should_report(chat.id): + reported_user = message.reply_to_message.from_user + chat_name = chat.title or chat.first or chat.username + admin_list = chat.get_administrators() + message = update.effective_message + + if not args: + message.reply_text("ᴀᴅᴅ ᴀ ʀᴇᴀsᴏɴ ғᴏʀ ʀᴇᴘᴏʀᴛɪɴɢ ғɪʀsᴛ.") + return "" + + if user.id == reported_user.id: + message.reply_text("ᴜʜ ʏᴇᴀʜ, sᴜʀᴇ sure...ᴍᴀsᴏ ᴍᴜᴄʜ?") + return "" + + if user.id == bot.id: + message.reply_text("ɴɪᴄᴇ ᴛʀʏ, ʙʀᴏ.") + return "" + + if reported_user.id in REPORT_IMMUNE_USERS: + message.reply_text("Uh? ʏᴏᴜ ʀᴇᴘᴏʀᴛɪɴɢ ᴀ ᴅɪsᴀsᴛᴇʀ?") + return "" + + if chat.username and chat.type == Chat.SUPERGROUP: + + reported = f"{mention_html(user.id, user.first_name)} ʀᴇᴘᴏʀᴛᴇᴅ {mention_html(reported_user.id, reported_user.first_name)} ᴛᴏ ᴛʜᴇ ᴀᴅᴍɪɴs!" + + msg = ( + f"<b>⚠️ ʀᴇᴘᴏʀᴛ ɪɴ {html.escape(chat.title)}</b>\n\n" + f"<b>- ʀᴇᴘᴏʀᴛ ʙʏ:</b> {mention_html(user.id, user.first_name)} (<code>{user.id}</code>)\n" + f"<b>- ʀᴇᴘᴏʀᴛᴇᴅ ᴜsᴇʀ:</b> {mention_html(reported_user.id, reported_user.first_name)} (<code>{reported_user.id}</code>)\n" + ) + link = f'<b>- ʀᴇᴘᴏʀᴛᴇᴅ ᴍᴇssᴀɢᴇ:</b> <a href="https://t.me/{chat.username}/{message.reply_to_message.message_id}">Click Here</a>' + should_forward = False + keyboard = [ + [ + InlineKeyboardButton( + "➡ ᴍᴇssᴀɢᴇ", + url=f"https://t.me/{chat.username}/{message.reply_to_message.message_id}", + ), + ], + [ + InlineKeyboardButton( + "⚠ ᴋɪᴄᴋ", + callback_data=f"report_{chat.id}=kick={reported_user.id}={reported_user.first_name}", + ), + InlineKeyboardButton( + "⛔️ ʙᴀɴ", + callback_data=f"report_{chat.id}=banned={reported_user.id}={reported_user.first_name}", + ), + ], + [ + InlineKeyboardButton( + "❎ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇ", + callback_data=f"report_{chat.id}=delete={reported_user.id}={message.reply_to_message.message_id}", + ), + ], + ] + reply_markup = InlineKeyboardMarkup(keyboard) + else: + reported = ( + f"{mention_html(user.id, user.first_name)} reported " + f"{mention_html(reported_user.id, reported_user.first_name)} ᴛᴏ ᴛʜᴇ ᴀᴅᴍɪɴs!" + ) + + msg = f'{mention_html(user.id, user.first_name)} ɪs ᴄᴀʟʟɪɴɢ ғᴏʀ ᴀᴅᴍɪɴs ɪɴ "{html.escape(chat_name)}"!' + link = "" + should_forward = True + + for admin in admin_list: + if admin.user.is_bot: # can't message bots + continue + + if sql.user_should_report(admin.user.id): + try: + if chat.type != Chat.SUPERGROUP: + bot.send_message( + admin.user.id, + msg + link, + parse_mode=ParseMode.HTML, + ) + + if should_forward: + message.reply_to_message.forward(admin.user.id) + + if ( + len(message.text.split()) > 1 + ): # If user is giving a reason, send his message too + message.forward(admin.user.id) + if not chat.username: + bot.send_message( + admin.user.id, + msg + link, + parse_mode=ParseMode.HTML, + ) + + if should_forward: + message.reply_to_message.forward(admin.user.id) + + if ( + len(message.text.split()) > 1 + ): # If user is giving a reason, send his message too + message.forward(admin.user.id) + + if chat.username and chat.type == Chat.SUPERGROUP: + bot.send_message( + admin.user.id, + msg + link, + parse_mode=ParseMode.HTML, + reply_markup=reply_markup, + ) + + if should_forward: + message.reply_to_message.forward(admin.user.id) + + if ( + len(message.text.split()) > 1 + ): # If user is giving a reason, send his message too + message.forward(admin.user.id) + + except Unauthorized: + pass + except BadRequest as excp: # TODO: cleanup exceptions + LOGGER.exception("ᴇxᴄᴇᴘᴛɪᴏɴ ᴡʜɪʟᴇ ʀᴇᴘᴏʀᴛɪɴɢ ᴜsᴇʀ") + + message.reply_to_message.reply_text( + f"{mention_html(user.id, user.first_name)} ʀᴇᴘᴏʀᴛᴇᴅ ᴛʜᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴛʜᴇ ᴀᴅᴍɪɴs.", + parse_mode=ParseMode.HTML, + ) + return msg + + return "" + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, _): + return f"ᴛʜɪs ᴄʜᴀᴛ ɪs sᴇᴛᴜᴘ ᴛᴏ sᴇɴᴅ ᴜsᴇʀ ʀᴇᴘᴏʀᴛs ᴛᴏ ᴀᴅᴍɪɴs, ᴠɪᴀ /ʀᴇᴘᴏʀᴛ ᴀɴᴅ @admin: `{sql.chat_should_report(chat_id)}`" + + +def __user_settings__(user_id): + return ( + "ʏᴏᴜ ᴡɪʟʟ ʀᴇᴄᴇɪᴠᴇ ʀᴇᴘᴏʀᴛs ғʀᴏᴍ ᴄʜᴀᴛs ʏᴏᴜ'ʀᴇ ᴀᴅᴍɪɴ." + if sql.user_should_report(user_id) is True + else "ʏᴏᴜ ᴡɪʟʟ *ɴᴏᴛ* ʀᴇᴄᴇɪᴠᴇ ʀᴇᴘᴏʀᴛs ғʀᴏᴍ ᴄʜᴀᴛs ʏᴏᴜ'ʀᴇ ᴀᴅᴍɪɴ." + ) + + +def buttons(update: Update, context: CallbackContext): + bot = context.bot + query = update.callback_query + splitter = query.data.replace("report_", "").split("=") + if splitter[1] == "kick": + try: + bot.kickChatMember(splitter[0], splitter[2]) + bot.unbanChatMember(splitter[0], splitter[2]) + query.answer("✅ sᴜᴄᴄᴇsғᴜʟʟʏ ᴋɪᴄᴋᴇᴅ") + return "" + except Exception as err: + query.answer("🛑 ғᴀɪʟᴇᴅ ᴛᴏ ᴋɪᴄᴋ") + bot.sendMessage( + text=f"ᴇʀʀᴏʀ: {err}", + chat_id=query.message.chat_id, + parse_mode=ParseMode.HTML, + ) + elif splitter[1] == "banned": + try: + bot.kickChatMember(splitter[0], splitter[2]) + query.answer("✅ sᴜᴄᴄᴇsғᴜʟʟʏ ʙᴀɴɴᴇᴅ") + return "" + except Exception as err: + bot.sendMessage( + text=f"ᴇʀʀᴏʀ: {err}", + chat_id=query.message.chat_id, + parse_mode=ParseMode.HTML, + ) + query.answer("🛑 ғᴀɪʟᴇᴅ ᴛᴏ Ban") + elif splitter[1] == "delete": + try: + bot.deleteMessage(splitter[0], splitter[3]) + query.answer("✅ Message Deleted") + return "" + except Exception as err: + bot.sendMessage( + text=f"Error: {err}", + chat_id=query.message.chat_id, + parse_mode=ParseMode.HTML, + ) + query.answer("🛑 ғᴀɪʟᴇᴅ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇ!") + + +__help__ = """ +⍟ /report <ʀᴇᴀsᴏɴ>*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ ʀᴇᴘᴏʀᴛ ɪᴛ ᴛᴏ ᴀᴅᴍɪɴs.` + +⍟ @admins*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴛᴏ ʀᴇᴘᴏʀᴛ ɪᴛ ᴛᴏ ᴀᴅᴍɪɴs` +. +*ɴᴏᴛᴇ:* ɴᴇɪᴛʜᴇʀ ᴏғ ᴛʜᴇsᴇ ᴡɪʟʟ ɢᴇᴛ ᴛʀɪɢɢᴇʀᴇᴅ ɪғ ᴜsᴇᴅ ʙʏ ᴀᴅᴍɪɴs. + +*ᴀᴅᴍɪɴs ᴏɴʟʏ:* +• /reports <on/ᴏғғ>*:* ᴄʜᴀɴɢᴇ ʀᴇᴘᴏʀᴛ sᴇᴛᴛɪɴɢ, ᴏʀ ᴠɪᴇᴡ ᴄᴜʀʀᴇɴᴛ sᴛᴀᴛᴜs. + +➩ ɪғ ᴅᴏɴᴇ ɪɴ ᴘᴍ, ᴛᴏɢɢʟᴇs ʏᴏᴜʀ sᴛᴀᴛᴜs. +➩ If ɪɴ ɢʀᴏᴜᴘ, ᴛᴏɢɢʟᴇs ᴛʜᴀᴛ ɢʀᴏᴜᴘ's sᴛᴀᴛᴜs. +""" + +SETTING_HANDLER = CommandHandler("reports", report_setting, run_async=True) +REPORT_HANDLER = CommandHandler( + "report", report, filters=Filters.chat_type.groups, run_async=True +) +ADMIN_REPORT_HANDLER = MessageHandler( + Filters.regex(r"(?i)@admins(s)?"), report, run_async=True +) +REPORT_BUTTON_USER_HANDLER = CallbackQueryHandler(buttons, pattern=r"report_") + +dispatcher.add_handler(REPORT_BUTTON_USER_HANDLER) +dispatcher.add_handler(SETTING_HANDLER) +dispatcher.add_handler(REPORT_HANDLER, REPORT_GROUP) +dispatcher.add_handler(ADMIN_REPORT_HANDLER, REPORT_GROUP) + +__mod_name__ = "𝚁ᴇᴘᴏʀᴛ" +__handlers__ = [ + (REPORT_HANDLER, REPORT_GROUP), + (ADMIN_REPORT_HANDLER, REPORT_GROUP), + (SETTING_HANDLER), +] diff --git a/Exon/modules/reverse.py b/Exon/modules/reverse.py new file mode 100644 index 00000000..bff9dc79 --- /dev/null +++ b/Exon/modules/reverse.py @@ -0,0 +1,235 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import os +import re +import urllib +import urllib.parse +import urllib.request +from urllib.error import HTTPError, URLError + +import requests +from bs4 import BeautifulSoup +from telegram import InputMediaPhoto, TelegramError, Update +from telegram.ext import CallbackContext + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + +opener = urllib.request.build_opener() +useragent = "Mozilla/5.0 (Linux; Android 6.0.1; SM-G920V Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36" +opener.addheaders = [("User-agent", useragent)] + + +def reverse(update: Update, context: CallbackContext): + if os.path.isfile("okgoogle.png"): + os.remove("okgoogle.png") + + msg = update.effective_message + chat_id = update.effective_chat.id + bot, args = context.bot, context.args + rtmid = msg.message_id + imagename = "okgoogle.png" + + if reply := msg.reply_to_message: + if reply.sticker: + file_id = reply.sticker.file_id + elif reply.photo: + file_id = reply.photo[-1].file_id + elif reply.document: + file_id = reply.document.file_id + else: + msg.reply_text("ʀᴇᴘʟʏ ᴛᴏ ᴀɴ ɪᴍᴀɢᴇ ᴏʀ sᴛɪᴄᴋᴇʀ ᴛᴏ ʟᴏᴏᴋᴜᴘ.") + return + image_file = bot.get_file(file_id) + image_file.download(imagename) + if args: + txt = args[0] + try: + lim = int(txt) + except: + lim = 2 + else: + lim = 2 + elif args: + splatargs = msg.text.split(" ") + if len(splatargs) == 3: + img_link = splatargs[1] + try: + lim = int(splatargs[2]) + except: + lim = 2 + elif len(splatargs) == 2: + img_link = splatargs[1] + lim = 2 + else: + msg.reply_text("/reverse <link> <amount ᴏғ ɪᴍᴀɢᴇs ᴛᴏ ʀᴇᴛᴜʀɴ.>") + return + try: + urllib.request.urlretrieve(img_link, imagename) + except HTTPError as HE: + if HE.reason == "Not Found": + msg.reply_text("ɪᴍᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ.") + return + if HE.reason == "Forbidden": + msg.reply_text( + "ᴄᴏᴜʟᴅɴ'ᴛ ᴀᴄᴄᴇss ᴛʜᴇ ᴘʀᴏᴠɪᴅᴇᴅ ʟɪɴᴋ, ᴛʜᴇ ᴡᴇʙsɪᴛᴇ ᴍɪɢʜᴛ ʜᴀᴠᴇ ʙʟᴏᴄᴋᴇᴅ ᴀᴄᴄᴇssɪɴɢ ᴛᴏ ᴛʜᴇ website ʙʏ ʙᴏᴛ ᴏʀ ᴛʜᴇ ᴡᴇʙsɪᴛᴇ ᴅᴏᴇs ɴᴏᴛ ᴇxɪsᴛᴇᴅ." + ) + return + except URLError as UE: + msg.reply_text(f"{UE.reason}") + return + except ValueError as VE: + msg.reply_text(f"{VE}\nᴘʟᴇᴀsᴇ ᴛʀʏ ᴀɢᴀɪɴ ᴜsɪɴɢ ʜᴛᴛᴘ ᴏʀ ʜᴛᴛᴘs ᴘʀᴏᴛᴏᴄᴏʟ.") + return + else: + msg.reply_markdown( + "ᴘʟᴇᴀsᴇ ʀᴇᴘʟʏ ᴛᴏ ᴀ sᴛɪᴄᴋᴇʀ, ᴏʀ ᴀɴ ɪᴍᴀɢᴇ to sᴇᴀʀᴄʜ it!\nᴅᴏ ʏᴏᴜ ᴋɴᴏᴡ ᴛʜᴀᴛ ʏᴏᴜ ᴄᴀɴ sᴇᴀʀᴄʜ ᴀɴ ɪᴍᴀɢᴇ ᴡɪᴛʜ a ʟɪɴᴋ ᴛᴏᴏ? `/reverse [ᴘɪᴄᴛᴜʀᴇʟɪɴᴋ] <ᴀᴍᴏᴜɴᴛ>`." + ) + return + + try: + searchUrl = "https://www.google.com/searchbyimage/upload" + multipart = { + "encoded_image": (imagename, open(imagename, "rb")), + "image_content": "", + } + response = requests.post(searchUrl, files=multipart, allow_redirects=False) + fetchUrl = response.headers["Location"] + + if response != 400: + xx = bot.send_message( + chat_id, + "ɪᴍᴀɢᴇ ᴡᴀs sᴜᴄᴄᴇssғᴜʟʟʏ ᴜᴘʟᴏᴀᴅᴇᴅ ᴛᴏ ɢᴏᴏɢʟᴇ." "\n ᴘʟᴇᴀsᴇ ᴡᴀɪᴛ ʙᴀʙʏ...", + reply_to_message_id=rtmid, + ) + else: + xx = bot.send_message( + chat_id, + "ɢᴏᴏɢʟᴇ ᴛᴏʟᴅ ᴍᴇ ᴛᴏ ғᴜᴄᴋ ʏᴏᴜ ᴛʜɪs ɢᴀʏ", + reply_to_message_id=rtmid, + ) + return + + os.remove(imagename) + match = ParseSauce(f"{fetchUrl}&hl=en") + guess = match["best_guess"] + if match["override"] and match["override"] != "": + imgspage = match["override"] + else: + imgspage = match["similar_images"] + + if guess and imgspage: + xx.edit_text( + f"[{guess}]({fetchUrl})\nWaito...", + parse_mode="Markdown", + disable_web_page_preview=True, + ) + else: + xx.edit_text("ᴄᴏᴜʟᴅɴ'ᴛ ғɪɴᴅ ᴀɴʏᴛʜɪɴɢ.") + return + + images = scam(imgspage, lim) + if len(images) == 0: + xx.edit_text( + f"[{guess}]({fetchUrl})[.]({imgspage})", + parse_mode="Markdown", + disable_web_page_preview=True, + ) + return + + imglinks = [] + for link in images: + lmao = InputMediaPhoto(media=str(link)) + imglinks.append(lmao) + + bot.send_media_group(chat_id=chat_id, media=imglinks, reply_to_message_id=rtmid) + xx.edit_text( + f"[{guess}]({fetchUrl})[.]({imgspage})", + parse_mode="Markdown", + disable_web_page_preview=True, + ) + except TelegramError as e: + print(e) + except Exception as exception: + print(exception) + + +def ParseSauce(googleurl): + """Parse/Scrape the HTML code for the info we want.""" + + source = opener.open(googleurl).read() + soup = BeautifulSoup(source, "html.parser") + + results = {"similar_images": "", "override": "", "best_guess": ""} + + try: + for bess in soup.findAll("a", {"class": "PBorbe"}): + url = "https://www.google.com" + bess.get("href") + results["override"] = url + except: + pass + + for similar_image in soup.findAll("input", {"class": "gLFyf"}): + url = "https://www.google.com/search?tbm=isch&q=" + urllib.parse.quote_plus( + similar_image.get("value") + ) + results["similar_images"] = url + + for best_guess in soup.findAll("div", attrs={"class": "r5a77d"}): + results["best_guess"] = best_guess.get_text() + + return results + + +def scam(imgspage, lim): + """Parse/Scrape the HTML code for the info we want.""" + + single = opener.open(imgspage).read() + decoded = single.decode("utf-8") + if int(lim) > 10: + lim = 10 + + imglinks = [] + counter = 0 + + pattern = r"^,\[\"(.*[.png|.jpg|.jpeg])\",[0-9]+,[0-9]+\]$" + oboi = re.findall(pattern, decoded, re.I | re.M) + + for imglink in oboi: + counter += 1 + imglinks.append(imglink) + if counter >= int(lim): + break + + return imglinks + + +REVERSE_HANDLER = DisableAbleCommandHandler( + ["grs", "reverse", "pp"], reverse, pass_args=True, run_async=True +) + +dispatcher.add_handler(REVERSE_HANDLER) + +__mod_name__ = "𝚁ᴇᴠᴇʀsᴇ" diff --git a/Exon/modules/rmbg.py b/Exon/modules/rmbg.py new file mode 100644 index 00000000..e0f64248 --- /dev/null +++ b/Exon/modules/rmbg.py @@ -0,0 +1,116 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 io +import os +from datetime import datetime + +import requests +from telethon import types +from telethon.tl import functions + +from Exon import REM_BG_API_KEY, SUPPORT_CHAT, TEMP_DOWNLOAD_DIRECTORY, telethn +from Exon.events import register + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + return isinstance( + ( + await telethn(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + if isinstance(chat, types.InputPeerUser): + return True + + +@register(pattern="^/rmbg") +async def _(event): + if event.fwd_from: + return + if event.is_group and not await is_register_admin( + event.input_chat, event.message.sender_id + ): + return + if REM_BG_API_KEY is None: + await event.reply("ʏᴏᴜ ɴᴇᴇᴅ API ᴛᴏᴋᴇɴ from ʀᴇᴍᴏᴠᴇ.ʙɢ ᴛᴏ ᴜsᴇ ᴛʜɪs ᴘʟᴜɢɪɴ.") + return False + start = datetime.now() + message_id = event.message.id + if event.reply_to_msg_id: + message_id = event.reply_to_msg_id + reply_message = await event.get_reply_message() + await event.reply("ᴘʀᴏᴄᴇssɪɴɢ....") + try: + downloaded_file_name = await telethn.download_media( + reply_message, TEMP_DOWNLOAD_DIRECTORY + ) + except Exception as e: + await event.reply(str(e)) + return + else: + output_file_name = ReTrieveFile(downloaded_file_name) + os.remove(downloaded_file_name) + else: + HELP_STR = "ᴜsᴇ `/rmbg` ᴀs ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇᴅɪᴀ" + await event.reply(HELP_STR) + return + contentType = output_file_name.headers.get("content-type") + if "image" in contentType: + with io.BytesIO(output_file_name.content) as remove_bg_image: + remove_bg_image.name = "rmbg.png" + await telethn.send_file( + event.chat_id, + remove_bg_image, + force_document=True, + supports_streaming=False, + allow_cache=False, + reply_to=message_id, + ) + end = datetime.now() + ms = (end - start).seconds + await event.reply(f"ʙᴀᴄᴋɢʀᴏᴜɴᴅ ʀᴇᴍᴏᴠᴇᴅ ɪɴ {ms} sᴇᴄᴏɴᴅs") + else: + await event.reply( + f"ʀᴇᴍᴏᴠᴇ.ʙɢ ᴀᴘɪ ʀᴇᴛᴜʀɴᴇᴅ ʀᴇᴛᴜʀɴᴇᴅ. ᴘʟᴇᴀsᴇ ʀᴇᴘᴏʀᴛ ᴛᴏ @{SUPPORT_CHAT} \n".format( + output_file_name.content.decode("UTF-8") + ) + ) + + +def ReTrieveFile(input_file_name): + headers = { + "X-API-Key": REM_BG_API_KEY, + } + files = { + "image_file": (input_file_name, open(input_file_name, "rb")), + } + return requests.post( + "https://api.remove.bg/v1.0/removebg", + headers=headers, + files=files, + allow_redirects=True, + stream=True, + ) diff --git a/Exon/modules/rules.py b/Exon/modules/rules.py new file mode 100644 index 00000000..cfd0aad6 --- /dev/null +++ b/Exon/modules/rules.py @@ -0,0 +1,176 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 Optional + +from telegram import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, + ParseMode, + Update, + User, +) +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CommandHandler, Filters +from telegram.utils.helpers import escape_markdown + +import Exon.modules.sql.rules_sql as sql +from Exon import dispatcher +from Exon.modules.helper_funcs.chat_status import user_admin +from Exon.modules.helper_funcs.string_handling import markdown_parser + + +def get_rules(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + send_rules(update, chat_id) + + +# Do not async - not from a handler +def send_rules(update, chat_id, from_pm=False): + bot = dispatcher.bot + user = update.effective_user # type: Optional[User] + reply_msg = update.message.reply_to_message + try: + chat = bot.get_chat(chat_id) + except BadRequest as excp: + if excp.message == "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ" and from_pm: + bot.send_message( + user.id, + "The ʀᴜʟᴇs sʜᴏʀᴛᴄᴜᴛ ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ ʜᴀsɴ'ᴛ ʙᴇᴇɴ sᴇᴛ ᴘʀᴏᴘᴇʀʟʏ! ᴀsᴋ ᴀᴅᴍɪɴs to " + "ғɪx ᴛʜɪs.\nMaybe ᴛʜᴇʏ ғᴏʀɢᴏᴛ ᴛʜᴇ ʜʏᴘʜᴇɴ ɪɴ ɪᴅ", + ) + return + raise + + rules = sql.get_rules(chat_id) + text = f"ᴛʜᴇ ʀᴜʟᴇs ғᴏʀ *{escape_markdown(chat.title)}* ᴀʀᴇ:\n\n{rules}" + + if from_pm and rules: + bot.send_message( + user.id, + text, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) + elif from_pm: + bot.send_message( + user.id, + "ᴛʜᴇ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴs ʜᴀᴠᴇɴ'ᴛ sᴇᴛ ᴀɴʏ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ ʏᴇᴛ. " + "ᴛʜɪs ᴘʀᴏʙᴀʙʟʏ ᴅᴏᴇsɴ'ᴛ ᴍᴇᴀɴ ɪᴛ's ʟᴀᴡʟᴇss ᴛʜᴏᴜɢʜ...!", + ) + elif rules and reply_msg: + reply_msg.reply_text( + "ᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ sᴇᴇ ᴛʜᴇ ʀᴜʟᴇs.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʀᴜʟᴇs", + url=f"t.me/{bot.username}?start={chat_id}", + ), + ], + ], + ), + ) + elif rules: + update.effective_message.reply_text( + "ᴘʟᴇᴀsᴇ ᴄʟɪᴄᴋ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ sᴇᴇ ᴛʜᴇ ʀᴜʟᴇs.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʀᴜʟᴇs", + url=f"t.me/{bot.username}?start={chat_id}", + ), + ], + ], + ), + ) + else: + update.effective_message.reply_text( + "ᴛʜᴇ ɢʀᴏᴜᴘ ᴀᴅᴍɪɴs ʜᴀᴠᴇɴ sᴇᴛ ᴀɴʏ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ᴄʜᴀᴛ ʏᴇᴛ. " + "ᴛʜɪs ᴘʀᴏʙᴀʙʟʏ ᴅᴏᴇsɴ'ᴛ ᴍᴇᴀɴ ɪᴛ's ʟᴀᴡʟᴇss ᴛʜᴏᴜɢʜ \nᴇɴᴊᴏʏ...!", + ) + + +@user_admin +def set_rules(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + msg = update.effective_message # type: Optional[Message] + raw_text = msg.text + args = raw_text.split(None, 1) # use python's maxsplit to separate cmd and args + if len(args) == 2: + txt = args[1] + offset = len(txt) - len(raw_text) # set correct offset relative to command + markdown_rules = markdown_parser( + txt, + entities=msg.parse_entities(), + offset=offset, + ) + + sql.set_rules(chat_id, markdown_rules) + update.effective_message.reply_text("sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴛ ʀᴜʟᴇs ғᴏʀ ᴛʜɪs ɢʀᴏᴜᴘ.") + + +@user_admin +def clear_rules(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + sql.set_rules(chat_id, "") + update.effective_message.reply_text("sᴜᴄᴄᴇssғᴜʟʟʏ ᴄʟᴇᴀʀᴇᴅ ʀᴜʟᴇs!") + + +def __stats__(): + return f"•➥ {sql.num_chats()} ᴄʜᴀᴛs ʜᴀᴠᴇ ʀᴜʟᴇs sᴇᴛ." + + +def __import_data__(chat_id, data): + # set chat rules + rules = data.get("info", {}).get("rules", "") + sql.set_rules(chat_id, rules) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + return f"ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ʜᴀᴅ ɪᴛ's ʀᴜʟᴇs sᴇᴛ: `{bool(sql.get_rules(chat_id))}`" + + +__mod_name__ = "𝚁ᴜʟᴇs" + +GET_RULES_HANDLER = CommandHandler( + "rules", get_rules, filters=Filters.chat_type.groups, run_async=True +) +SET_RULES_HANDLER = CommandHandler( + "setrules", set_rules, filters=Filters.chat_type.groups, run_async=True +) +RESET_RULES_HANDLER = CommandHandler( + "clearrules", clear_rules, filters=Filters.chat_type.groups, run_async=True +) + +dispatcher.add_handler(GET_RULES_HANDLER) +dispatcher.add_handler(SET_RULES_HANDLER) +dispatcher.add_handler(RESET_RULES_HANDLER) diff --git a/Exon/modules/sed.py b/Exon/modules/sed.py new file mode 100644 index 00000000..a3853623 --- /dev/null +++ b/Exon/modules/sed.py @@ -0,0 +1,181 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 sre_constants + +import regex +import telegram +from telegram import Update +from telegram.ext import CallbackContext, Filters + +from Exon import LOGGER, dispatcher +from Exon.modules.disable import DisableAbleMessageHandler +from Exon.modules.helper_funcs.regex_helper import infinite_loop_check + +DELIMITERS = ("/", ":", "|", "_") + + +def separate_sed(sed_string): + if ( + len(sed_string) < 3 + or sed_string[1] not in DELIMITERS + or sed_string.count(sed_string[1]) < 2 + ): + return + + delim = sed_string[1] + start = counter = 2 + while counter < len(sed_string): + if sed_string[counter] == "\\": + counter += 1 + + elif sed_string[counter] == delim: + replace = sed_string[start:counter] + counter += 1 + start = counter + break + + counter += 1 + + else: + return None + + while counter < len(sed_string): + if ( + sed_string[counter] == "\\" + and counter + 1 < len(sed_string) + and sed_string[counter + 1] == delim + ): + sed_string = sed_string[:counter] + sed_string[counter + 1 :] + + elif sed_string[counter] == delim: + replace_with = sed_string[start:counter] + counter += 1 + break + + counter += 1 + else: + return replace, sed_string[start:], "" + + flags = sed_string[counter:] if counter < len(sed_string) else "" + return replace, replace_with, flags.lower() + + +def sed(update: Update, context: CallbackContext): + sed_result = separate_sed(update.effective_message.text) + if sed_result and update.effective_message.reply_to_message: + if update.effective_message.reply_to_message.text: + to_fix = update.effective_message.reply_to_message.text + elif update.effective_message.reply_to_message.caption: + to_fix = update.effective_message.reply_to_message.caption + else: + return + + repl, repl_with, flags = sed_result + if not repl: + update.effective_message.reply_to_message.reply_text( + "You're trying to replace... " "nothing with something?", + ) + return + + try: + try: + check = regex.match(repl, to_fix, flags=regex.IGNORECASE, timeout=5) + except TimeoutError: + return + if check and check.group(0).lower() == to_fix.lower(): + update.effective_message.reply_to_message.reply_text( + "ʜᴇʏ ᴇᴠᴇʀʏᴏɴᴇ, {} ɪs ᴛʀʏɪɴɢ ᴛᴏ ᴍᴀᴋᴇ " + "ᴍᴇ sᴀʏ sᴛᴜғғ I ᴅᴏɴ'ᴛ ᴡᴀɴɴᴀ " + "sᴀʏ!".format(update.effective_user.first_name), + ) + return + if infinite_loop_check(repl): + update.effective_message.reply_text( + "I'ᴍ ᴀғʀᴀɪᴅ I ᴄᴀɴ'ᴛ ʀᴜɴ ᴛʜᴀᴛ ʀᴇɢᴇx.", + ) + return + if "i" in flags and "g" in flags: + text = regex.sub( + repl, + repl_with, + to_fix, + flags=regex.I, + timeout=3, + ).strip() + elif "i" in flags: + text = regex.sub( + repl, + repl_with, + to_fix, + count=1, + flags=regex.I, + timeout=3, + ).strip() + elif "g" in flags: + text = regex.sub(repl, repl_with, to_fix, timeout=3).strip() + else: + text = regex.sub(repl, repl_with, to_fix, count=1, timeout=3).strip() + except TimeoutError: + update.effective_message.reply_text("ᴛɪᴍᴇᴏᴜᴛ") + return + except sre_constants.error: + LOGGER.warning(update.effective_message.text) + LOGGER.exception("sʀᴇ ᴄᴏɴsᴛᴀɴᴛ ᴇʀʀᴏʀ") + update.effective_message.reply_text("ᴅᴏ ʏᴏᴜ ᴇᴠᴇɴ sᴇᴅ? ᴀᴘᴘᴀʀᴇɴᴛʟʏ ɴᴏᴛ.") + return + + # empty string errors -_- + if len(text) >= telegram.MAX_MESSAGE_LENGTH: + update.effective_message.reply_text( + "ᴛʜᴇ ʀᴇsᴜʟᴛ ᴏғ ᴛʜᴇ sed ᴄᴏᴍᴍᴀɴᴅ ᴡᴀs ᴛᴏᴏ ʟᴏɴɢ ғᴏʀ \ + ᴛᴇʟᴇɢʀᴀᴍ!", + ) + elif text: + update.effective_message.reply_to_message.reply_text(text) + + +__help__ = """ + ➩ `s/<text1>/<text2>(/<flag>)`*:* ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇssᴀɢᴇ ᴡɪᴛʜ ᴛʜɪs ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴀ sᴇᴅ ᴏᴘᴇʀᴀᴛɪᴏɴ ᴏɴ ᴛʜᴀᴛ ᴍᴇssᴀɢᴇ, ʀᴇᴘʟᴀᴄɪɴɢ ᴀʟʟ \ +ᴏᴄᴄᴜʀʀᴇɴᴄᴇs ᴏғ 'text1' ᴡɪᴛʜ 'text2'. ғʟᴀɢs ᴀʀᴇ ᴏᴘᴛɪᴏɴᴀʟ, ᴀɴᴅ ᴄᴜʀʀᴇɴᴛʟʏ ɪɴᴄʟᴜᴅᴇ 'i' ғᴏʀ ɪɢɴᴏʀᴇ ᴄᴀsᴇ, 'g' ғᴏʀ ɢʟᴏʙᴀʟ, \ +ᴏʀ ɴᴏᴛʜɪɴɢ. ᴅᴇʟɪᴍɪᴛᴇʀs ɪɴᴄʟᴜᴅᴇ `/`, `_`, `|`, ᴀɴᴅ `:`. ᴛᴇxᴛ ɢʀᴏᴜᴘɪɴɢ ɪs sᴜᴘᴘᴏʀᴛᴇᴅ. ᴛʜᴇ ʀᴇsᴜʟᴛɪɴɢ ᴍᴇssᴀɢᴇ ᴄᴀɴɴᴏᴛ be \ +ʟᴀʀɢᴇʀ ᴛʜᴀɴ {}. + +*ʀᴇᴍɪɴᴅᴇʀ:* sᴇᴅ ᴜsᴇs sᴏᴍᴇ sᴘᴇᴄɪᴀʟ ᴄʜᴀʀᴀᴄᴛᴇʀs ᴛᴏ ᴍᴀᴋᴇ ᴍᴀᴛᴄʜɪɴɢ ᴇᴀsɪᴇʀ, sᴜᴄʜ ᴀs ᴛʜᴇsᴇ: `+*.?\\` +If ʏᴏᴜ ᴡᴀɴᴛ ᴛᴏ ᴜsᴇ ᴛʜᴇsᴇ ᴄʜᴀʀᴀᴄᴛᴇʀs, ᴍᴀᴋᴇ sᴜʀᴇ ʏᴏᴜ ᴇsᴄᴀᴘᴇ ᴛʜᴇᴍ! +*Example:* \\?. +""".format( + telegram.MAX_MESSAGE_LENGTH, +) + +__mod_name__ = "𝚁ᴇɢᴇx" + +SED_HANDLER = DisableAbleMessageHandler( + Filters.regex(r"s([{}]).*?\1.*".format("".join(DELIMITERS))), + sed, + friendly="sed", + run_async=True, +) + +dispatcher.add_handler(SED_HANDLER) diff --git a/Exon/modules/sfw.py b/Exon/modules/sfw.py new file mode 100644 index 00000000..c1d9f573 --- /dev/null +++ b/Exon/modules/sfw.py @@ -0,0 +1,507 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 nekos +import requests +from telegram.ext import CommandHandler + +from Exon import dispatcher + +url_sfw = "https://api.waifu.pics/sfw/" + + +def waifu(update, context): + msg = update.effective_message + url = f"{url_sfw}waifu" + result = requests.get(url).json() + img = result["url"] + msg.reply_photo(photo=img) + + +def neko(update, context): + msg = update.effective_message + url = f"{url_sfw}neko" + result = requests.get(url).json() + img = result["url"] + msg.reply_photo(photo=img) + + +def shinobu(update, context): + msg = update.effective_message + url = f"{url_sfw}shinobu" + result = requests.get(url).json() + img = result["url"] + msg.reply_photo(photo=img) + + +def megumin(update, context): + msg = update.effective_message + url = f"{url_sfw}megumin" + result = requests.get(url).json() + img = result["url"] + msg.reply_photo(photo=img) + + +def bully(update, context): + msg = update.effective_message + url = f"{url_sfw}bully" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def cuddle(update, context): + msg = update.effective_message + url = f"{url_sfw}cuddle" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def cry(update, context): + msg = update.effective_message + url = f"{url_sfw}cry" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def hug(update, context): + msg = update.effective_message + url = f"{url_sfw}hug" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def awoo(update, context): + msg = update.effective_message + url = f"{url_sfw}awoo" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def kiss(update, context): + msg = update.effective_message + url = f"{url_sfw}kiss" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def lick(update, context): + msg = update.effective_message + url = f"{url_sfw}lick" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def pat(update, context): + msg = update.effective_message + url = f"{url_sfw}pat" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def smug(update, context): + msg = update.effective_message + url = f"{url_sfw}smug" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def bonk(update, context): + msg = update.effective_message + url = f"{url_sfw}bonk" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def yeet(update, context): + msg = update.effective_message + url = f"{url_sfw}yeet" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def blush(update, context): + msg = update.effective_message + url = f"{url_sfw}blush" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def smile(update, context): + msg = update.effective_message + url = f"{url_sfw}smile" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def wave(update, context): + msg = update.effective_message + url = f"{url_sfw}wave" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def highfive(update, context): + msg = update.effective_message + url = f"{url_sfw}highfive" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def handhold(update, context): + msg = update.effective_message + url = f"{url_sfw}handhold" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def nom(update, context): + msg = update.effective_message + url = f"{url_sfw}nom" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def bite(update, context): + msg = update.effective_message + url = f"{url_sfw}bite" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def glomp(update, context): + msg = update.effective_message + url = f"{url_sfw}glomp" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def slap(update, context): + msg = update.effective_message + url = f"{url_sfw}slap" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def killgif(update, context): + msg = update.effective_message + url = f"{url_sfw}kill" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def kickgif(update, context): + msg = update.effective_message + url = f"{url_sfw}kick" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def happy(update, context): + msg = update.effective_message + url = f"{url_sfw}happy" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def wink(update, context): + msg = update.effective_message + url = f"{url_sfw}wink" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def poke(update, context): + msg = update.effective_message + url = f"{url_sfw}poke" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def dance(update, context): + msg = update.effective_message + url = f"{url_sfw}dance" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +def cringe(update, context): + msg = update.effective_message + url = f"{url_sfw}cringe" + result = requests.get(url).json() + img = result["url"] + msg.reply_animation(img) + + +################ +def wallpaper(update, context): + msg = update.effective_message + target = "wallpaper" + msg.reply_photo(nekos.img(target)) + + +def tickle(update, context): + msg = update.effective_message + target = "tickle" + msg.reply_video(nekos.img(target)) + + +def ngif(update, context): + msg = update.effective_message + target = "ngif" + msg.reply_video(nekos.img(target)) + + +def feed(update, context): + msg = update.effective_message + target = "feed" + msg.reply_video(nekos.img(target)) + + +def gasm(update, context): + msg = update.effective_message + target = "gasm" + msg.reply_photo(nekos.img(target)) + + +def avatar(update, context): + msg = update.effective_message + target = "avatar" + msg.reply_photo(nekos.img(target)) + + +def foxgirl(update, context): + msg = update.effective_message + target = "fox_girl" + msg.reply_photo(nekos.img(target)) + + +def gecg(update, context): + msg = update.effective_message + target = "gecg" + msg.reply_photo(nekos.img(target)) + + +def lizard(update, context): + msg = update.effective_message + target = "lizard" + msg.reply_photo(nekos.img(target)) + + +def spank(update, context): + msg = update.effective_message + target = "spank" + msg.reply_video(nekos.img(target)) + + +def goose(update, context): + msg = update.effective_message + target = "goose" + msg.reply_photo(nekos.img(target)) + + +def woof(update, context): + msg = update.effective_message + target = "woof" + msg.reply_photo(nekos.img(target)) + + +WALLPAPER_HANDLER = CommandHandler("wallpaper", wallpaper, run_async=True) +TICKLE_HANDLER = CommandHandler("tickle", tickle, run_async=True) +FEED_HANDLER = CommandHandler("feed", feed, run_async=True) +GASM_HANDLER = CommandHandler("gasm", gasm, run_async=True) +AVATAR_HANDLER = CommandHandler("avatar", avatar, run_async=True) +FOXGIRL_HANDLER = CommandHandler("foxgirl", foxgirl, run_async=True) +GECG_HANDLER = CommandHandler("gecg", gecg, run_async=True) +LIZARD_HANDLER = CommandHandler("lizard", lizard, run_async=True) +GOOSE_HANDLER = CommandHandler("goose", goose, run_async=True) +WOOF_HANDLER = CommandHandler("woof", woof, run_async=True) +NGIF_HANDLER = CommandHandler("ngif", ngif, run_async=True) + +WAIFUS_HANDLER = CommandHandler("waifus", waifu, run_async=True) +NEKO_HANDLER = CommandHandler("neko", neko, run_async=True) +SHINOBU_HANDLER = CommandHandler("shinobu", shinobu, run_async=True) +MEGUMIN_HANDLER = CommandHandler("megumin", megumin, run_async=True) +BULLY_HANDLER = CommandHandler("bully", bully, run_async=True) +CUDDLE_HANDLER = CommandHandler("cuddle", foxgirl, run_async=True) +CRY_HANDLER = CommandHandler("cry", cry, run_async=True) +HUG_HANDLER = CommandHandler("hug", hug, run_async=True) +AWOO_HANDLER = CommandHandler("awoo", awoo, run_async=True) +KISS_HANDLER = CommandHandler("kiss", kiss, run_async=True) +LICK_HANDLER = CommandHandler("lick", lick, run_async=True) +PAT_HANDLER = CommandHandler("pat", pat, run_async=True) + + +SMUG_HANDLER = CommandHandler("smug", smug, run_async=True) +BONK_HANDLER = CommandHandler("bonk", bonk, run_async=True) +YEET_HANDLER = CommandHandler("yeet", yeet, run_async=True) +BLUSH_HANDLER = CommandHandler("blush", blush, run_async=True) +SMILE_HANDLER = CommandHandler("smile", smile, run_async=True) +WAVE_HANDLER = CommandHandler("wave", wave, run_async=True) +HIGHFIVE_HANDLER = CommandHandler("highfive", highfive, run_async=True) +HANDHOLD_HANDLER = CommandHandler("handhold", handhold, run_async=True) +NOM_HANDLER = CommandHandler("nom", nom, run_async=True) +BITE_HANDLER = CommandHandler("bite", bite, run_async=True) +GLOMP_HANDLER = CommandHandler("glomp", glomp, run_async=True) + + +SLAP_HANDLER = CommandHandler("slap", slap, run_async=True) +KILLGIF_HANDLER = CommandHandler("killgif", killgif, run_async=True) +HAPPY_HANDLER = CommandHandler("happy", happy, run_async=True) +WINK_HANDLER = CommandHandler("wink", wink, run_async=True) +POKE_HANDLER = CommandHandler("poke", poke, run_async=True) +DANCE_HANDLER = CommandHandler("dance", dance, run_async=True) +CRINGE_HANDLER = CommandHandler("cringe", cringe, run_async=True) + + +dispatcher.add_handler(SLAP_HANDLER) +dispatcher.add_handler(KILLGIF_HANDLER) +dispatcher.add_handler(HAPPY_HANDLER) +dispatcher.add_handler(WINK_HANDLER) +dispatcher.add_handler(POKE_HANDLER) +dispatcher.add_handler(DANCE_HANDLER) +dispatcher.add_handler(CRINGE_HANDLER) + + +dispatcher.add_handler(SMUG_HANDLER) +dispatcher.add_handler(BONK_HANDLER) +dispatcher.add_handler(YEET_HANDLER) +dispatcher.add_handler(BLUSH_HANDLER) +dispatcher.add_handler(SMILE_HANDLER) +dispatcher.add_handler(WAVE_HANDLER) +dispatcher.add_handler(HIGHFIVE_HANDLER) +dispatcher.add_handler(HANDHOLD_HANDLER) +dispatcher.add_handler(NOM_HANDLER) +dispatcher.add_handler(BITE_HANDLER) +dispatcher.add_handler(GLOMP_HANDLER) + + +dispatcher.add_handler(AWOO_HANDLER) +dispatcher.add_handler(PAT_HANDLER) +dispatcher.add_handler(KISS_HANDLER) +dispatcher.add_handler(LICK_HANDLER) +dispatcher.add_handler(CRY_HANDLER) +dispatcher.add_handler(HUG_HANDLER) +dispatcher.add_handler(WAIFUS_HANDLER) +dispatcher.add_handler(NEKO_HANDLER) +dispatcher.add_handler(SHINOBU_HANDLER) +dispatcher.add_handler(MEGUMIN_HANDLER) +dispatcher.add_handler(BULLY_HANDLER) +dispatcher.add_handler(CUDDLE_HANDLER) + +dispatcher.add_handler(LIZARD_HANDLER) +dispatcher.add_handler(NGIF_HANDLER) +dispatcher.add_handler(GOOSE_HANDLER) +dispatcher.add_handler(WOOF_HANDLER) +dispatcher.add_handler(GECG_HANDLER) +dispatcher.add_handler(WALLPAPER_HANDLER) +dispatcher.add_handler(TICKLE_HANDLER) +dispatcher.add_handler(FEED_HANDLER) +dispatcher.add_handler(GASM_HANDLER) +dispatcher.add_handler(AVATAR_HANDLER) +dispatcher.add_handler(FOXGIRL_HANDLER) + +__handlers__ = [ + SLAP_HANDLER, + LIZARD_HANDLER, + GOOSE_HANDLER, + WOOF_HANDLER, + WALLPAPER_HANDLER, + TICKLE_HANDLER, + FEED_HANDLER, + GASM_HANDLER, + AVATAR_HANDLER, + GECG_HANDLER, + FOXGIRL_HANDLER, +] + + +__mod_name__ = "𝚂ғᴡ" +__help__ = """ +*ᴄᴏᴍᴍᴀɴᴅs* *:* +• `/neko`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ sғᴡ ɴᴇᴋᴏ sᴏᴜʀᴄᴇ ɪᴍᴀɢᴇs. +• `/ngif`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ ɴᴇᴋᴏ ɢɪғs. +• `/tickle`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ ᴛɪᴄᴋʟᴇ GIFs. +• `/feed`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ ғᴇᴇᴅɪɴɢ ɢɪғs. +• `/gasm`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ ᴏʀɢᴀsᴍ sᴛɪᴄᴋᴇʀs. +• `/avatar`*:*sᴇɴᴅs ʀᴀɴᴅᴏᴍ ᴀᴠᴀᴛᴀʀ sᴛɪᴄᴋᴇʀs. +• `/waifus`*:* Sends ʀᴀɴᴅᴏᴍ ᴡᴀɪғᴜ sᴛɪᴄᴋᴇʀs. +• `/kiss`*:* sᴇɴᴅs ʀᴀɴᴅᴏᴍ ᴋɪssɪɴɢ ɢɪғs. +• `/cuddle`*:* Sends ʀᴀɴᴅᴏᴍ ᴄᴜᴅᴅʟᴇ ɢɪғs. +• `/foxgirl`*:* sᴇɴᴅs ʀᴀɴᴅᴏᴍ ғᴏxɢɪʀʟ sᴏᴜʀᴄᴇ ɪᴍᴀɢᴇs. +• `/smug`*:* Sends Random Smug GIFs. +• `/gecg`*:* ᴘᴇᴛᴀ ɴᴀɪ ʏᴀʀ +• `/slap`*:* sᴇɴᴅs ʀᴀɴᴅᴏᴍ sʟᴀᴘ ɢɪғs. + +*sᴏᴍᴇ ᴍᴏʀᴇ SFW ᴄᴏᴍᴍᴀɴᴅs :* +• `/shinobu` +• `/megumin` +• `/bully` +• `/cry` +• `/awoo` +• `/lick` +• `/pat` +• `/bonk` +• `/yeet` +• `/blush` +• `/smile` +• `/wave` +• `/highfive` +• `/handhold` +• `/nom` +• `/bite` +• `/glomp` +• `/slapgif` +• `/kill` +• `/happy` +• `/wink` +• `/poke` +• `/dance` +• `/cringe` +""" diff --git a/Exon/modules/shell.py b/Exon/modules/shell.py new file mode 100644 index 00000000..dde3684e --- /dev/null +++ b/Exon/modules/shell.py @@ -0,0 +1,76 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 subprocess + +from telegram import ParseMode, Update +from telegram.ext import CallbackContext, CommandHandler + +from Exon import LOGGER, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus + + +@dev_plus +def shell(update: Update, context: CallbackContext): + message = update.effective_message + cmd = message.text.split(" ", 1) + if len(cmd) == 1: + message.reply_text("ɴᴏ ᴄᴏᴍᴍᴀɴᴅ ᴛᴏ ᴇxᴇᴄᴜᴛᴇ ᴡᴀs ɢɪᴠᴇɴ.") + return + cmd = cmd[1] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + ) + stdout, stderr = process.communicate() + reply = "" + stderr = stderr.decode() + stdout = stdout.decode() + if stdout: + reply += f"*sᴛᴅᴏᴜᴛ*\n`{stdout}`\n" + LOGGER.info(f"Shell - {cmd} - {stdout}") + if stderr: + reply += f"*sᴛᴅᴇʀʀ*\n`{stderr}`\n" + LOGGER.error(f"Shell - {cmd} - {stderr}") + if len(reply) > 3000: + with open("shell_output.txt", "w") as file: + file.write(reply) + with open("shell_output.txt", "rb") as doc: + context.bot.send_document( + document=doc, + filename=doc.name, + reply_to_message_id=message.message_id, + chat_id=message.chat_id, + ) + else: + message.reply_text(reply, parse_mode=ParseMode.MARKDOWN) + + +SHELL_HANDLER = CommandHandler(["sh"], shell, run_async=True) +dispatcher.add_handler(SHELL_HANDLER) +__mod_name__ = "Shell" +__command_list__ = ["sh"] +__handlers__ = [SHELL_HANDLER] diff --git a/Exon/modules/shippering.py b/Exon/modules/shippering.py new file mode 100644 index 00000000..580822ea --- /dev/null +++ b/Exon/modules/shippering.py @@ -0,0 +1,103 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 random +from datetime import datetime + +from pyrogram import filters + +from Exon import pgram +from Exon.modules.mongo.couples_mongo import get_couple, save_couple +from Exon.utils.errors import capture_err + + +# Date and time +def dt(): + now = datetime.now() + dt_string = now.strftime("%d/%m/%Y %H:%M") + dt_list = dt_string.split(" ") + return dt_list + + +def dt_tom(): + a = ( + str(int(dt()[0].split("/")[0]) + 1) + + "/" + + dt()[0].split("/")[1] + + "/" + + dt()[0].split("/")[2] + ) + return a + + +today = str(dt()[0]) +tomorrow = str(dt_tom()) + + +@pgram.on_message(filters.command("couples") & ~filters.edited) +@capture_err +async def couple(_, message): + if message.chat.type == "private": + await message.reply_text("ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ ᴏɴʟʏ ᴡᴏʀᴋs ɪɴ ɢʀᴏᴜᴘs.") + return + try: + chat_id = message.chat.id + is_selected = await get_couple(chat_id, today) + if not is_selected: + list_of_users = [] + async for i in pgram.iter_chat_members(message.chat.id): + if not i.user.is_bot: + list_of_users.append(i.user.id) + if len(list_of_users) < 2: + await message.reply_text("ɴᴏᴛ ᴇɴᴏᴜɢʜ ᴜsᴇʀs") + return + c1_id = random.choice(list_of_users) + c2_id = random.choice(list_of_users) + while c1_id == c2_id: + c1_id = random.choice(list_of_users) + c1_mention = (await pgram.get_users(c1_id)).mention + c2_mention = (await pgram.get_users(c2_id)).mention + + couple_selection_message = f"""**ᴄᴏᴜᴘʟᴇ ᴏғ ᴛʜᴇ ᴅᴀʏ:** +{c1_mention} + {c2_mention} = 💗 +__ɴᴇᴡ ᴄᴏᴜᴘʟᴇ ᴏғ ᴛʜᴇ ᴅᴀʏ ᴍᴀʏ ʙᴇ ᴄʜᴏsᴇɴ ᴀᴛ 12ᴀᴍ {ᴛᴏᴍᴏʀʀᴏᴡ}__""" + await pgram.send_message(message.chat.id, text=couple_selection_message) + couple = {"c1_id": c1_id, "c2_id": c2_id} + await save_couple(chat_id, today, couple) + + elif is_selected: + c1_id = int(is_selected["c1_id"]) + c2_id = int(is_selected["c2_id"]) + c1_name = (await pgram.get_users(c1_id)).first_name + c2_name = (await pgram.get_users(c2_id)).first_name + couple_selection_message = f"""ᴄᴏᴜᴘʟᴇ ᴏғ ᴛʜᴇ ᴅᴀʏ: +[{c1_name}](tg://openmessage?user_id={c1_id}) + [{c2_name}](tg://openmessage?user_id={c2_id}) = 💜 +__ɴᴇᴡ ᴄᴏᴜᴘʟᴇ ᴏғ ᴛʜᴇ ᴅᴀʏ ᴍᴀʏ ʙᴇ ᴄʜᴏsᴇɴ ᴀᴛ 12ᴀᴍ {ᴛᴏᴍᴏʀʀᴏᴡ}__""" + await pgram.send_message(message.chat.id, text=couple_selection_message) + except Exception as e: + print(e) + await message.reply_text(e) + + +__mod_name__ = "𝙲ᴏᴜᴘʟᴇs" diff --git a/Exon/modules/speed_test.py b/Exon/modules/speed_test.py new file mode 100644 index 00000000..9bfcdb7b --- /dev/null +++ b/Exon/modules/speed_test.py @@ -0,0 +1,93 @@ +""" +MIT License + +Copyright (c) 2022 Arsh + +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 speedtest +from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode, Update +from telegram.ext import CallbackContext, CallbackQueryHandler + +from Exon import DEV_USERS, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import dev_plus + + +def convert(speed): + return round(int(speed) / 1048576, 2) + + +@dev_plus +def speedtestxyz(update: Update, context: CallbackContext): + buttons = [ + [ + InlineKeyboardButton("ɪᴍᴀɢᴇ", callback_data="speedtest_image"), + InlineKeyboardButton("ᴛᴇxᴛ", callback_data="speedtest_text"), + ], + ] + update.effective_message.reply_text( + "sᴇʟᴇᴄᴛ sᴘᴇᴇᴅᴛᴇsᴛ ᴍᴏᴅᴇ", + reply_markup=InlineKeyboardMarkup(buttons), + ) + + +def speedtestxyz_callback(update: Update, context: CallbackContext): + query = update.callback_query + + if query.from_user.id in DEV_USERS: + msg = update.effective_message.edit_text("ʀᴜɴɴɪɴɢ ғᴏʀ sᴘᴇᴇᴅᴛᴇsᴛ....") + speed = speedtest.Speedtest() + speed.get_best_server() + speed.download() + speed.upload() + replymsg = "sᴘᴇᴇᴅᴛᴇsᴛ ʀᴇsᴜʟᴛs:" + + if query.data == "speedtest_image": + speedtest_image = speed.results.share() + update.effective_message.reply_photo( + photo=speedtest_image, + caption=replymsg, + ) + msg.delete() + + elif query.data == "speedtest_text": + result = speed.results.dict() + replymsg += f"\nᴅᴏᴡɴʟᴏᴀᴅ: `{convert(result['download'])}Mb/s`\nᴜᴘʟᴏᴀᴅ: `{convert(result['upload'])}ᴍʙ/s`\nᴘɪɴɢ: `{result['ping']}`" + update.effective_message.edit_text(replymsg, parse_mode=ParseMode.MARKDOWN) + else: + query.answer("ʏᴏᴜ ᴀʀᴇ ʀᴇǫᴜɪʀᴇᴅ ᴛᴏ ᴊᴏɪɴ @{SUPPORT_CHAT} ᴛᴏ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ.") + + +SPEED_TEST_HANDLER = DisableAbleCommandHandler( + "speedtest", speedtestxyz, run_async=True +) +SPEED_TEST_CALLBACKHANDLER = CallbackQueryHandler( + speedtestxyz_callback, + pattern="speedtest_.*", + run_async=True, +) + +dispatcher.add_handler(SPEED_TEST_HANDLER) +dispatcher.add_handler(SPEED_TEST_CALLBACKHANDLER) + +__mod_name__ = "𝚂ᴘᴇᴇᴅᴛᴇsᴛ" +__command_list__ = ["speedtest"] +__handlers__ = [SPEED_TEST_HANDLER, SPEED_TEST_CALLBACKHANDLER] diff --git a/Exon/modules/spin.py b/Exon/modules/spin.py new file mode 100644 index 00000000..73e93f2c --- /dev/null +++ b/Exon/modules/spin.py @@ -0,0 +1,276 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +from typing import List, Optional + +from telegram import Bot, Chat, Update, User +from telegram.error import BadRequest +from telegram.ext import CommandHandler, Filters, MessageHandler +from telegram.ext.dispatcher import run_async +from telegram.utils.helpers import mention_html + +from Exon import dispatcher +from Exon.modules.helper_funcs.chat_status import bot_admin, can_pin, user_admin +from Exon.modules.log_channel import loggable +from Exon.modules.sql import pin_sql as sql + +PMW_GROUP = 12 + + +@run_async +@bot_admin +@can_pin +@user_admin +@loggable +def pin(bot: Bot, update: Update, args: List[str]) -> str: + user = update.effective_user # type: Optional[User] + chat = update.effective_chat # type: Optional[Chat] + + is_group = chat.type != "private" and chat.type != "channel" + + prev_message = update.effective_message.reply_to_message + + is_silent = True + if len(args) >= 1: + is_silent = not ( + args[0].lower() == "notify" + or args[0].lower() == "loud" + or args[0].lower() == "violent" + ) + + if prev_message and is_group: + try: + bot.pinChatMessage( + chat.id, prev_message.message_id, disable_notification=is_silent + ) + except BadRequest as excp: + if excp.message == "Chat_not_modified": + pass + else: + raise + sql.add_mid(chat.id, prev_message.message_id) + return ( + "<b>{}:</b>" + "\n#ᴘɪɴɴᴇᴅ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + + return "" + + +@run_async +@bot_admin +@can_pin +@user_admin +@loggable +def unpin(bot: Bot, update: Update) -> str: + chat = update.effective_chat + user = update.effective_user # type: Optional[User] + + try: + bot.unpinChatMessage(chat.id) + except BadRequest as excp: + if excp.message == "Chat_not_modified": + pass + else: + raise + sql.remove_mid(chat.id) + return ( + "<b>{}:</b>" + "\n#ᴜɴᴘɪɴɴᴇᴅ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + + +@run_async +@bot_admin +@can_pin +@user_admin +@loggable +def anti_channel_pin(bot: Bot, update: Update, args: List[str]) -> str: + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + + if not args: + update.effective_message.reply_text( + "ɪ ᴜɴᴅᴇʀsᴛᴀɴᴅ ᴏɴʟʏ :'on/yes' ᴏʀ 'off/no' only!" + ) + return "" + + if args[0].lower() in ("on", "yes"): + sql.add_acp_o(str(chat.id), True) + update.effective_message.reply_text( + "I'll try to unpin Telegram Channel messages!" + ) + return ( + "<b>{}:</b>" + "\n#ᴀɴᴛɪ_ᴄʜᴀɴɴᴇʟ_ᴘɪɴ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʜᴀs ᴛᴏɢɢʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ᴛᴏ <code>ᴏɴ</code>.".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + elif args[0].lower() in ("off", "no"): + sql.add_acp_o(str(chat.id), False) + update.effective_message.reply_text("I won't unpin Telegram Channel Messages!") + return ( + "<b>{}:</b>" + "\n#ᴀɴᴛɪ_ᴄʜᴀɴɴᴇʟ_ᴘɪɴ" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʜᴀs ᴛᴏɢɢʟᴇᴅ ᴀɴᴛɪ ᴄʜᴀɴɴᴇʟ ᴘɪɴ ᴛᴏ <code>ᴏғғ</code>.".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + else: + # idek what you're writing, say yes or no + update.effective_message.reply_text( + "ɪ ᴜɴᴅᴇʀsᴛᴀɴᴅ ᴏɴʟʏ 'on/yes' ᴏʀ 'off/no' only!" + ) + return "" + + +@run_async +@bot_admin +# @can_delete +@user_admin +@loggable +def clean_linked_channel(bot: Bot, update: Update, args: List[str]) -> str: + chat = update.effective_chat # type: Optional[Chat] + user = update.effective_user # type: Optional[User] + + if not args: + update.effective_message.reply_text("ɪ ᴜɴᴅᴇʀsᴛᴀɴᴅ 'on/yes' ᴏʀ 'off/no' only!") + return "" + + if args[0].lower() in ("on", "yes"): + sql.add_ldp_m(str(chat.id), True) + update.effective_message.reply_text( + "I'll ᴛʀʏ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴛᴇʟᴇɢʀᴀᴍ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇs!" + ) + return ( + "<b>{}:</b>" + "\n#ᴄʟᴇᴀɴ_ᴄʜᴀɴɴᴇʟ_ᴍᴇssᴀɢᴇs" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʜᴀs ᴛᴏɢɢʟᴇᴅ ᴅᴇʟᴇᴛᴇ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇs ᴛᴏ <code>ᴏɴ</code>.".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + elif args[0].lower() in ("off", "no"): + sql.add_ldp_m(str(chat.id), False) + update.effective_message.reply_text("I ᴡᴏɴ'ᴛ ᴅᴇʟᴇᴛᴇ ᴛᴇʟᴇɢʀᴀᴍ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇs!") + return ( + "<b>{}:</b>" + "\n#ᴄʟᴇᴀɴ_ᴄʜᴀɴɴᴇʟ_ᴍᴇssᴀɢᴇs" + "\n<b>ᴀᴅᴍɪɴ:</b> {}" + "\nʜᴀs ᴛᴏɢɢʟᴇᴅ ᴅᴇʟᴇᴛᴇ ᴄʜᴀɴɴᴇʟ ᴍᴇssᴀɢᴇs ᴛᴏ <code>ᴏғғ</code>.".format( + html.escape(chat.title), mention_html(user.id, user.first_name) + ) + ) + else: + # idek what you're writing, say yes or no + update.effective_message.reply_text("ɪ ᴜɴᴅᴇʀsᴛᴀɴᴅ 'on/yes' ᴏʀ 'off/no' only!") + return "" + + +@run_async +def amwltro_conreko(bot: Bot, update: Update): + chat = update.effective_chat # type: Optional[Chat] + message = update.effective_message # type: Optional[Message] + sctg = sql.get_current_settings(chat.id) + """we apparently do not receive any update for PINned messages + """ + if sctg and sctg.message_id != 0 and message.from_user.id == 777000: + if sctg.suacpmo: + try: + bot.unpin_chat_message(chat.id) + except: + pass + pin_chat_message(bot, chat.id, sctg.message_id, True) + if sctg.scldpmo: + try: + message.delete() + except: + pass + pin_chat_message(bot, chat.id, sctg.message_id, True) + + +def pin_chat_message(bot, chat_id, message_id, is_silent): + try: + bot.pinChatMessage(chat_id, message_id, disable_notification=is_silent) + except BadRequest as excp: + if excp.message == "Chat_not_modified": + pass + """else: + raise""" + + +__help__ = """ + +*ᴀᴅᴍɪɴ ᴏɴʟʏ:* + ⍟ /pin: `sɪʟᴇɴᴛʟʏ ᴘɪɴs ᴛʜᴇ ᴍᴇssᴀɢᴇ ʀᴇᴘʟɪᴇᴅ ᴛᴏ` + : ᴀᴅᴅ 'loud' ᴏʀ 'notify' ᴛᴏ ɢɪᴠᴇ ɴᴏᴛɪғs ᴛᴏ ᴜsᴇʀs + + ⍟ /unpin: `ᴜɴᴘɪɴs ᴛʜᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴘɪɴɴᴇᴅ ᴍᴇssᴀɢᴇ ` + + ⍟ /antichannelpin <yes/no/on/off>: `ᴅᴏɴ'ᴛ ʟᴇᴛ ᴛᴇʟᴇɢʀᴀᴍ ᴀᴜᴛᴏ-ᴘɪɴ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟs ` + + ⍟ /cleanlinked <yes/no/on/off>: `ᴅᴇʟᴇᴛᴇ ᴍᴇssᴀɢᴇs sᴇɴᴛ ʙʏ ᴛʜᴇ ʟɪɴᴋᴇᴅ ᴄʜᴀɴɴᴇʟ `. + +Note: +ᴡʜᴇɴ using ᴀɴᴛɪᴄʜᴀɴɴᴇʟ pins, ᴍᴀᴋᴇ sᴜʀᴇ ᴛᴏ ᴜsᴇ ᴛʜᴇ /unpin ᴄᴏᴍᴍᴀɴᴅ, +ɪɴsᴛᴇᴀᴅ ᴏғ ᴅᴏɪɴɢ ɪᴛ ᴍᴀɴᴜᴀʟʟʏ. + +ᴏᴛʜᴇʀᴡɪsᴇ, the ᴏʟᴅ message ᴡɪʟʟ ɢᴇᴛ ʀᴇ-ᴘɪɴɴᴇᴅ ᴡʜᴇɴ ᴛʜᴇ ᴄʜᴀɴɴᴇʟ sᴇɴᴅs ᴀɴʏ ᴍᴇssᴀɢᴇs. +""" + +__mod_name__ = "𝙿ɪɴs" + + +PIN_HANDLER = CommandHandler( + "pin", pin, pass_args=True, filters=Filters.chat_type.groups +) +UNPIN_HANDLER = CommandHandler("unpin", unpin, filters=Filters.chat_type.groups) +ATCPIN_HANDLER = CommandHandler( + "antichannelpin", anti_channel_pin, pass_args=True, filters=Filters.chat_type.groups +) +CLCLDC_HANDLER = CommandHandler( + "cleanlinked", + clean_linked_channel, + pass_args=True, + filters=Filters.chat_type.groups, +) +AMWLTRO_HANDLER = MessageHandler( + Filters.forwarded & Filters.chat_type.groups, amwltro_conreko, edited_updates=False +) + +dispatcher.add_handler(PIN_HANDLER) +dispatcher.add_handler(UNPIN_HANDLER) +dispatcher.add_handler(ATCPIN_HANDLER) +dispatcher.add_handler(CLCLDC_HANDLER) +dispatcher.add_handler(AMWLTRO_HANDLER, PMW_GROUP) diff --git "a/Exon/modules/sql/ABISHNOI COPYRIGHT \302\251" "b/Exon/modules/sql/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/modules/sql/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/modules/sql/__init__.py b/Exon/modules/sql/__init__.py new file mode 100644 index 00000000..b67ec5ba --- /dev/null +++ b/Exon/modules/sql/__init__.py @@ -0,0 +1,48 @@ +""" +MIT License +Copyright (c) 2022 Aʙɪsʜɴᴏɪ +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 sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import scoped_session, sessionmaker + +from Exon import DB_URI +from Exon import LOGGER as log + +if DB_URI and DB_URI.startswith("postgres://"): + DB_URI = DB_URI.replace("postgres://", "postgresql://", 1) + + +def start() -> scoped_session: + engine = create_engine(DB_URI, client_encoding="utf8") # , echo=DEBUG) + log.info("[PostgreSQL] Connecting to database......") + BASE.metadata.bind = engine + BASE.metadata.create_all(engine) + return scoped_session(sessionmaker(bind=engine, autoflush=False)) + + +BASE = declarative_base() +try: + SESSION: scoped_session = start() +except Exception as e: + log.exception(f"[PostgreSQL] Failed to connect due to {e}") + exit() + +log.info("[PostgreSQL] Connection successful, session started.") diff --git a/Exon/modules/sql/afk_redis.py b/Exon/modules/sql/afk_redis.py new file mode 100644 index 00000000..c59279cf --- /dev/null +++ b/Exon/modules/sql/afk_redis.py @@ -0,0 +1,46 @@ +""" +MIT License +Copyright (c) 2022 Aʙɪsʜɴᴏɪ +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 Exon import REDIS + + +def is_user_afk(userid): + rget = REDIS.get(f"is_afk_{userid}") + if rget: + return True + else: + return False + + +def start_afk(userid, reason): + REDIS.set(f"is_afk_{userid}", reason) + + +def afk_reason(userid): + return strb(REDIS.get(f"is_afk_{userid}")) + + +def end_afk(userid): + REDIS.delete(f"is_afk_{userid}") + return True + + +def strb(redis_string): + return str(redis_string) diff --git a/Exon/modules/sql/antichannel_sql.py b/Exon/modules/sql/antichannel_sql.py new file mode 100644 index 00000000..814ea8a3 --- /dev/null +++ b/Exon/modules/sql/antichannel_sql.py @@ -0,0 +1,89 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Boolean, Column +from sqlalchemy.sql.sqltypes import String + +from Exon.modules.sql import BASE, SESSION + + +class AntiChannelSettings(BASE): + __tablename__ = "anti_channel_settings" + + chat_id = Column(String(14), primary_key=True) + setting = Column(Boolean, default=False, nullable=False) + + def __init__(self, chat_id: int, disabled: bool): + self.chat_id = str(chat_id) + self.setting = disabled + + def __repr__(self): + return "<ᴀɴᴛɪғʟᴏᴏᴅ sᴇᴛᴛɪɴɢ {} ({})>".format(self.chat_id, self.setting) + + +AntiChannelSettings.__table__.create(checkfirst=True) +ANTICHANNEL_SETTING_LOCK = threading.RLock() + + +def enable_antichannel(chat_id: int): + with ANTICHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiChannelSettings(str(chat_id), True) + + chat.setting = True + SESSION.add(chat) + SESSION.commit() + + +def disable_antichannel(chat_id: int): + with ANTICHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiChannelSettings(str(chat_id), False) + + chat.setting = False + SESSION.add(chat) + SESSION.commit() + + +def antichannel_status(chat_id: int) -> bool: + with ANTICHANNEL_SETTING_LOCK: + d = SESSION.query(AntiChannelSettings).get(str(chat_id)) + if not d: + return False + return d.setting + + +def migrate_chat(old_chat_id, new_chat_id): + with ANTICHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiChannelSettings).get(str(old_chat_id)) + if chat: + chat.chat_id = new_chat_id + SESSION.add(chat) + + SESSION.commit() diff --git a/Exon/modules/sql/antiflood_sql.py b/Exon/modules/sql/antiflood_sql.py new file mode 100644 index 00000000..cbc76086 --- /dev/null +++ b/Exon/modules/sql/antiflood_sql.py @@ -0,0 +1,171 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Column, String, UnicodeText + +from Exon.modules.sql import BASE, SESSION + +DEF_COUNT = 1 +DEF_LIMIT = 0 +DEF_OBJ = (None, DEF_COUNT, DEF_LIMIT) + + +class FloodControl(BASE): + __tablename__ = "antiflood" + chat_id = Column(String(14), primary_key=True) + user_id = Column(BigInteger) + count = Column(BigInteger, default=DEF_COUNT) + limit = Column(BigInteger, default=DEF_LIMIT) + + def __init__(self, chat_id): + self.chat_id = str(chat_id) # ensure string + + def __repr__(self): + return "<ғʟᴏᴏᴅ ᴄᴏɴᴛʀᴏʟ ғᴏʀ %s>" % self.chat_id + + +class FloodSettings(BASE): + __tablename__ = "antiflood_settings" + chat_id = Column(String(14), primary_key=True) + flood_type = Column(BigInteger, default=1) + value = Column(UnicodeText, default="0") + + def __init__(self, chat_id, flood_type=1, value="0"): + self.chat_id = str(chat_id) + self.flood_type = flood_type + self.value = value + + def __repr__(self): + return "<{} ᴡɪʟʟ ᴇxᴇᴄᴜᴛɪɴɢ {} ғᴏʀ ғʟᴏᴏᴅ.>".format(self.chat_id, self.flood_type) + + +FloodControl.__table__.create(checkfirst=True) +FloodSettings.__table__.create(checkfirst=True) + +INSERTION_FLOOD_LOCK = threading.RLock() +INSERTION_FLOOD_SETTINGS_LOCK = threading.RLock() + +CHAT_FLOOD = {} + + +def set_flood(chat_id, amount): + with INSERTION_FLOOD_LOCK: + flood = SESSION.query(FloodControl).get(str(chat_id)) + if not flood: + flood = FloodControl(str(chat_id)) + + flood.user_id = None + flood.limit = amount + + CHAT_FLOOD[str(chat_id)] = (None, DEF_COUNT, amount) + + SESSION.add(flood) + SESSION.commit() + + +def update_flood(chat_id: str, user_id) -> bool: + if str(chat_id) not in CHAT_FLOOD: + return + + curr_user_id, count, limit = CHAT_FLOOD.get(str(chat_id), DEF_OBJ) + + if limit == 0: # no antiflood + return False + + if user_id != curr_user_id or user_id is None: # other user + CHAT_FLOOD[str(chat_id)] = (user_id, DEF_COUNT, limit) + return False + + count += 1 + if count > limit: # too many msgs, kick + CHAT_FLOOD[str(chat_id)] = (None, DEF_COUNT, limit) + return True + + # default -> update + CHAT_FLOOD[str(chat_id)] = (user_id, count, limit) + return False + + +def get_flood_limit(chat_id): + return CHAT_FLOOD.get(str(chat_id), DEF_OBJ)[2] + + +def set_flood_strength(chat_id, flood_type, value): + # ғᴏʀ ғʟᴏᴏᴅ_ᴛʏᴘᴇ + # 1 = ban + # 2 = kick + # 3 = mute + # 4 = tban + # 5 = tmute + # 6 = ᴅᴍᴜᴛᴇ sᴏᴏɴ + with INSERTION_FLOOD_SETTINGS_LOCK: + curr_setting = SESSION.query(FloodSettings).get(str(chat_id)) + if not curr_setting: + curr_setting = FloodSettings( + chat_id, + flood_type=int(flood_type), + value=value, + ) + + curr_setting.flood_type = int(flood_type) + curr_setting.value = str(value) + + SESSION.add(curr_setting) + SESSION.commit() + + +def get_flood_setting(chat_id): + try: + setting = SESSION.query(FloodSettings).get(str(chat_id)) + if setting: + return setting.flood_type, setting.value + return 1, "0" + + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with INSERTION_FLOOD_LOCK: + flood = SESSION.query(FloodControl).get(str(old_chat_id)) + if flood: + CHAT_FLOOD[str(new_chat_id)] = CHAT_FLOOD.get(str(old_chat_id), DEF_OBJ) + flood.chat_id = str(new_chat_id) + SESSION.commit() + + SESSION.close() + + +def __load_flood_settings(): + global CHAT_FLOOD + try: + all_chats = SESSION.query(FloodControl).all() + CHAT_FLOOD = {chat.chat_id: (None, DEF_COUNT, chat.limit) for chat in all_chats} + finally: + SESSION.close() + + +__load_flood_settings() diff --git a/Exon/modules/sql/antilinkedchannel_sql.py b/Exon/modules/sql/antilinkedchannel_sql.py new file mode 100644 index 00000000..cf795f7a --- /dev/null +++ b/Exon/modules/sql/antilinkedchannel_sql.py @@ -0,0 +1,142 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Boolean, Column +from sqlalchemy.sql.sqltypes import String + +from Exon.modules.sql import BASE, SESSION + + +class AntiLinkedChannelSettings(BASE): + __tablename__ = "anti_linked_channel_settings" + + chat_id = Column(String(14), primary_key=True) + setting = Column(Boolean, default=False, nullable=False) + + def __init__(self, chat_id: int, disabled: bool): + self.chat_id = str(chat_id) + self.setting = disabled + + def __repr__(self): + return "<Antilinked setting {} ({})>".format(self.chat_id, self.setting) + + +class AntiPinChannelSettings(BASE): + __tablename__ = "anti_pin_channel_settings" + + chat_id = Column(String(14), primary_key=True) + setting = Column(Boolean, default=False, nullable=False) + + def __init__(self, chat_id: int, disabled: bool): + self.chat_id = str(chat_id) + self.setting = disabled + + def __repr__(self): + return "<ᴀɴᴛɪᴘɪɴ sᴇᴛᴛɪɴɢ {} ({})>".format(self.chat_id, self.setting) + + +AntiLinkedChannelSettings.__table__.create(checkfirst=True) +ANTI_LINKED_CHANNEL_SETTING_LOCK = threading.RLock() + +AntiPinChannelSettings.__table__.create(checkfirst=True) +ANTI_PIN_CHANNEL_SETTING_LOCK = threading.RLock() + + +def enable_linked(chat_id: int): + with ANTI_LINKED_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiLinkedChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiLinkedChannelSettings(chat_id, True) + + chat.setting = True + SESSION.add(chat) + SESSION.commit() + + +def enable_pin(chat_id: int): + with ANTI_PIN_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiPinChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiPinChannelSettings(chat_id, True) + + chat.setting = True + SESSION.add(chat) + SESSION.commit() + + +def disable_linked(chat_id: int): + with ANTI_LINKED_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiLinkedChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiLinkedChannelSettings(chat_id, False) + + chat.setting = False + SESSION.add(chat) + SESSION.commit() + + +def disable_pin(chat_id: int): + with ANTI_PIN_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiPinChannelSettings).get(str(chat_id)) + if not chat: + chat = AntiPinChannelSettings(chat_id, False) + + chat.setting = False + SESSION.add(chat) + SESSION.commit() + + +def status_linked(chat_id: int) -> bool: + with ANTI_LINKED_CHANNEL_SETTING_LOCK: + d = SESSION.query(AntiLinkedChannelSettings).get(str(chat_id)) + if not d: + return False + return d.setting + + +def status_pin(chat_id: int) -> bool: + with ANTI_PIN_CHANNEL_SETTING_LOCK: + d = SESSION.query(AntiPinChannelSettings).get(str(chat_id)) + if not d: + return False + return d.setting + + +def migrate_chat(old_chat_id, new_chat_id): + with ANTI_LINKED_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiLinkedChannelSettings).get(str(old_chat_id)) + if chat: + chat.chat_id = new_chat_id + SESSION.add(chat) + + SESSION.commit() + with ANTI_PIN_CHANNEL_SETTING_LOCK: + chat = SESSION.query(AntiPinChannelSettings).get(str(old_chat_id)) + if chat: + chat.chat_id = new_chat_id + SESSION.add(chat) + + SESSION.commit() diff --git a/Exon/modules/sql/approve_sql.py b/Exon/modules/sql/approve_sql.py new file mode 100644 index 00000000..7d4d51a0 --- /dev/null +++ b/Exon/modules/sql/approve_sql.py @@ -0,0 +1,85 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Column, String + +from Exon.modules.sql import BASE, SESSION + + +class Approvals(BASE): + __tablename__ = "approval" + chat_id = Column(String(14), primary_key=True) + user_id = Column(BigInteger, primary_key=True) + + def __init__(self, chat_id, user_id): + self.chat_id = str(chat_id) # ensure string + self.user_id = user_id + + def __repr__(self): + return "<ᴀᴘᴘʀᴏᴠᴇ %s>" % self.user_id + + +Approvals.__table__.create(checkfirst=True) + +APPROVE_INSERTION_LOCK = threading.RLock() + + +def approve(chat_id, user_id): + with APPROVE_INSERTION_LOCK: + approve_user = Approvals(str(chat_id), user_id) + SESSION.add(approve_user) + SESSION.commit() + + +def is_approved(chat_id, user_id): + try: + return SESSION.query(Approvals).get((str(chat_id), user_id)) + finally: + SESSION.close() + + +def disapprove(chat_id, user_id): + with APPROVE_INSERTION_LOCK: + disapprove_user = SESSION.query(Approvals).get((str(chat_id), user_id)) + if disapprove_user: + SESSION.delete(disapprove_user) + SESSION.commit() + return True + else: + SESSION.close() + return False + + +def list_approved(chat_id): + try: + return ( + SESSION.query(Approvals) + .filter(Approvals.chat_id == str(chat_id)) + .order_by(Approvals.user_id.asc()) + .all() + ) + finally: + SESSION.close() diff --git a/Exon/modules/sql/blacklist_sql.py b/Exon/modules/sql/blacklist_sql.py new file mode 100644 index 00000000..ebbd294c --- /dev/null +++ b/Exon/modules/sql/blacklist_sql.py @@ -0,0 +1,223 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Column, String, UnicodeText, distinct, func + +from Exon.modules.sql import BASE, SESSION + + +class BlackListFilters(BASE): + __tablename__ = "blacklist" + chat_id = Column(String(14), primary_key=True) + trigger = Column(UnicodeText, primary_key=True, nullable=False) + + def __init__(self, chat_id, trigger): + self.chat_id = str(chat_id) # ensure string + self.trigger = trigger + + def __repr__(self): + return "<ʙʟᴀᴄᴋʟɪsᴛ ғɪʟᴛᴇʀ '%s' ғᴏʀ %s>" % (self.trigger, self.chat_id) + + def __eq__(self, other): + return bool( + isinstance(other, BlackListFilters) + and self.chat_id == other.chat_id + and self.trigger == other.trigger, + ) + + +class BlacklistSettings(BASE): + __tablename__ = "blacklist_settings" + chat_id = Column(String(14), primary_key=True) + blacklist_type = Column(BigInteger, default=1) + value = Column(UnicodeText, default="0") + + def __init__(self, chat_id, blacklist_type=1, value="0"): + self.chat_id = str(chat_id) + self.blacklist_type = blacklist_type + self.value = value + + def __repr__(self): + return "<{} ᴡɪʟʟ ᴇxᴇᴄᴜᴛɪɴɢ {} ғᴏʀ ʙʟᴀᴄᴋʟɪsᴛ ᴛʀɪɢɢᴇʀ.>".format( + self.chat_id, + self.blacklist_type, + ) + + +BlackListFilters.__table__.create(checkfirst=True) +BlacklistSettings.__table__.create(checkfirst=True) + +BLACKLIST_FILTER_INSERTION_LOCK = threading.RLock() +BLACKLIST_SETTINGS_INSERTION_LOCK = threading.RLock() + +CHAT_BLACKLISTS = {} +CHAT_SETTINGS_BLACKLISTS = {} + + +def add_to_blacklist(chat_id, trigger): + with BLACKLIST_FILTER_INSERTION_LOCK: + blacklist_filt = BlackListFilters(str(chat_id), trigger) + + SESSION.merge(blacklist_filt) # merge to avoid duplicate key issues + SESSION.commit() + global CHAT_BLACKLISTS + if CHAT_BLACKLISTS.get(str(chat_id), set()) == set(): + CHAT_BLACKLISTS[str(chat_id)] = {trigger} + else: + CHAT_BLACKLISTS.get(str(chat_id), set()).add(trigger) + + +def rm_from_blacklist(chat_id, trigger): + with BLACKLIST_FILTER_INSERTION_LOCK: + blacklist_filt = SESSION.query(BlackListFilters).get((str(chat_id), trigger)) + if blacklist_filt: + if trigger in CHAT_BLACKLISTS.get(str(chat_id), set()): # sanity check + CHAT_BLACKLISTS.get(str(chat_id), set()).remove(trigger) + + SESSION.delete(blacklist_filt) + SESSION.commit() + return True + + SESSION.close() + return False + + +def get_chat_blacklist(chat_id): + return CHAT_BLACKLISTS.get(str(chat_id), set()) + + +def num_blacklist_filters(): + try: + return SESSION.query(BlackListFilters).count() + finally: + SESSION.close() + + +def num_blacklist_chat_filters(chat_id): + try: + return ( + SESSION.query(BlackListFilters.chat_id) + .filter(BlackListFilters.chat_id == str(chat_id)) + .count() + ) + finally: + SESSION.close() + + +def num_blacklist_filter_chats(): + try: + return SESSION.query(func.count(distinct(BlackListFilters.chat_id))).scalar() + finally: + SESSION.close() + + +def set_blacklist_strength(chat_id, blacklist_type, value): + # for blacklist_type + # 0 = nothing + # 1 = delete + # 2 = warn + # 3 = mute + # 4 = kick + # 5 = ban + # 6 = tban + # 7 = tmute + with BLACKLIST_SETTINGS_INSERTION_LOCK: + global CHAT_SETTINGS_BLACKLISTS + curr_setting = SESSION.query(BlacklistSettings).get(str(chat_id)) + if not curr_setting: + curr_setting = BlacklistSettings( + chat_id, + blacklist_type=int(blacklist_type), + value=value, + ) + + curr_setting.blacklist_type = int(blacklist_type) + curr_setting.value = str(value) + CHAT_SETTINGS_BLACKLISTS[str(chat_id)] = { + "blacklist_type": int(blacklist_type), + "value": value, + } + + SESSION.add(curr_setting) + SESSION.commit() + + +def get_blacklist_setting(chat_id): + try: + setting = CHAT_SETTINGS_BLACKLISTS.get(str(chat_id)) + if setting: + return setting["blacklist_type"], setting["value"] + return 1, "0" + + finally: + SESSION.close() + + +def __load_chat_blacklists(): + global CHAT_BLACKLISTS + try: + chats = SESSION.query(BlackListFilters.chat_id).distinct().all() + for (chat_id,) in chats: # remove tuple by ( ,) + CHAT_BLACKLISTS[chat_id] = [] + + all_filters = SESSION.query(BlackListFilters).all() + for x in all_filters: + CHAT_BLACKLISTS[x.chat_id] += [x.trigger] + + CHAT_BLACKLISTS = {x: set(y) for x, y in CHAT_BLACKLISTS.items()} + + finally: + SESSION.close() + + +def __load_chat_settings_blacklists(): + global CHAT_SETTINGS_BLACKLISTS + try: + chats_settings = SESSION.query(BlacklistSettings).all() + for x in chats_settings: # remove tuple by ( ,) + CHAT_SETTINGS_BLACKLISTS[x.chat_id] = { + "blacklist_type": x.blacklist_type, + "value": x.value, + } + + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with BLACKLIST_FILTER_INSERTION_LOCK: + chat_filters = ( + SESSION.query(BlackListFilters) + .filter(BlackListFilters.chat_id == str(old_chat_id)) + .all() + ) + for filt in chat_filters: + filt.chat_id = str(new_chat_id) + SESSION.commit() + + +__load_chat_blacklists() +__load_chat_settings_blacklists() diff --git a/Exon/modules/sql/blacklistusers_sql.py b/Exon/modules/sql/blacklistusers_sql.py new file mode 100644 index 00000000..97889e3a --- /dev/null +++ b/Exon/modules/sql/blacklistusers_sql.py @@ -0,0 +1,90 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String, UnicodeText + +from Exon.modules.sql import BASE, SESSION + + +class BlacklistUsers(BASE): + __tablename__ = "blacklistusers" + user_id = Column(String(14), primary_key=True) + reason = Column(UnicodeText) + + def __init__(self, user_id, reason=None): + self.user_id = user_id + self.reason = reason + + +BlacklistUsers.__table__.create(checkfirst=True) + +BLACKLIST_LOCK = threading.RLock() +BLACKLIST_USERS = set() + + +def blacklist_user(user_id, reason=None): + with BLACKLIST_LOCK: + user = SESSION.query(BlacklistUsers).get(str(user_id)) + if not user: + user = BlacklistUsers(str(user_id), reason) + else: + user.reason = reason + + SESSION.add(user) + SESSION.commit() + __load_blacklist_userid_list() + + +def unblacklist_user(user_id): + with BLACKLIST_LOCK: + user = SESSION.query(BlacklistUsers).get(str(user_id)) + if user: + SESSION.delete(user) + + SESSION.commit() + __load_blacklist_userid_list() + + +def get_reason(user_id): + user = SESSION.query(BlacklistUsers).get(str(user_id)) + rep = user.reason if user else "" + SESSION.close() + return rep + + +def is_user_blacklisted(user_id): + return user_id in BLACKLIST_USERS + + +def __load_blacklist_userid_list(): + global BLACKLIST_USERS + try: + BLACKLIST_USERS = {int(x.user_id) for x in SESSION.query(BlacklistUsers).all()} + finally: + SESSION.close() + + +__load_blacklist_userid_list() diff --git a/Exon/modules/sql/blsticker_sql.py b/Exon/modules/sql/blsticker_sql.py new file mode 100644 index 00000000..82670e97 --- /dev/null +++ b/Exon/modules/sql/blsticker_sql.py @@ -0,0 +1,223 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Column, String, UnicodeText, distinct, func + +from Exon.modules.sql import BASE, SESSION + + +class StickersFilters(BASE): + __tablename__ = "blacklist_stickers" + chat_id = Column(String(14), primary_key=True) + trigger = Column(UnicodeText, primary_key=True, nullable=False) + + def __init__(self, chat_id, trigger): + self.chat_id = str(chat_id) # ensure string + self.trigger = trigger + + def __repr__(self): + return "<sᴛɪᴄᴋᴇʀs ғɪʟᴛᴇʀ '%s' ғᴏʀ %s>" % (self.trigger, self.chat_id) + + def __eq__(self, other): + return bool( + isinstance(other, StickersFilters) + and self.chat_id == other.chat_id + and self.trigger == other.trigger, + ) + + +class StickerSettings(BASE): + __tablename__ = "blsticker_settings" + chat_id = Column(String(14), primary_key=True) + blacklist_type = Column(BigInteger, default=1) + value = Column(UnicodeText, default="0") + + def __init__(self, chat_id, blacklist_type=1, value="0"): + self.chat_id = str(chat_id) + self.blacklist_type = blacklist_type + self.value = value + + def __repr__(self): + return "<{} ᴡɪʟʟ ᴇxᴇᴄᴜᴛɪɴɢ {} ғᴏʀ ʙʟᴀᴄᴋʟɪsᴛ ᴛʀɪɢɢᴇʀ.>".format( + self.chat_id, + self.blacklist_type, + ) + + +StickersFilters.__table__.create(checkfirst=True) +StickerSettings.__table__.create(checkfirst=True) + +STICKERS_FILTER_INSERTION_LOCK = threading.RLock() +STICKSET_FILTER_INSERTION_LOCK = threading.RLock() + +CHAT_STICKERS = {} +CHAT_BLSTICK_BLACKLISTS = {} + + +def add_to_stickers(chat_id, trigger): + with STICKERS_FILTER_INSERTION_LOCK: + stickers_filt = StickersFilters(str(chat_id), trigger) + + SESSION.merge(stickers_filt) # merge to avoid duplicate key issues + SESSION.commit() + global CHAT_STICKERS + if CHAT_STICKERS.get(str(chat_id), set()) == set(): + CHAT_STICKERS[str(chat_id)] = {trigger} + else: + CHAT_STICKERS.get(str(chat_id), set()).add(trigger) + + +def rm_from_stickers(chat_id, trigger): + with STICKERS_FILTER_INSERTION_LOCK: + stickers_filt = SESSION.query(StickersFilters).get((str(chat_id), trigger)) + if stickers_filt: + if trigger in CHAT_STICKERS.get(str(chat_id), set()): # sanity check + CHAT_STICKERS.get(str(chat_id), set()).remove(trigger) + + SESSION.delete(stickers_filt) + SESSION.commit() + return True + + SESSION.close() + return False + + +def get_chat_stickers(chat_id): + return CHAT_STICKERS.get(str(chat_id), set()) + + +def num_stickers_filters(): + try: + return SESSION.query(StickersFilters).count() + finally: + SESSION.close() + + +def num_stickers_chat_filters(chat_id): + try: + return ( + SESSION.query(StickersFilters.chat_id) + .filter(StickersFilters.chat_id == str(chat_id)) + .count() + ) + finally: + SESSION.close() + + +def num_stickers_filter_chats(): + try: + return SESSION.query(func.count(distinct(StickersFilters.chat_id))).scalar() + finally: + SESSION.close() + + +def set_blacklist_strength(chat_id, blacklist_type, value): + # for blacklist_type + # 0 = nothing + # 1 = delete + # 2 = warn + # 3 = mute + # 4 = kick + # 5 = ban + # 6 = tban + # 7 = tmute + with STICKSET_FILTER_INSERTION_LOCK: + global CHAT_BLSTICK_BLACKLISTS + curr_setting = SESSION.query(StickerSettings).get(str(chat_id)) + if not curr_setting: + curr_setting = StickerSettings( + chat_id, + blacklist_type=int(blacklist_type), + value=value, + ) + + curr_setting.blacklist_type = int(blacklist_type) + curr_setting.value = str(value) + CHAT_BLSTICK_BLACKLISTS[str(chat_id)] = { + "blacklist_type": int(blacklist_type), + "value": value, + } + + SESSION.add(curr_setting) + SESSION.commit() + + +def get_blacklist_setting(chat_id): + try: + setting = CHAT_BLSTICK_BLACKLISTS.get(str(chat_id)) + if setting: + return setting["blacklist_type"], setting["value"] + return 1, "0" + + finally: + SESSION.close() + + +def __load_CHAT_STICKERS(): + global CHAT_STICKERS + try: + chats = SESSION.query(StickersFilters.chat_id).distinct().all() + for (chat_id,) in chats: # remove tuple by ( ,) + CHAT_STICKERS[chat_id] = [] + + all_filters = SESSION.query(StickersFilters).all() + for x in all_filters: + CHAT_STICKERS[x.chat_id] += [x.trigger] + + CHAT_STICKERS = {x: set(y) for x, y in CHAT_STICKERS.items()} + + finally: + SESSION.close() + + +def __load_chat_stickerset_blacklists(): + global CHAT_BLSTICK_BLACKLISTS + try: + chats_settings = SESSION.query(StickerSettings).all() + for x in chats_settings: # remove tuple by ( ,) + CHAT_BLSTICK_BLACKLISTS[x.chat_id] = { + "blacklist_type": x.blacklist_type, + "value": x.value, + } + + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with STICKERS_FILTER_INSERTION_LOCK: + chat_filters = ( + SESSION.query(StickersFilters) + .filter(StickersFilters.chat_id == str(old_chat_id)) + .all() + ) + for filt in chat_filters: + filt.chat_id = str(new_chat_id) + SESSION.commit() + + +__load_CHAT_STICKERS() +__load_chat_stickerset_blacklists() diff --git a/Exon/modules/sql/cleaner_sql.py b/Exon/modules/sql/cleaner_sql.py new file mode 100644 index 00000000..81ba9141 --- /dev/null +++ b/Exon/modules/sql/cleaner_sql.py @@ -0,0 +1,227 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Boolean, Column, UnicodeText + +from Exon.modules.sql import BASE, SESSION + + +class CleanerBlueTextChatSettings(BASE): + __tablename__ = "cleaner_bluetext_chat_setting" + chat_id = Column(UnicodeText, primary_key=True) + is_enable = Column(Boolean, default=False) + + def __init__(self, chat_id, is_enable): + self.chat_id = chat_id + self.is_enable = is_enable + + def __repr__(self): + return "ᴄʟᴇᴀɴ ʙʟᴜᴇ ᴛᴇxᴛ ғᴏʀ {}".format(self.chat_id) + + +class CleanerBlueTextChat(BASE): + __tablename__ = "cleaner_bluetext_chat_ignore_commands" + chat_id = Column(UnicodeText, primary_key=True) + command = Column(UnicodeText, primary_key=True) + + def __init__(self, chat_id, command): + self.chat_id = chat_id + self.command = command + + +class CleanerBlueTextGlobal(BASE): + __tablename__ = "cleaner_bluetext_global_ignore_commands" + command = Column(UnicodeText, primary_key=True) + + def __init__(self, command): + self.command = command + + +CleanerBlueTextChatSettings.__table__.create(checkfirst=True) +CleanerBlueTextChat.__table__.create(checkfirst=True) +CleanerBlueTextGlobal.__table__.create(checkfirst=True) + +CLEANER_CHAT_SETTINGS = threading.RLock() +CLEANER_CHAT_LOCK = threading.RLock() +CLEANER_GLOBAL_LOCK = threading.RLock() + +CLEANER_CHATS = {} +GLOBAL_IGNORE_COMMANDS = set() + + +def set_cleanbt(chat_id, is_enable): + with CLEANER_CHAT_SETTINGS: + curr = SESSION.query(CleanerBlueTextChatSettings).get(str(chat_id)) + + if not curr: + curr = CleanerBlueTextChatSettings(str(chat_id), is_enable) + else: + curr.is_enabled = is_enable + + if str(chat_id) not in CLEANER_CHATS: + CLEANER_CHATS.setdefault( + str(chat_id), {"setting": False, "commands": set()} + ) + + CLEANER_CHATS[str(chat_id)]["setting"] = is_enable + + SESSION.add(curr) + SESSION.commit() + + +def chat_ignore_command(chat_id, ignore): + ignore = ignore.lower() + with CLEANER_CHAT_LOCK: + ignored = SESSION.query(CleanerBlueTextChat).get((str(chat_id), ignore)) + + if not ignored: + + if str(chat_id) not in CLEANER_CHATS: + CLEANER_CHATS.setdefault( + str(chat_id), {"setting": False, "commands": set()} + ) + + CLEANER_CHATS[str(chat_id)]["commands"].add(ignore) + + ignored = CleanerBlueTextChat(str(chat_id), ignore) + SESSION.add(ignored) + SESSION.commit() + return True + SESSION.close() + return False + + +def chat_unignore_command(chat_id, unignore): + unignore = unignore.lower() + with CLEANER_CHAT_LOCK: + unignored = SESSION.query(CleanerBlueTextChat).get((str(chat_id), unignore)) + + if unignored: + + if str(chat_id) not in CLEANER_CHATS: + CLEANER_CHATS.setdefault( + str(chat_id), {"setting": False, "commands": set()} + ) + if unignore in CLEANER_CHATS.get(str(chat_id)).get("commands"): + CLEANER_CHATS[str(chat_id)]["commands"].remove(unignore) + + SESSION.delete(unignored) + SESSION.commit() + return True + + SESSION.close() + return False + + +def global_ignore_command(command): + command = command.lower() + with CLEANER_GLOBAL_LOCK: + ignored = SESSION.query(CleanerBlueTextGlobal).get(str(command)) + + if not ignored: + GLOBAL_IGNORE_COMMANDS.add(command) + + ignored = CleanerBlueTextGlobal(str(command)) + SESSION.add(ignored) + SESSION.commit() + return True + + SESSION.close() + return False + + +def global_unignore_command(command): + command = command.lower() + with CLEANER_GLOBAL_LOCK: + unignored = SESSION.query(CleanerBlueTextGlobal).get(str(command)) + + if unignored: + if command in GLOBAL_IGNORE_COMMANDS: + GLOBAL_IGNORE_COMMANDS.remove(command) + + SESSION.delete(command) + SESSION.commit() + return True + + SESSION.close() + return False + + +def is_command_ignored(chat_id, command): + if command.lower() in GLOBAL_IGNORE_COMMANDS: + return True + + if str(chat_id) in CLEANER_CHATS and command.lower() in CLEANER_CHATS.get( + str(chat_id) + ).get("commands"): + return True + + return False + + +def is_enabled(chat_id): + if str(chat_id) in CLEANER_CHATS: + return CLEANER_CHATS.get(str(chat_id)).get("setting") + + return False + + +def get_all_ignored(chat_id): + if str(chat_id) in CLEANER_CHATS: + LOCAL_IGNORE_COMMANDS = CLEANER_CHATS.get(str(chat_id)).get("commands") + else: + LOCAL_IGNORE_COMMANDS = set() + + return GLOBAL_IGNORE_COMMANDS, LOCAL_IGNORE_COMMANDS + + +def __load_cleaner_list(): + global GLOBAL_IGNORE_COMMANDS + global CLEANER_CHATS + + try: + GLOBAL_IGNORE_COMMANDS = { + x.command for x in SESSION.query(CleanerBlueTextGlobal).all() + } + finally: + SESSION.close() + + try: + for x in SESSION.query(CleanerBlueTextChatSettings).all(): + CLEANER_CHATS.setdefault(x.chat_id, {"setting": False, "commands": set()}) + CLEANER_CHATS[x.chat_id]["setting"] = x.is_enable + finally: + SESSION.close() + + try: + for x in SESSION.query(CleanerBlueTextChat).all(): + CLEANER_CHATS.setdefault(x.chat_id, {"setting": False, "commands": set()}) + CLEANER_CHATS[x.chat_id]["commands"].add(x.command) + finally: + SESSION.close() + + +__load_cleaner_list() diff --git a/Exon/modules/sql/connection_sql.py b/Exon/modules/sql/connection_sql.py new file mode 100644 index 00000000..8105833e --- /dev/null +++ b/Exon/modules/sql/connection_sql.py @@ -0,0 +1,230 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading +import time +from typing import Union + +from sqlalchemy import BigInteger, Boolean, Column, String, UnicodeText + +from Exon.modules.sql import BASE, SESSION + + +class ChatAccessConnectionSettings(BASE): + __tablename__ = "access_connection" + chat_id = Column(String(14), primary_key=True) + allow_connect_to_chat = Column(Boolean, default=True) + + def __init__(self, chat_id, allow_connect_to_chat): + self.chat_id = str(chat_id) + self.allow_connect_to_chat = str(allow_connect_to_chat) + + def __repr__(self): + return "<ᴄʜᴀᴛ ᴀᴄᴄᴇss sᴇᴛᴛɪɴɢs ({}) is {}>".format( + self.chat_id, + self.allow_connect_to_chat, + ) + + +class Connection(BASE): + __tablename__ = "connection" + user_id = Column(BigInteger, primary_key=True) + chat_id = Column(String(14)) + + def __init__(self, user_id, chat_id): + self.user_id = user_id + self.chat_id = str(chat_id) # Ensure String + + +class ConnectionHistory(BASE): + __tablename__ = "connection_history" + user_id = Column(BigInteger, primary_key=True) + chat_id = Column(String(14), primary_key=True) + chat_name = Column(UnicodeText) + conn_time = Column(BigInteger) + + def __init__(self, user_id, chat_id, chat_name, conn_time): + self.user_id = user_id + self.chat_id = str(chat_id) + self.chat_name = str(chat_name) + self.conn_time = int(conn_time) + + def __repr__(self): + return "<ᴄᴏɴɴᴇᴄᴛɪᴏɴ ᴜsᴇʀ {} ʜɪsᴛᴏʀʏ {}>".format(self.user_id, self.chat_id) + + +ChatAccessConnectionSettings.__table__.create(checkfirst=True) +Connection.__table__.create(checkfirst=True) +ConnectionHistory.__table__.create(checkfirst=True) + +CHAT_ACCESS_LOCK = threading.RLock() +CONNECTION_INSERTION_LOCK = threading.RLock() +CONNECTION_HISTORY_LOCK = threading.RLock() + +HISTORY_CONNECT = {} + + +def allow_connect_to_chat(chat_id: Union[str, int]) -> bool: + try: + chat_setting = SESSION.query(ChatAccessConnectionSettings).get(str(chat_id)) + if chat_setting: + return chat_setting.allow_connect_to_chat + return False + finally: + SESSION.close() + + +def set_allow_connect_to_chat(chat_id: Union[int, str], setting: bool): + with CHAT_ACCESS_LOCK: + chat_setting = SESSION.query(ChatAccessConnectionSettings).get(str(chat_id)) + if not chat_setting: + chat_setting = ChatAccessConnectionSettings(chat_id, setting) + + chat_setting.allow_connect_to_chat = setting + SESSION.add(chat_setting) + SESSION.commit() + + +def connect(user_id, chat_id): + with CONNECTION_INSERTION_LOCK: + prev = SESSION.query(Connection).get((int(user_id))) + if prev: + SESSION.delete(prev) + connect_to_chat = Connection(int(user_id), chat_id) + SESSION.add(connect_to_chat) + SESSION.commit() + return True + + +def get_connected_chat(user_id): + try: + return SESSION.query(Connection).get((int(user_id))) + finally: + SESSION.close() + + +def curr_connection(chat_id): + try: + return SESSION.query(Connection).get((str(chat_id))) + finally: + SESSION.close() + + +def disconnect(user_id): + with CONNECTION_INSERTION_LOCK: + disconnect = SESSION.query(Connection).get((int(user_id))) + if disconnect: + SESSION.delete(disconnect) + SESSION.commit() + return True + SESSION.close() + return False + + +def add_history_conn(user_id, chat_id, chat_name): + global HISTORY_CONNECT + with CONNECTION_HISTORY_LOCK: + conn_time = int(time.time()) + if HISTORY_CONNECT.get(int(user_id)): + counting = ( + SESSION.query(ConnectionHistory.user_id) + .filter(ConnectionHistory.user_id == str(user_id)) + .count() + ) + getchat_id = { + HISTORY_CONNECT[int(user_id)][x]["chat_id"]: x + for x in HISTORY_CONNECT[int(user_id)] + } + + if chat_id in getchat_id: + todeltime = getchat_id[str(chat_id)] + delold = SESSION.query(ConnectionHistory).get( + (int(user_id), str(chat_id)), + ) + if delold: + SESSION.delete(delold) + HISTORY_CONNECT[int(user_id)].pop(todeltime) + elif counting >= 5: + todel = list(HISTORY_CONNECT[int(user_id)]) + todel.reverse() + todel = todel[4:] + for x in todel: + chat_old = HISTORY_CONNECT[int(user_id)][x]["chat_id"] + delold = SESSION.query(ConnectionHistory).get( + (int(user_id), str(chat_old)), + ) + if delold: + SESSION.delete(delold) + HISTORY_CONNECT[int(user_id)].pop(x) + else: + HISTORY_CONNECT[int(user_id)] = {} + delold = SESSION.query(ConnectionHistory).get((int(user_id), str(chat_id))) + if delold: + SESSION.delete(delold) + history = ConnectionHistory(int(user_id), str(chat_id), chat_name, conn_time) + SESSION.add(history) + SESSION.commit() + HISTORY_CONNECT[int(user_id)][conn_time] = { + "chat_name": chat_name, + "chat_id": str(chat_id), + } + + +def get_history_conn(user_id): + if not HISTORY_CONNECT.get(int(user_id)): + HISTORY_CONNECT[int(user_id)] = {} + return HISTORY_CONNECT[int(user_id)] + + +def clear_history_conn(user_id): + global HISTORY_CONNECT + todel = list(HISTORY_CONNECT[int(user_id)]) + for x in todel: + chat_old = HISTORY_CONNECT[int(user_id)][x]["chat_id"] + delold = SESSION.query(ConnectionHistory).get((int(user_id), str(chat_old))) + if delold: + SESSION.delete(delold) + HISTORY_CONNECT[int(user_id)].pop(x) + SESSION.commit() + return True + + +def __load_user_history(): + global HISTORY_CONNECT + try: + qall = SESSION.query(ConnectionHistory).all() + HISTORY_CONNECT = {} + for x in qall: + check = HISTORY_CONNECT.get(x.user_id) + if check is None: + HISTORY_CONNECT[x.user_id] = {} + HISTORY_CONNECT[x.user_id][x.conn_time] = { + "chat_name": x.chat_name, + "chat_id": x.chat_id, + } + finally: + SESSION.close() + + +__load_user_history() diff --git a/Exon/modules/sql/cust_filters_sql.py b/Exon/modules/sql/cust_filters_sql.py new file mode 100644 index 00000000..2dcadfbc --- /dev/null +++ b/Exon/modules/sql/cust_filters_sql.py @@ -0,0 +1,422 @@ +""" +MIT License +Copyright (c) 2022 Aʙɪsʜɴᴏɪ +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 threading + +from sqlalchemy import Boolean, Column, Integer, String, UnicodeText, distinct, func + +from Exon.modules.helper_funcs.msg_types import Types +from Exon.modules.sql import BASE, SESSION + + +class CustomFilters(BASE): + __tablename__ = "cust_filters" + chat_id = Column(String(14), primary_key=True) + keyword = Column(UnicodeText, primary_key=True, nullable=False) + reply = Column(UnicodeText, nullable=False) + is_sticker = Column(Boolean, nullable=False, default=False) + is_document = Column(Boolean, nullable=False, default=False) + is_image = Column(Boolean, nullable=False, default=False) + is_audio = Column(Boolean, nullable=False, default=False) + is_voice = Column(Boolean, nullable=False, default=False) + is_video = Column(Boolean, nullable=False, default=False) + + has_buttons = Column(Boolean, nullable=False, default=False) + # NOTE: Here for legacy purposes, to ensure older filters don't mess up. + has_markdown = Column(Boolean, nullable=False, default=False) + + # NEW FILTER + # alter table cust_filters add column reply_text text; + # alter table cust_filters add column file_type integer default 1; + # alter table cust_filters add column file_id text; + reply_text = Column(UnicodeText) + file_type = Column(Integer, nullable=False, default=1) + file_id = Column(UnicodeText, default=None) + + def __init__( + self, + chat_id, + keyword, + reply, + is_sticker=False, + is_document=False, + is_image=False, + is_audio=False, + is_voice=False, + is_video=False, + has_buttons=False, + reply_text=None, + file_type=1, + file_id=None, + ): + self.chat_id = str(chat_id) # ensure string + self.keyword = keyword + self.reply = reply + self.is_sticker = is_sticker + self.is_document = is_document + self.is_image = is_image + self.is_audio = is_audio + self.is_voice = is_voice + self.is_video = is_video + self.has_buttons = has_buttons + self.has_markdown = True + + self.reply_text = reply_text + self.file_type = file_type + self.file_id = file_id + + def __repr__(self): + return "<Permissions for %s>" % self.chat_id + + def __eq__(self, other): + return bool( + isinstance(other, CustomFilters) + and self.chat_id == other.chat_id + and self.keyword == other.keyword + ) + + +class NewCustomFilters(BASE): + __tablename__ = "cust_filters_new" + chat_id = Column(String(14), primary_key=True) + keyword = Column(UnicodeText, primary_key=True, nullable=False) + text = Column(UnicodeText) + file_type = Column(Integer, nullable=False, default=1) + file_id = Column(UnicodeText, default=None) + + def __init__(self, chat_id, keyword, text, file_type, file_id): + self.chat_id = str(chat_id) # ensure string + self.keyword = keyword + self.text = text + self.file_type = file_type + self.file_id = file_id + + def __repr__(self): + return "<Filter for %s>" % self.chat_id + + def __eq__(self, other): + return bool( + isinstance(other, CustomFilters) + and self.chat_id == other.chat_id + and self.keyword == other.keyword + ) + + +class Buttons(BASE): + __tablename__ = "cust_filter_urls" + id = Column(Integer, primary_key=True, autoincrement=True) + chat_id = Column(String(14), primary_key=True) + keyword = Column(UnicodeText, primary_key=True) + name = Column(UnicodeText, nullable=False) + url = Column(UnicodeText, nullable=False) + same_line = Column(Boolean, default=False) + + def __init__(self, chat_id, keyword, name, url, same_line=False): + self.chat_id = str(chat_id) + self.keyword = keyword + self.name = name + self.url = url + self.same_line = same_line + + +CustomFilters.__table__.create(checkfirst=True) +Buttons.__table__.create(checkfirst=True) + +CUST_FILT_LOCK = threading.RLock() +BUTTON_LOCK = threading.RLock() +CHAT_FILTERS = {} + + +def get_all_filters(): + try: + return SESSION.query(CustomFilters).all() + finally: + SESSION.close() + + +def add_filter( + chat_id, + keyword, + reply, + is_sticker=False, + is_document=False, + is_image=False, + is_audio=False, + is_voice=False, + is_video=False, + buttons=None, +): + global CHAT_FILTERS + + if buttons is None: + buttons = [] + + with CUST_FILT_LOCK: + prev = SESSION.query(CustomFilters).get((str(chat_id), keyword)) + if prev: + with BUTTON_LOCK: + prev_buttons = ( + SESSION.query(Buttons) + .filter(Buttons.chat_id == str(chat_id), Buttons.keyword == keyword) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + SESSION.delete(prev) + + filt = CustomFilters( + str(chat_id), + keyword, + reply, + is_sticker, + is_document, + is_image, + is_audio, + is_voice, + is_video, + bool(buttons), + ) + + if keyword not in CHAT_FILTERS.get(str(chat_id), []): + CHAT_FILTERS[str(chat_id)] = sorted( + CHAT_FILTERS.get(str(chat_id), []) + [keyword], + key=lambda x: (-len(x), x), + ) + + SESSION.add(filt) + SESSION.commit() + + for b_name, url, same_line in buttons: + add_note_button_to_db(chat_id, keyword, b_name, url, same_line) + + +def new_add_filter(chat_id, keyword, reply_text, file_type, file_id, buttons): + global CHAT_FILTERS + + if buttons is None: + buttons = [] + + with CUST_FILT_LOCK: + prev = SESSION.query(CustomFilters).get((str(chat_id), keyword)) + if prev: + with BUTTON_LOCK: + prev_buttons = ( + SESSION.query(Buttons) + .filter(Buttons.chat_id == str(chat_id), Buttons.keyword == keyword) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + SESSION.delete(prev) + + filt = CustomFilters( + str(chat_id), + keyword, + reply="there is should be a new reply", + is_sticker=False, + is_document=False, + is_image=False, + is_audio=False, + is_voice=False, + is_video=False, + has_buttons=bool(buttons), + reply_text=reply_text, + file_type=file_type.value, + file_id=file_id, + ) + + if keyword not in CHAT_FILTERS.get(str(chat_id), []): + CHAT_FILTERS[str(chat_id)] = sorted( + CHAT_FILTERS.get(str(chat_id), []) + [keyword], + key=lambda x: (-len(x), x), + ) + + SESSION.add(filt) + SESSION.commit() + + for b_name, url, same_line in buttons: + add_note_button_to_db(chat_id, keyword, b_name, url, same_line) + + +def remove_filter(chat_id, keyword): + global CHAT_FILTERS + with CUST_FILT_LOCK: + filt = SESSION.query(CustomFilters).get((str(chat_id), keyword)) + if filt: + if keyword in CHAT_FILTERS.get(str(chat_id), []): # Sanity check + CHAT_FILTERS.get(str(chat_id), []).remove(keyword) + + with BUTTON_LOCK: + prev_buttons = ( + SESSION.query(Buttons) + .filter(Buttons.chat_id == str(chat_id), Buttons.keyword == keyword) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + + SESSION.delete(filt) + SESSION.commit() + return True + + SESSION.close() + return False + + +def get_chat_triggers(chat_id): + return CHAT_FILTERS.get(str(chat_id), set()) + + +def get_chat_filters(chat_id): + try: + return ( + SESSION.query(CustomFilters) + .filter(CustomFilters.chat_id == str(chat_id)) + .order_by(func.length(CustomFilters.keyword).desc()) + .order_by(CustomFilters.keyword.asc()) + .all() + ) + finally: + SESSION.close() + + +def get_filter(chat_id, keyword): + try: + return SESSION.query(CustomFilters).get((str(chat_id), keyword)) + finally: + SESSION.close() + + +def add_note_button_to_db(chat_id, keyword, b_name, url, same_line): + with BUTTON_LOCK: + button = Buttons(chat_id, keyword, b_name, url, same_line) + SESSION.add(button) + SESSION.commit() + + +def get_buttons(chat_id, keyword): + try: + return ( + SESSION.query(Buttons) + .filter(Buttons.chat_id == str(chat_id), Buttons.keyword == keyword) + .order_by(Buttons.id) + .all() + ) + finally: + SESSION.close() + + +def num_filters(): + try: + return SESSION.query(CustomFilters).count() + finally: + SESSION.close() + + +def num_chats(): + try: + return SESSION.query(func.count(distinct(CustomFilters.chat_id))).scalar() + finally: + SESSION.close() + + +def __load_chat_filters(): + global CHAT_FILTERS + try: + chats = SESSION.query(CustomFilters.chat_id).distinct().all() + for (chat_id,) in chats: # remove tuple by ( ,) + CHAT_FILTERS[chat_id] = [] + + all_filters = SESSION.query(CustomFilters).all() + for x in all_filters: + CHAT_FILTERS[x.chat_id] += [x.keyword] + + CHAT_FILTERS = { + x: sorted(set(y), key=lambda i: (-len(i), i)) + for x, y in CHAT_FILTERS.items() + } + + finally: + SESSION.close() + + +# ONLY USE FOR MIGRATE OLD FILTERS TO NEW FILTERS +def __migrate_filters(): + try: + all_filters = SESSION.query(CustomFilters).distinct().all() + for x in all_filters: + if x.is_document: + file_type = Types.DOCUMENT + elif x.is_image: + file_type = Types.PHOTO + elif x.is_video: + file_type = Types.VIDEO + elif x.is_sticker: + file_type = Types.STICKER + elif x.is_audio: + file_type = Types.AUDIO + elif x.is_voice: + file_type = Types.VOICE + else: + file_type = Types.TEXT + + print(str(x.chat_id), x.keyword, x.reply, file_type.value) + if file_type == Types.TEXT: + filt = CustomFilters( + str(x.chat_id), x.keyword, x.reply, file_type.value, None + ) + else: + filt = CustomFilters( + str(x.chat_id), x.keyword, None, file_type.value, x.reply + ) + + SESSION.add(filt) + SESSION.commit() + + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with CUST_FILT_LOCK: + chat_filters = ( + SESSION.query(CustomFilters) + .filter(CustomFilters.chat_id == str(old_chat_id)) + .all() + ) + for filt in chat_filters: + filt.chat_id = str(new_chat_id) + SESSION.commit() + try: + CHAT_FILTERS[str(new_chat_id)] = CHAT_FILTERS[str(old_chat_id)] + except KeyError: + pass + del CHAT_FILTERS[str(old_chat_id)] + + with BUTTON_LOCK: + chat_buttons = ( + SESSION.query(Buttons).filter(Buttons.chat_id == str(old_chat_id)).all() + ) + for btn in chat_buttons: + btn.chat_id = str(new_chat_id) + SESSION.commit() + + +__load_chat_filters() diff --git a/Exon/modules/sql/disable_sql.py b/Exon/modules/sql/disable_sql.py new file mode 100644 index 00000000..fec3c37f --- /dev/null +++ b/Exon/modules/sql/disable_sql.py @@ -0,0 +1,129 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String, UnicodeText, distinct, func + +from Exon.modules.sql import BASE, SESSION + + +class Disable(BASE): + __tablename__ = "disabled_commands" + chat_id = Column(String(14), primary_key=True) + command = Column(UnicodeText, primary_key=True) + + def __init__(self, chat_id, command): + self.chat_id = chat_id + self.command = command + + def __repr__(self): + return "ᴅɪsᴀʙʟᴇᴅ ᴄᴍᴅ {} in {}".format(self.command, self.chat_id) + + +Disable.__table__.create(checkfirst=True) +DISABLE_INSERTION_LOCK = threading.RLock() + +DISABLED = {} + + +def disable_command(chat_id, disable): + with DISABLE_INSERTION_LOCK: + disabled = SESSION.query(Disable).get((str(chat_id), disable)) + + if not disabled: + DISABLED.setdefault(str(chat_id), set()).add(disable) + + disabled = Disable(str(chat_id), disable) + SESSION.add(disabled) + SESSION.commit() + return True + + SESSION.close() + return False + + +def enable_command(chat_id, enable): + with DISABLE_INSERTION_LOCK: + disabled = SESSION.query(Disable).get((str(chat_id), enable)) + + if disabled: + if enable in DISABLED.get(str(chat_id)): # sanity check + DISABLED.setdefault(str(chat_id), set()).remove(enable) + + SESSION.delete(disabled) + SESSION.commit() + return True + + SESSION.close() + return False + + +def is_command_disabled(chat_id, cmd): + return str(cmd).lower() in DISABLED.get(str(chat_id), set()) + + +def get_all_disabled(chat_id): + return DISABLED.get(str(chat_id), set()) + + +def num_chats(): + try: + return SESSION.query(func.count(distinct(Disable.chat_id))).scalar() + finally: + SESSION.close() + + +def num_disabled(): + try: + return SESSION.query(Disable).count() + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with DISABLE_INSERTION_LOCK: + chats = SESSION.query(Disable).filter(Disable.chat_id == str(old_chat_id)).all() + for chat in chats: + chat.chat_id = str(new_chat_id) + SESSION.add(chat) + + if str(old_chat_id) in DISABLED: + DISABLED[str(new_chat_id)] = DISABLED.get(str(old_chat_id), set()) + + SESSION.commit() + + +def __load_disabled_commands(): + global DISABLED + try: + all_chats = SESSION.query(Disable).all() + for chat in all_chats: + DISABLED.setdefault(chat.chat_id, set()).add(chat.command) + + finally: + SESSION.close() + + +__load_disabled_commands() diff --git a/Exon/modules/sql/feds_sql.py b/Exon/modules/sql/feds_sql.py new file mode 100644 index 00000000..92c000b4 --- /dev/null +++ b/Exon/modules/sql/feds_sql.py @@ -0,0 +1,912 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 ast +import threading + +from sqlalchemy import BigInteger, Boolean, Column, String, UnicodeText +from telegram.error import BadRequest, Unauthorized + +from Exon import dispatcher +from Exon.modules.sql import BASE, SESSION + + +class Federations(BASE): + __tablename__ = "feds" + owner_id = Column(String(14)) + fed_name = Column(UnicodeText) + fed_id = Column(UnicodeText, primary_key=True) + fed_rules = Column(UnicodeText) + fed_log = Column(UnicodeText) + fed_users = Column(UnicodeText) + + def __init__(self, owner_id, fed_name, fed_id, fed_rules, fed_log, fed_users): + self.owner_id = owner_id + self.fed_name = fed_name + self.fed_id = fed_id + self.fed_rules = fed_rules + self.fed_log = fed_log + self.fed_users = fed_users + + +class ChatF(BASE): + __tablename__ = "chat_feds" + chat_id = Column(String(14), primary_key=True) + chat_name = Column(UnicodeText) + fed_id = Column(UnicodeText) + + def __init__(self, chat_id, chat_name, fed_id): + self.chat_id = chat_id + self.chat_name = chat_name + self.fed_id = fed_id + + +class BansF(BASE): + __tablename__ = "bans_feds" + fed_id = Column(UnicodeText, primary_key=True) + user_id = Column(String(14), primary_key=True) + first_name = Column(UnicodeText, nullable=False) + last_name = Column(UnicodeText) + user_name = Column(UnicodeText) + reason = Column(UnicodeText, default="") + time = Column(BigInteger, default=0) + + def __init__(self, fed_id, user_id, first_name, last_name, user_name, reason, time): + self.fed_id = fed_id + self.user_id = user_id + self.first_name = first_name + self.last_name = last_name + self.user_name = user_name + self.reason = reason + self.time = time + + +class FedsUserSettings(BASE): + __tablename__ = "feds_settings" + user_id = Column(BigInteger, primary_key=True) + should_report = Column(Boolean, default=True) + + def __init__(self, user_id): + self.user_id = user_id + + def __repr__(self): + return "<Feds report settings ({})>".format(self.user_id) + + +class FedSubs(BASE): + __tablename__ = "feds_subs" + fed_id = Column(UnicodeText, primary_key=True) + fed_subs = Column(UnicodeText, primary_key=True, nullable=False) + + def __init__(self, fed_id, fed_subs): + self.fed_id = fed_id + self.fed_subs = fed_subs + + def __repr__(self): + return "<Fed {} subscribes for {}>".format(self.fed_id, self.fed_subs) + + +Federations.__table__.create(checkfirst=True) +ChatF.__table__.create(checkfirst=True) +BansF.__table__.create(checkfirst=True) +FedsUserSettings.__table__.create(checkfirst=True) +FedSubs.__table__.create(checkfirst=True) + +FEDS_LOCK = threading.RLock() +CHAT_FEDS_LOCK = threading.RLock() +FEDS_SETTINGS_LOCK = threading.RLock() +FEDS_SUBSCRIBER_LOCK = threading.RLock() + +FEDERATION_BYNAME = {} +FEDERATION_BYOWNER = {} +FEDERATION_BYFEDID = {} + +FEDERATION_CHATS = {} +FEDERATION_CHATS_BYID = {} + +FEDERATION_BANNED_FULL = {} +FEDERATION_BANNED_USERID = {} + +FEDERATION_NOTIFICATION = {} +FEDS_SUBSCRIBER = {} +MYFEDS_SUBSCRIBER = {} + + +def get_fed_info(fed_id): + get = FEDERATION_BYFEDID.get(str(fed_id)) + if get is None: + return False + return get + + +def get_fed_id(chat_id): + get = FEDERATION_CHATS.get(str(chat_id)) + if get is None: + return False + return get["fid"] + + +def get_fed_name(chat_id): + get = FEDERATION_CHATS.get(str(chat_id)) + if get is None: + return False + return get["chat_name"] + + +def get_user_fban(fed_id, user_id): + if not FEDERATION_BANNED_FULL.get(fed_id): + return False, False, False + user_info = FEDERATION_BANNED_FULL[fed_id].get(user_id) + if not user_info: + return None, None, None + return user_info["first_name"], user_info["reason"], user_info["time"] + + +def get_user_admin_fed_name(user_id): + return [ + FEDERATION_BYFEDID[f]["fname"] + for f in FEDERATION_BYFEDID + if int(user_id) + in ast.literal_eval( + ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["members"] + ) + ] + + +def get_user_owner_fed_name(user_id): + return [ + FEDERATION_BYFEDID[f]["fname"] + for f in FEDERATION_BYFEDID + if int(user_id) + == int(ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["owner"]) + ] + + +def get_user_admin_fed_full(user_id): + return [ + {"fed_id": f, "fed": FEDERATION_BYFEDID[f]} + for f in FEDERATION_BYFEDID + if int(user_id) + in ast.literal_eval( + ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["members"] + ) + ] + + +def get_user_owner_fed_full(user_id): + return [ + {"fed_id": f, "fed": FEDERATION_BYFEDID[f]} + for f in FEDERATION_BYFEDID + if int(user_id) + == int(ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["owner"]) + ] + + +def get_user_fbanlist(user_id): + banlist = FEDERATION_BANNED_FULL + user_name = "" + fedname = [] + for x in banlist: + if banlist[x].get(user_id): + if user_name == "": + user_name = banlist[x][user_id].get("first_name") + fedname.append([x, banlist[x][user_id].get("reason")]) + return user_name, fedname + + +def new_fed(owner_id, fed_name, fed_id): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + fed = Federations( + str(owner_id), + fed_name, + str(fed_id), + "ʀᴜʟᴇs ɪs ɴᴏᴛ sᴇᴛ ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ.", + None, + str({"owner": str(owner_id), "members": "[]"}), + ) + SESSION.add(fed) + SESSION.commit() + FEDERATION_BYOWNER[str(owner_id)] = { + "fid": str(fed_id), + "fname": fed_name, + "frules": "ʀᴜʟᴇs ɪs ɴᴏᴛ sᴇᴛ ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ.", + "flog": None, + "fusers": str({"owner": str(owner_id), "members": "[]"}), + } + FEDERATION_BYFEDID[str(fed_id)] = { + "owner": str(owner_id), + "fname": fed_name, + "frules": "ʀᴜʟᴇs ɪs ɴᴏᴛ sᴇᴛ ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ.", + "flog": None, + "fusers": str({"owner": str(owner_id), "members": "[]"}), + } + FEDERATION_BYNAME[fed_name] = { + "fid": str(fed_id), + "owner": str(owner_id), + "frules": "ʀᴜʟᴇs ɪs ɴᴏᴛ sᴇᴛ ɪɴ ᴛʜɪs ғᴇᴅᴇʀᴀᴛɪᴏɴ.", + "flog": None, + "fusers": str({"owner": str(owner_id), "members": "[]"}), + } + return fed + + +def del_fed(fed_id): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME, FEDERATION_CHATS, FEDERATION_CHATS_BYID, FEDERATION_BANNED_USERID, FEDERATION_BANNED_FULL + getcache = FEDERATION_BYFEDID.get(fed_id) + if getcache is None: + return False + # Variables + getfed = FEDERATION_BYFEDID.get(fed_id) + owner_id = getfed["owner"] + fed_name = getfed["fname"] + # Delete from cache + FEDERATION_BYOWNER.pop(owner_id) + FEDERATION_BYFEDID.pop(fed_id) + FEDERATION_BYNAME.pop(fed_name) + if FEDERATION_CHATS_BYID.get(fed_id): + for x in FEDERATION_CHATS_BYID[fed_id]: + delchats = SESSION.query(ChatF).get(str(x)) + if delchats: + SESSION.delete(delchats) + SESSION.commit() + FEDERATION_CHATS.pop(x) + FEDERATION_CHATS_BYID.pop(fed_id) + # Delete fedban users + getall = FEDERATION_BANNED_USERID.get(fed_id) + if getall: + for x in getall: + banlist = SESSION.query(BansF).get((fed_id, str(x))) + if banlist: + SESSION.delete(banlist) + SESSION.commit() + if FEDERATION_BANNED_USERID.get(fed_id): + FEDERATION_BANNED_USERID.pop(fed_id) + if FEDERATION_BANNED_FULL.get(fed_id): + FEDERATION_BANNED_FULL.pop(fed_id) + # Delete fedsubs + getall = MYFEDS_SUBSCRIBER.get(fed_id) + if getall: + for x in getall: + getsubs = SESSION.query(FedSubs).get((fed_id, str(x))) + if getsubs: + SESSION.delete(getsubs) + SESSION.commit() + if FEDS_SUBSCRIBER.get(fed_id): + FEDS_SUBSCRIBER.pop(fed_id) + if MYFEDS_SUBSCRIBER.get(fed_id): + MYFEDS_SUBSCRIBER.pop(fed_id) + # Delete from database + curr = SESSION.query(Federations).get(fed_id) + if curr: + SESSION.delete(curr) + SESSION.commit() + return True + + +def rename_fed(fed_id, owner_id, newname): + with FEDS_LOCK: + global FEDERATION_BYFEDID, FEDERATION_BYOWNER, FEDERATION_BYNAME + fed = SESSION.query(Federations).get(fed_id) + if not fed: + return False + fed.fed_name = newname + SESSION.commit() + + # Update the dicts + oldname = FEDERATION_BYFEDID[str(fed_id)]["fname"] + tempdata = FEDERATION_BYNAME[oldname] + FEDERATION_BYNAME.pop(oldname) + + FEDERATION_BYOWNER[str(owner_id)]["fname"] = newname + FEDERATION_BYFEDID[str(fed_id)]["fname"] = newname + FEDERATION_BYNAME[newname] = tempdata + return True + + +def chat_join_fed(fed_id, chat_name, chat_id): + with FEDS_LOCK: + global FEDERATION_CHATS, FEDERATION_CHATS_BYID + r = ChatF(chat_id, chat_name, fed_id) + SESSION.add(r) + FEDERATION_CHATS[str(chat_id)] = {"chat_name": chat_name, "fid": fed_id} + checkid = FEDERATION_CHATS_BYID.get(fed_id) + if checkid is None: + FEDERATION_CHATS_BYID[fed_id] = [] + FEDERATION_CHATS_BYID[fed_id].append(str(chat_id)) + SESSION.commit() + return r + + +def search_fed_by_name(fed_name): + allfed = FEDERATION_BYNAME.get(fed_name) + if allfed is None: + return False + return allfed + + +def search_user_in_fed(fed_id, user_id): + getfed = FEDERATION_BYFEDID.get(fed_id) + if getfed is None: + return False + getfed = ast.literal_eval(getfed["fusers"])["members"] + return user_id in ast.literal_eval(getfed) + + +def user_demote_fed(fed_id, user_id): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + # Variables + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + owner_id = getfed["owner"] + fed_name = getfed["fname"] + fed_rules = getfed["frules"] + fed_log = getfed["flog"] + # Temp set + try: + members = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"]) + except ValueError: + return False + members.remove(user_id) + # Set user + FEDERATION_BYOWNER[str(owner_id)]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + FEDERATION_BYFEDID[str(fed_id)]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + FEDERATION_BYNAME[fed_name]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + # Set on database + fed = Federations( + str(owner_id), + fed_name, + str(fed_id), + fed_rules, + fed_log, + str({"owner": str(owner_id), "members": str(members)}), + ) + SESSION.merge(fed) + SESSION.commit() + return True + + +def user_join_fed(fed_id, user_id): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + # Variables + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + owner_id = getfed["owner"] + fed_name = getfed["fname"] + fed_rules = getfed["frules"] + fed_log = getfed["flog"] + # Temp set + members = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"]) + members.append(user_id) + # Set user + FEDERATION_BYOWNER[str(owner_id)]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + FEDERATION_BYFEDID[str(fed_id)]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + FEDERATION_BYNAME[fed_name]["fusers"] = str( + {"owner": str(owner_id), "members": str(members)}, + ) + # Set on database + fed = Federations( + str(owner_id), + fed_name, + str(fed_id), + fed_rules, + fed_log, + str({"owner": str(owner_id), "members": str(members)}), + ) + SESSION.merge(fed) + SESSION.commit() + __load_all_feds_chats() + return True + + +def chat_leave_fed(chat_id): + with FEDS_LOCK: + global FEDERATION_CHATS, FEDERATION_CHATS_BYID + # Set variables + fed_info = FEDERATION_CHATS.get(str(chat_id)) + if fed_info is None: + return False + fed_id = fed_info["fid"] + # Delete from cache + FEDERATION_CHATS.pop(str(chat_id)) + FEDERATION_CHATS_BYID[str(fed_id)].remove(str(chat_id)) + # Delete from db + curr = SESSION.query(ChatF).all() + for U in curr: + if int(U.chat_id) == int(chat_id): + SESSION.delete(U) + SESSION.commit() + return True + + +def all_fed_chats(fed_id): + with FEDS_LOCK: + getfed = FEDERATION_CHATS_BYID.get(fed_id) + if getfed is None: + return [] + return getfed + + +def all_fed_users(fed_id): + with FEDS_LOCK: + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + if getfed is None: + return False + fed_owner = ast.literal_eval(ast.literal_eval(getfed["fusers"])["owner"]) + fed_admins = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"]) + fed_admins.append(fed_owner) + return fed_admins + + +def all_fed_members(fed_id): + with FEDS_LOCK: + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + return ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"]) + + +def set_frules(fed_id, rules): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + # Variables + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + owner_id = getfed["owner"] + fed_name = getfed["fname"] + fed_members = getfed["fusers"] + fed_rules = str(rules) + fed_log = getfed["flog"] + # Set user + FEDERATION_BYOWNER[str(owner_id)]["frules"] = fed_rules + FEDERATION_BYFEDID[str(fed_id)]["frules"] = fed_rules + FEDERATION_BYNAME[fed_name]["frules"] = fed_rules + # Set on database + fed = Federations( + str(owner_id), + fed_name, + str(fed_id), + fed_rules, + fed_log, + str(fed_members), + ) + SESSION.merge(fed) + SESSION.commit() + return True + + +def get_frules(fed_id): + with FEDS_LOCK: + return FEDERATION_BYFEDID[str(fed_id)]["frules"] + + +def fban_user(fed_id, user_id, first_name, last_name, user_name, reason, time): + with FEDS_LOCK: + r = SESSION.query(BansF).all() + for I in r: + if I.fed_id == fed_id and int(I.user_id) == int(user_id): + SESSION.delete(I) + + r = BansF( + str(fed_id), + str(user_id), + first_name, + last_name, + user_name, + reason, + time, + ) + + SESSION.add(r) + try: + SESSION.commit() + except: + SESSION.rollback() + return False + finally: + SESSION.commit() + __load_all_feds_banned() + return r + + +def multi_fban_user( + multi_fed_id, + multi_user_id, + multi_first_name, + multi_last_name, + multi_user_name, + multi_reason, +): + counter = 0 + time = 0 + for x in enumerate(multi_fed_id): + fed_id = multi_fed_id[x] + user_id = multi_user_id[x] + first_name = multi_first_name[x] + last_name = multi_last_name[x] + user_name = multi_user_name[x] + reason = multi_reason[x] + r = SESSION.query(BansF).all() + for I in r: + if I.fed_id == fed_id and int(I.user_id) == int(user_id): + SESSION.delete(I) + + r = BansF( + str(fed_id), + str(user_id), + first_name, + last_name, + user_name, + reason, + time, + ) + + SESSION.add(r) + counter += 1 + if str(str(counter)[-2:]) == "00": + print(user_id) + print(first_name) + print(reason) + print(counter) + try: + SESSION.commit() + except: + SESSION.rollback() + return False + finally: + SESSION.commit() + __load_all_feds_banned() + print("Done") + return counter + + +def un_fban_user(fed_id, user_id): + with FEDS_LOCK: + r = SESSION.query(BansF).all() + for I in r: + if I.fed_id == fed_id and int(I.user_id) == int(user_id): + SESSION.delete(I) + try: + SESSION.commit() + except: + SESSION.rollback() + return False + finally: + SESSION.commit() + __load_all_feds_banned() + return I + + +def get_fban_user(fed_id, user_id): + list_fbanned = FEDERATION_BANNED_USERID.get(fed_id) + if list_fbanned is None: + FEDERATION_BANNED_USERID[fed_id] = [] + if user_id in FEDERATION_BANNED_USERID[fed_id]: + r = SESSION.query(BansF).all() + reason = None + for I in r: + if I.fed_id == fed_id and int(I.user_id) == int(user_id): + reason = I.reason + time = I.time + return True, reason, time + return False, None, None + + +def get_all_fban_users(fed_id): + list_fbanned = FEDERATION_BANNED_USERID.get(fed_id) + if list_fbanned is None: + FEDERATION_BANNED_USERID[fed_id] = [] + return FEDERATION_BANNED_USERID[fed_id] + + +def get_all_fban_users_target(fed_id, user_id): + list_fbanned = FEDERATION_BANNED_FULL.get(fed_id) + if list_fbanned is None: + FEDERATION_BANNED_FULL[fed_id] = [] + return False + return list_fbanned[str(user_id)] + + +def get_all_fban_users_global(): + total = [] + for x in list(FEDERATION_BANNED_USERID): + for y in FEDERATION_BANNED_USERID[x]: + total.append(y) + return total + + +def get_all_feds_users_global(): + return [FEDERATION_BYFEDID[x] for x in list(FEDERATION_BYFEDID)] + + +def search_fed_by_id(fed_id): + get = FEDERATION_BYFEDID.get(fed_id) + if get is None: + return False + return get + + +def user_feds_report(user_id: int) -> bool: + user_setting = FEDERATION_NOTIFICATION.get(str(user_id)) + if user_setting is None: + user_setting = True + return user_setting + + +def set_feds_setting(user_id: int, setting: bool): + with FEDS_SETTINGS_LOCK: + global FEDERATION_NOTIFICATION + user_setting = SESSION.query(FedsUserSettings).get(user_id) + if not user_setting: + user_setting = FedsUserSettings(user_id) + + user_setting.should_report = setting + FEDERATION_NOTIFICATION[str(user_id)] = setting + SESSION.add(user_setting) + SESSION.commit() + + +def get_fed_log(fed_id): + fed_setting = FEDERATION_BYFEDID.get(str(fed_id)) + if fed_setting is None: + fed_setting = False + return fed_setting + if fed_setting.get("flog") is None: + return False + if fed_setting.get("flog"): + try: + dispatcher.bot.get_chat(fed_setting.get("flog")) + except (BadRequest, Unauthorized): + set_fed_log(fed_id, None) + return False + return fed_setting.get("flog") + return False + + +def set_fed_log(fed_id, chat_id): + with FEDS_LOCK: + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + # Variables + getfed = FEDERATION_BYFEDID.get(str(fed_id)) + owner_id = getfed["owner"] + fed_name = getfed["fname"] + fed_members = getfed["fusers"] + fed_rules = getfed["frules"] + fed_log = str(chat_id) + # Set user + FEDERATION_BYOWNER[str(owner_id)]["flog"] = fed_log + FEDERATION_BYFEDID[str(fed_id)]["flog"] = fed_log + FEDERATION_BYNAME[fed_name]["flog"] = fed_log + # Set on database + fed = Federations( + str(owner_id), + fed_name, + str(fed_id), + fed_rules, + fed_log, + str(fed_members), + ) + SESSION.merge(fed) + SESSION.commit() + print(fed_log) + return True + + +def subs_fed(fed_id, my_fed): + check = get_spec_subs(fed_id, my_fed) + if check: + return False + with FEDS_SUBSCRIBER_LOCK: + subsfed = FedSubs(fed_id, my_fed) + + SESSION.merge(subsfed) # merge to avoid duplicate key issues + SESSION.commit() + global FEDS_SUBSCRIBER, MYFEDS_SUBSCRIBER + # Temporary Data For Subbed Feds + if FEDS_SUBSCRIBER.get(fed_id, set()) == set(): + FEDS_SUBSCRIBER[fed_id] = {my_fed} + else: + FEDS_SUBSCRIBER.get(fed_id, set()).add(my_fed) + # Temporary data for Fed Subs + if MYFEDS_SUBSCRIBER.get(my_fed, set()) == set(): + MYFEDS_SUBSCRIBER[my_fed] = {fed_id} + else: + MYFEDS_SUBSCRIBER.get(my_fed, set()).add(fed_id) + return True + + +def unsubs_fed(fed_id, my_fed): + with FEDS_SUBSCRIBER_LOCK: + getsubs = SESSION.query(FedSubs).get((fed_id, my_fed)) + if getsubs: + if my_fed in FEDS_SUBSCRIBER.get(fed_id, set()): # sanity check + FEDS_SUBSCRIBER.get(fed_id, set()).remove(my_fed) + if fed_id in MYFEDS_SUBSCRIBER.get(my_fed, set()): # sanity check + MYFEDS_SUBSCRIBER.get(my_fed, set()).remove(fed_id) + + SESSION.delete(getsubs) + SESSION.commit() + return True + + SESSION.close() + return False + + +def get_all_subs(fed_id): + return FEDS_SUBSCRIBER.get(fed_id, set()) + + +def get_spec_subs(fed_id, fed_target): + if FEDS_SUBSCRIBER.get(fed_id, set()) == set(): + return {} + return FEDS_SUBSCRIBER.get(fed_id, fed_target) + + +def get_mysubs(my_fed): + return list(MYFEDS_SUBSCRIBER.get(my_fed)) + + +def get_subscriber(fed_id): + return FEDS_SUBSCRIBER.get(fed_id, set()) + + +def __load_all_feds(): + global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME + try: + feds = SESSION.query(Federations).all() + for x in feds: # remove tuple by ( ,) + # Fed by Owner + check = FEDERATION_BYOWNER.get(x.owner_id) + if check is None: + FEDERATION_BYOWNER[x.owner_id] = [] + FEDERATION_BYOWNER[str(x.owner_id)] = { + "fid": str(x.fed_id), + "fname": x.fed_name, + "frules": x.fed_rules, + "flog": x.fed_log, + "fusers": str(x.fed_users), + } + # Fed By FedId + check = FEDERATION_BYFEDID.get(x.fed_id) + if check is None: + FEDERATION_BYFEDID[x.fed_id] = [] + FEDERATION_BYFEDID[str(x.fed_id)] = { + "owner": str(x.owner_id), + "fname": x.fed_name, + "frules": x.fed_rules, + "flog": x.fed_log, + "fusers": str(x.fed_users), + } + # Fed By Name + check = FEDERATION_BYNAME.get(x.fed_name) + if check is None: + FEDERATION_BYNAME[x.fed_name] = [] + FEDERATION_BYNAME[x.fed_name] = { + "fid": str(x.fed_id), + "owner": str(x.owner_id), + "frules": x.fed_rules, + "flog": x.fed_log, + "fusers": str(x.fed_users), + } + finally: + SESSION.close() + + +def __load_all_feds_chats(): + global FEDERATION_CHATS, FEDERATION_CHATS_BYID + try: + qall = SESSION.query(ChatF).all() + FEDERATION_CHATS = {} + FEDERATION_CHATS_BYID = {} + for x in qall: + # Federation Chats + check = FEDERATION_CHATS.get(x.chat_id) + if check is None: + FEDERATION_CHATS[x.chat_id] = {} + FEDERATION_CHATS[x.chat_id] = {"chat_name": x.chat_name, "fid": x.fed_id} + # Federation Chats By ID + check = FEDERATION_CHATS_BYID.get(x.fed_id) + if check is None: + FEDERATION_CHATS_BYID[x.fed_id] = [] + FEDERATION_CHATS_BYID[x.fed_id].append(x.chat_id) + finally: + SESSION.close() + + +def __load_all_feds_banned(): + global FEDERATION_BANNED_USERID, FEDERATION_BANNED_FULL + try: + FEDERATION_BANNED_USERID = {} + FEDERATION_BANNED_FULL = {} + qall = SESSION.query(BansF).all() + for x in qall: + check = FEDERATION_BANNED_USERID.get(x.fed_id) + if check is None: + FEDERATION_BANNED_USERID[x.fed_id] = [] + if int(x.user_id) not in FEDERATION_BANNED_USERID[x.fed_id]: + FEDERATION_BANNED_USERID[x.fed_id].append(int(x.user_id)) + check = FEDERATION_BANNED_FULL.get(x.fed_id) + if check is None: + FEDERATION_BANNED_FULL[x.fed_id] = {} + FEDERATION_BANNED_FULL[x.fed_id][x.user_id] = { + "first_name": x.first_name, + "last_name": x.last_name, + "user_name": x.user_name, + "reason": x.reason, + "time": x.time, + } + finally: + SESSION.close() + + +def __load_all_feds_settings(): + global FEDERATION_NOTIFICATION + try: + getuser = SESSION.query(FedsUserSettings).all() + for x in getuser: + FEDERATION_NOTIFICATION[str(x.user_id)] = x.should_report + finally: + SESSION.close() + + +def __load_feds_subscriber(): + global FEDS_SUBSCRIBER + global MYFEDS_SUBSCRIBER + try: + feds = SESSION.query(FedSubs.fed_id).distinct().all() + for (fed_id,) in feds: # remove tuple by ( ,) + FEDS_SUBSCRIBER[fed_id] = [] + MYFEDS_SUBSCRIBER[fed_id] = [] + + all_fedsubs = SESSION.query(FedSubs).all() + for x in all_fedsubs: + FEDS_SUBSCRIBER[x.fed_id] += [x.fed_subs] + try: + MYFEDS_SUBSCRIBER[x.fed_subs] += [x.fed_id] + except KeyError: + getsubs = SESSION.query(FedSubs).get((x.fed_id, x.fed_subs)) + if getsubs: + SESSION.delete(getsubs) + SESSION.commit() + + FEDS_SUBSCRIBER = {x: set(y) for x, y in FEDS_SUBSCRIBER.items()} + MYFEDS_SUBSCRIBER = {x: set(y) for x, y in MYFEDS_SUBSCRIBER.items()} + + finally: + SESSION.close() + + +__load_all_feds() +__load_all_feds_chats() +__load_all_feds_banned() +__load_all_feds_settings() +__load_feds_subscriber() diff --git a/Exon/modules/sql/forceSubscribe_sql.py b/Exon/modules/sql/forceSubscribe_sql.py new file mode 100644 index 00000000..8f48892c --- /dev/null +++ b/Exon/modules/sql/forceSubscribe_sql.py @@ -0,0 +1,70 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 sqlalchemy import Column, Numeric, String + +from Exon.modules.sql import BASE, SESSION + + +class forceSubscribe(BASE): + __tablename__ = "forceSubscribe" + chat_id = Column(Numeric, primary_key=True) + channel = Column(String) + + def __init__(self, chat_id, channel): + self.chat_id = chat_id + self.channel = channel + + +forceSubscribe.__table__.create(checkfirst=True) + + +def fs_settings(chat_id): + try: + return ( + SESSION.query(forceSubscribe) + .filter(forceSubscribe.chat_id == chat_id) + .one() + ) + except: + return None + finally: + SESSION.close() + + +def add_channel(chat_id, channel): + adder = SESSION.query(forceSubscribe).get(chat_id) + if adder: + adder.channel = channel + else: + adder = forceSubscribe(chat_id, channel) + SESSION.add(adder) + SESSION.commit() + + +def disapprove(chat_id): + rem = SESSION.query(forceSubscribe).get(chat_id) + if rem: + SESSION.delete(rem) + SESSION.commit() diff --git a/Exon/modules/sql/global_bans_sql.py b/Exon/modules/sql/global_bans_sql.py new file mode 100644 index 00000000..d05f12be --- /dev/null +++ b/Exon/modules/sql/global_bans_sql.py @@ -0,0 +1,191 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Boolean, Column, String, UnicodeText + +from Exon.modules.sql import BASE, SESSION + + +class GloballyBannedUsers(BASE): + __tablename__ = "gbans" + user_id = Column(BigInteger, primary_key=True) + name = Column(UnicodeText, nullable=False) + reason = Column(UnicodeText) + + def __init__(self, user_id, name, reason=None): + self.user_id = user_id + self.name = name + self.reason = reason + + def __repr__(self): + return "<ɢʙᴀɴɴᴇᴅ ᴜsᴇʀ {} ({})>".format(self.name, self.user_id) + + def to_dict(self): + return {"user_id": self.user_id, "name": self.name, "reason": self.reason} + + +class GbanSettings(BASE): + __tablename__ = "gban_settings" + chat_id = Column(String(14), primary_key=True) + setting = Column(Boolean, default=True, nullable=False) + + def __init__(self, chat_id, enabled): + self.chat_id = str(chat_id) + self.setting = enabled + + def __repr__(self): + return "<ɢʙᴀɴ sᴇᴛᴛɪɴɢ {} ({})>".format(self.chat_id, self.setting) + + +GloballyBannedUsers.__table__.create(checkfirst=True) +GbanSettings.__table__.create(checkfirst=True) + +GBANNED_USERS_LOCK = threading.RLock() +GBAN_SETTING_LOCK = threading.RLock() +GBANNED_LIST = set() +GBANSTAT_LIST = set() + + +def gban_user(user_id, name, reason=None): + with GBANNED_USERS_LOCK: + user = SESSION.query(GloballyBannedUsers).get(user_id) + if not user: + user = GloballyBannedUsers(user_id, name, reason) + else: + user.name = name + user.reason = reason + + SESSION.merge(user) + SESSION.commit() + __load_gbanned_userid_list() + + +def update_gban_reason(user_id, name, reason=None): + with GBANNED_USERS_LOCK: + user = SESSION.query(GloballyBannedUsers).get(user_id) + if not user: + return None + old_reason = user.reason + user.name = name + user.reason = reason + + SESSION.merge(user) + SESSION.commit() + return old_reason + + +def ungban_user(user_id): + with GBANNED_USERS_LOCK: + user = SESSION.query(GloballyBannedUsers).get(user_id) + if user: + SESSION.delete(user) + + SESSION.commit() + __load_gbanned_userid_list() + + +def is_user_gbanned(user_id): + return user_id in GBANNED_LIST + + +def get_gbanned_user(user_id): + try: + return SESSION.query(GloballyBannedUsers).get(user_id) + finally: + SESSION.close() + + +def get_gban_list(): + try: + return [x.to_dict() for x in SESSION.query(GloballyBannedUsers).all()] + finally: + SESSION.close() + + +def enable_gbans(chat_id): + with GBAN_SETTING_LOCK: + chat = SESSION.query(GbanSettings).get(str(chat_id)) + if not chat: + chat = GbanSettings(chat_id, True) + + chat.setting = True + SESSION.add(chat) + SESSION.commit() + if str(chat_id) in GBANSTAT_LIST: + GBANSTAT_LIST.remove(str(chat_id)) + + +def disable_gbans(chat_id): + with GBAN_SETTING_LOCK: + chat = SESSION.query(GbanSettings).get(str(chat_id)) + if not chat: + chat = GbanSettings(chat_id, False) + + chat.setting = False + SESSION.add(chat) + SESSION.commit() + GBANSTAT_LIST.add(str(chat_id)) + + +def does_chat_gban(chat_id): + return str(chat_id) not in GBANSTAT_LIST + + +def num_gbanned_users(): + return len(GBANNED_LIST) + + +def __load_gbanned_userid_list(): + global GBANNED_LIST + try: + GBANNED_LIST = {x.user_id for x in SESSION.query(GloballyBannedUsers).all()} + finally: + SESSION.close() + + +def __load_gban_stat_list(): + global GBANSTAT_LIST + try: + GBANSTAT_LIST = { + x.chat_id for x in SESSION.query(GbanSettings).all() if not x.setting + } + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with GBAN_SETTING_LOCK: + chat = SESSION.query(GbanSettings).get(str(old_chat_id)) + if chat: + chat.chat_id = new_chat_id + SESSION.add(chat) + + SESSION.commit() + + +# Create in memory userid to avoid disk access +__load_gbanned_userid_list() +__load_gban_stat_list() diff --git a/Exon/modules/sql/kuki_sql.py b/Exon/modules/sql/kuki_sql.py new file mode 100644 index 00000000..0d35e845 --- /dev/null +++ b/Exon/modules/sql/kuki_sql.py @@ -0,0 +1,73 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String + +from Exon.modules.sql import BASE, SESSION + + +class KukiChats(BASE): + __tablename__ = "kuki_chats" + chat_id = Column(String(14), primary_key=True) + + def __init__(self, chat_id): + self.chat_id = chat_id + + +KukiChats.__table__.create(checkfirst=True) +INSERTION_LOCK = threading.RLock() + + +def is_kuki(chat_id): + try: + chat = SESSION.query(KukiChats).get(str(chat_id)) + return bool(chat) + finally: + SESSION.close() + + +def set_kuki(chat_id): + with INSERTION_LOCK: + kukichat = SESSION.query(KukiChats).get(str(chat_id)) + if not kukichat: + kukichat = KukiChats(str(chat_id)) + SESSION.add(kukichat) + SESSION.commit() + + +def rem_kuki(chat_id): + with INSERTION_LOCK: + kukichat = SESSION.query(KukiChats).get(str(chat_id)) + if kukichat: + SESSION.delete(kukichat) + SESSION.commit() + + +def get_all_kuki_chats(): + try: + return SESSION.query(KukiChats.chat_id).all() + finally: + SESSION.close() diff --git a/Exon/modules/sql/locks_sql.py b/Exon/modules/sql/locks_sql.py new file mode 100644 index 00000000..62321425 --- /dev/null +++ b/Exon/modules/sql/locks_sql.py @@ -0,0 +1,292 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +# New chat added -> setup permissions +import threading + +from sqlalchemy import Boolean, Column, String + +from Exon.modules.sql import BASE, SESSION + + +class Permissions(BASE): + __tablename__ = "permissions" + chat_id = Column(String(14), primary_key=True) + # Booleans are for "is this locked", _NOT_ "is this allowed" + audio = Column(Boolean, default=False) + voice = Column(Boolean, default=False) + contact = Column(Boolean, default=False) + video = Column(Boolean, default=False) + document = Column(Boolean, default=False) + photo = Column(Boolean, default=False) + sticker = Column(Boolean, default=False) + gif = Column(Boolean, default=False) + url = Column(Boolean, default=False) + bots = Column(Boolean, default=False) + forward = Column(Boolean, default=False) + game = Column(Boolean, default=False) + location = Column(Boolean, default=False) + rtl = Column(Boolean, default=False) + button = Column(Boolean, default=False) + egame = Column(Boolean, default=False) + inline = Column(Boolean, default=False) + + def __init__(self, chat_id): + self.chat_id = str(chat_id) # ensure string + self.audio = False + self.voice = False + self.contact = False + self.video = False + self.document = False + self.photo = False + self.sticker = False + self.gif = False + self.url = False + self.bots = False + self.forward = False + self.game = False + self.location = False + self.rtl = False + self.button = False + self.egame = False + self.inline = False + + def __repr__(self): + return "<ᴘᴇʀᴍɪssɪᴏɴs ғᴏʀ %s>" % self.chat_id + + +class Restrictions(BASE): + __tablename__ = "restrictions" + chat_id = Column(String(14), primary_key=True) + # Booleans are for "is this restricted", _NOT_ "is this allowed" + messages = Column(Boolean, default=False) + media = Column(Boolean, default=False) + other = Column(Boolean, default=False) + preview = Column(Boolean, default=False) + + def __init__(self, chat_id): + self.chat_id = str(chat_id) # ensure string + self.messages = False + self.media = False + self.other = False + self.preview = False + + def __repr__(self): + return "<ʀᴇsᴛʀɪᴄᴛɪᴏɴs ғᴏʀ %s>" % self.chat_id + + +# For those who faced database error, Just uncomment the +# line below and run bot for 1 time & remove that line! + +Permissions.__table__.create(checkfirst=True) +# Permissions.__table__.drop() +Restrictions.__table__.create(checkfirst=True) + +PERM_LOCK = threading.RLock() +RESTR_LOCK = threading.RLock() + + +def init_permissions(chat_id, reset=False): + curr_perm = SESSION.query(Permissions).get(str(chat_id)) + if reset: + SESSION.delete(curr_perm) + SESSION.flush() + perm = Permissions(str(chat_id)) + SESSION.add(perm) + SESSION.commit() + return perm + + +def init_restrictions(chat_id, reset=False): + curr_restr = SESSION.query(Restrictions).get(str(chat_id)) + if reset: + SESSION.delete(curr_restr) + SESSION.flush() + restr = Restrictions(str(chat_id)) + SESSION.add(restr) + SESSION.commit() + return restr + + +def update_lock(chat_id, lock_type, locked): + with PERM_LOCK: + curr_perm = SESSION.query(Permissions).get(str(chat_id)) + if not curr_perm: + curr_perm = init_permissions(chat_id) + + if lock_type == "audio": + curr_perm.audio = locked + elif lock_type == "voice": + curr_perm.voice = locked + elif lock_type == "contact": + curr_perm.contact = locked + elif lock_type == "video": + curr_perm.video = locked + elif lock_type == "document": + curr_perm.document = locked + elif lock_type == "photo": + curr_perm.photo = locked + elif lock_type == "sticker": + curr_perm.sticker = locked + elif lock_type == "gif": + curr_perm.gif = locked + elif lock_type == "url": + curr_perm.url = locked + elif lock_type == "bots": + curr_perm.bots = locked + elif lock_type == "forward": + curr_perm.forward = locked + elif lock_type == "game": + curr_perm.game = locked + elif lock_type == "location": + curr_perm.location = locked + elif lock_type == "rtl": + curr_perm.rtl = locked + elif lock_type == "button": + curr_perm.button = locked + elif lock_type == "egame": + curr_perm.egame = locked + elif lock_type == "inline": + curr_perm.inline = locked + + SESSION.add(curr_perm) + SESSION.commit() + + +def update_restriction(chat_id, restr_type, locked): + with RESTR_LOCK: + curr_restr = SESSION.query(Restrictions).get(str(chat_id)) + if not curr_restr: + curr_restr = init_restrictions(chat_id) + + if restr_type == "messages": + curr_restr.messages = locked + elif restr_type == "media": + curr_restr.media = locked + elif restr_type == "other": + curr_restr.other = locked + elif restr_type == "previews": + curr_restr.preview = locked + elif restr_type == "all": + curr_restr.messages = locked + curr_restr.media = locked + curr_restr.other = locked + curr_restr.preview = locked + SESSION.add(curr_restr) + SESSION.commit() + + +def is_locked(chat_id, lock_type): + curr_perm = SESSION.query(Permissions).get(str(chat_id)) + SESSION.close() + + if not curr_perm: + return False + + if lock_type == "sticker": + return curr_perm.sticker + if lock_type == "photo": + return curr_perm.photo + if lock_type == "audio": + return curr_perm.audio + if lock_type == "voice": + return curr_perm.voice + if lock_type == "contact": + return curr_perm.contact + if lock_type == "video": + return curr_perm.video + if lock_type == "document": + return curr_perm.document + if lock_type == "gif": + return curr_perm.gif + if lock_type == "url": + return curr_perm.url + if lock_type == "bots": + return curr_perm.bots + if lock_type == "forward": + return curr_perm.forward + if lock_type == "game": + return curr_perm.game + if lock_type == "location": + return curr_perm.location + if lock_type == "rtl": + return curr_perm.rtl + if lock_type == "button": + return curr_perm.button + if lock_type == "egame": + return curr_perm.egame + if lock_type == "inline": + return curr_perm.inline + + +def is_restr_locked(chat_id, lock_type): + curr_restr = SESSION.query(Restrictions).get(str(chat_id)) + SESSION.close() + + if not curr_restr: + return False + + if lock_type == "messages": + return curr_restr.messages + if lock_type == "media": + return curr_restr.media + if lock_type == "other": + return curr_restr.other + if lock_type == "previews": + return curr_restr.preview + if lock_type == "all": + return ( + curr_restr.messages + and curr_restr.media + and curr_restr.other + and curr_restr.preview + ) + + +def get_locks(chat_id): + try: + return SESSION.query(Permissions).get(str(chat_id)) + finally: + SESSION.close() + + +def get_restr(chat_id): + try: + return SESSION.query(Restrictions).get(str(chat_id)) + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with PERM_LOCK: + perms = SESSION.query(Permissions).get(str(old_chat_id)) + if perms: + perms.chat_id = str(new_chat_id) + SESSION.commit() + + with RESTR_LOCK: + rest = SESSION.query(Restrictions).get(str(old_chat_id)) + if rest: + rest.chat_id = str(new_chat_id) + SESSION.commit() diff --git a/Exon/modules/sql/log_channel_sql.py b/Exon/modules/sql/log_channel_sql.py new file mode 100644 index 00000000..0224ef33 --- /dev/null +++ b/Exon/modules/sql/log_channel_sql.py @@ -0,0 +1,180 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading +import typing + +from sqlalchemy import BigInteger, Boolean, Column, String, distinct, func + +from Exon.modules.sql import BASE, SESSION + + +class GroupLogs(BASE): + __tablename__ = "log_channels" + chat_id = Column(String(14), primary_key=True) + log_channel = Column(String(14), nullable=False) + + def __init__(self, chat_id, log_channel): + self.chat_id = str(chat_id) + self.log_channel = str(log_channel) + + +class LogChannelSettings(BASE): + __tablename__ = "log_channel_setting" + chat_id = Column(BigInteger, primary_key=True) + log_joins = Column(Boolean, default=True) + log_leave = Column(Boolean, default=True) + log_warn = Column(Boolean, default=True) + log_action = Column(Boolean, default=True) + # log_media = Column(Boolean) + log_report = Column(Boolean, default=True) + + def __init__( + self, + chat_id: int, + log_join: bool, + log_leave: bool, + log_warn: bool, + log_action: bool, + log_report: bool, + ): + self.chat_id = chat_id + self.log_warn = log_warn + self.log_joins = log_join + self.log_leave = log_leave + self.log_report = log_report + self.log_action = log_action + + def toggle_warn(self) -> bool: + self.log_warn = not self.log_warn + SESSION.commit() + return self.log_warn + + def toggle_joins(self) -> bool: + self.log_joins = not self.log_joins + SESSION.commit() + return self.log_joins + + def toggle_leave(self) -> bool: + self.log_leave = not self.log_leave + SESSION.commit() + return self.log_leave + + def toggle_report(self) -> bool: + self.log_report = not self.log_report + SESSION.commit() + return self.log_report + + def toggle_action(self) -> bool: + self.log_action = not self.log_action + SESSION.commit() + return self.log_action + + +GroupLogs.__table__.create(checkfirst=True) +LogChannelSettings.__table__.create(checkfirst=True) + +LOGS_INSERTION_LOCK = threading.RLock() +LOG_SETTING_LOCK = threading.RLock() +CHANNELS = {} + + +def get_chat_setting(chat_id: int) -> typing.Optional[LogChannelSettings]: + with LOG_SETTING_LOCK: + return SESSION.query(LogChannelSettings).get(chat_id) + + +def set_chat_setting(setting: LogChannelSettings): + with LOGS_INSERTION_LOCK: + res: LogChannelSettings = SESSION.query(LogChannelSettings).get(setting.chat_id) + if res: + res.log_warn = setting.log_warn + res.log_action = setting.log_action + res.log_report = setting.log_report + res.log_joins = setting.log_joins + res.log_leave = setting.log_leave + else: + SESSION.add(setting) + SESSION.commit() + + +def set_chat_log_channel(chat_id, log_channel): + with LOGS_INSERTION_LOCK: + res = SESSION.query(GroupLogs).get(str(chat_id)) + if res: + res.log_channel = log_channel + else: + res = GroupLogs(chat_id, log_channel) + SESSION.add(res) + + CHANNELS[str(chat_id)] = log_channel + SESSION.commit() + + +def get_chat_log_channel(chat_id): + return CHANNELS.get(str(chat_id)) + + +def stop_chat_logging(chat_id): + with LOGS_INSERTION_LOCK: + res = SESSION.query(GroupLogs).get(str(chat_id)) + if res: + if str(chat_id) in CHANNELS: + del CHANNELS[str(chat_id)] + + log_channel = res.log_channel + SESSION.delete(res) + SESSION.commit() + return log_channel + + +def num_logchannels(): + try: + return SESSION.query(func.count(distinct(GroupLogs.chat_id))).scalar() + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with LOGS_INSERTION_LOCK: + chat = SESSION.query(GroupLogs).get(str(old_chat_id)) + if chat: + chat.chat_id = str(new_chat_id) + SESSION.add(chat) + if str(old_chat_id) in CHANNELS: + CHANNELS[str(new_chat_id)] = CHANNELS.get(str(old_chat_id)) + + SESSION.commit() + + +def __load_log_channels(): + global CHANNELS + try: + all_chats = SESSION.query(GroupLogs).all() + CHANNELS = {chat.chat_id: chat.log_channel for chat in all_chats} + finally: + SESSION.close() + + +__load_log_channels() diff --git a/Exon/modules/sql/nightmode_sql.py b/Exon/modules/sql/nightmode_sql.py new file mode 100644 index 00000000..2ac4e0d2 --- /dev/null +++ b/Exon/modules/sql/nightmode_sql.py @@ -0,0 +1,42 @@ +from sqlalchemy import Column, String + +from Exon.modules.sql import BASE, SESSION + + +class Nightmode(BASE): + __tablename__ = "nightmode" + chat_id = Column(String(14), primary_key=True) + + def __init__(self, chat_id): + self.chat_id = chat_id + + +Nightmode.__table__.create(checkfirst=True) + + +def add_nightmode(chat_id: str): + nightmoddy = Nightmode(str(chat_id)) + SESSION.add(nightmoddy) + SESSION.commit() + + +def rmnightmode(chat_id: str): + rmnightmoddy = SESSION.query(Nightmode).get(str(chat_id)) + if rmnightmoddy: + SESSION.delete(rmnightmoddy) + SESSION.commit() + + +def get_all_chat_id(): + stark = SESSION.query(Nightmode).all() + SESSION.close() + return stark + + +def is_nightmode_indb(chat_id: str): + try: + s__ = SESSION.query(Nightmode).get(str(chat_id)) + if s__: + return str(s__.chat_id) + finally: + SESSION.close() diff --git a/Exon/modules/sql/notes_sql.py b/Exon/modules/sql/notes_sql.py new file mode 100644 index 00000000..88ed8075 --- /dev/null +++ b/Exon/modules/sql/notes_sql.py @@ -0,0 +1,211 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏ + +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. +""" + + +# Note: chat_id's are stored as strings because the int is too large to be stored in a PSQL database. +import threading + +from sqlalchemy import BigInteger, Boolean, Column, String, UnicodeText, distinct, func + +from Exon.modules.helper_funcs.msg_types import Types +from Exon.modules.sql import BASE, SESSION + + +class Notes(BASE): + __tablename__ = "notes" + chat_id = Column(String(14), primary_key=True) + name = Column(UnicodeText, primary_key=True) + value = Column(UnicodeText, nullable=False) + file = Column(UnicodeText) + is_reply = Column(Boolean, default=False) + has_buttons = Column(Boolean, default=False) + msgtype = Column(BigInteger, default=Types.BUTTON_TEXT.value) + + def __init__(self, chat_id, name, value, msgtype, file=None): + self.chat_id = str(chat_id) # ensure string + self.name = name + self.value = value + self.msgtype = msgtype + self.file = file + + def __repr__(self): + return "<ɴᴏᴛᴇ %s>" % self.name + + +class Buttons(BASE): + __tablename__ = "note_urls" + id = Column(BigInteger, primary_key=True, autoincrement=True) + chat_id = Column(String(14), primary_key=True) + note_name = Column(UnicodeText, primary_key=True) + name = Column(UnicodeText, nullable=False) + url = Column(UnicodeText, nullable=False) + same_line = Column(Boolean, default=False) + + def __init__(self, chat_id, note_name, name, url, same_line=False): + self.chat_id = str(chat_id) + self.note_name = note_name + self.name = name + self.url = url + self.same_line = same_line + + +Notes.__table__.create(checkfirst=True) +Buttons.__table__.create(checkfirst=True) + +NOTES_INSERTION_LOCK = threading.RLock() +BUTTONS_INSERTION_LOCK = threading.RLock() + + +def add_note_to_db(chat_id, note_name, note_data, msgtype, buttons=None, file=None): + if not buttons: + buttons = [] + + with NOTES_INSERTION_LOCK: + prev = SESSION.query(Notes).get((str(chat_id), note_name)) + if prev: + with BUTTONS_INSERTION_LOCK: + prev_buttons = ( + SESSION.query(Buttons) + .filter( + Buttons.chat_id == str(chat_id), + Buttons.note_name == note_name, + ) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + SESSION.delete(prev) + note = Notes( + str(chat_id), + note_name, + note_data or "", + msgtype=msgtype.value, + file=file, + ) + SESSION.add(note) + SESSION.commit() + + for b_name, url, same_line in buttons: + add_note_button_to_db(chat_id, note_name, b_name, url, same_line) + + +def get_note(chat_id, note_name): + try: + return ( + SESSION.query(Notes) + .filter(func.lower(Notes.name) == note_name, Notes.chat_id == str(chat_id)) + .first() + ) + finally: + SESSION.close() + + +def rm_note(chat_id, note_name): + with NOTES_INSERTION_LOCK: + note = ( + SESSION.query(Notes) + .filter(func.lower(Notes.name) == note_name, Notes.chat_id == str(chat_id)) + .first() + ) + if note: + with BUTTONS_INSERTION_LOCK: + buttons = ( + SESSION.query(Buttons) + .filter( + Buttons.chat_id == str(chat_id), + Buttons.note_name == note_name, + ) + .all() + ) + for btn in buttons: + SESSION.delete(btn) + + SESSION.delete(note) + SESSION.commit() + return True + SESSION.close() + return False + + +def get_all_chat_notes(chat_id): + try: + return ( + SESSION.query(Notes) + .filter(Notes.chat_id == str(chat_id)) + .order_by(Notes.name.asc()) + .all() + ) + finally: + SESSION.close() + + +def add_note_button_to_db(chat_id, note_name, b_name, url, same_line): + with BUTTONS_INSERTION_LOCK: + button = Buttons(chat_id, note_name, b_name, url, same_line) + SESSION.add(button) + SESSION.commit() + + +def get_buttons(chat_id, note_name): + try: + return ( + SESSION.query(Buttons) + .filter(Buttons.chat_id == str(chat_id), Buttons.note_name == note_name) + .order_by(Buttons.id) + .all() + ) + finally: + SESSION.close() + + +def num_notes(): + try: + return SESSION.query(Notes).count() + finally: + SESSION.close() + + +def num_chats(): + try: + return SESSION.query(func.count(distinct(Notes.chat_id))).scalar() + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with NOTES_INSERTION_LOCK: + chat_notes = ( + SESSION.query(Notes).filter(Notes.chat_id == str(old_chat_id)).all() + ) + for note in chat_notes: + note.chat_id = str(new_chat_id) + + with BUTTONS_INSERTION_LOCK: + chat_buttons = ( + SESSION.query(Buttons).filter(Buttons.chat_id == str(old_chat_id)).all() + ) + for btn in chat_buttons: + btn.chat_id = str(new_chat_id) + + SESSION.commit() diff --git a/Exon/modules/sql/nsfw_sql.py b/Exon/modules/sql/nsfw_sql.py new file mode 100644 index 00000000..ad88f452 --- /dev/null +++ b/Exon/modules/sql/nsfw_sql.py @@ -0,0 +1,73 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String + +from Exon.modules.sql import BASE, SESSION + + +class NSFWChats(BASE): + __tablename__ = "nsfw_chats" + chat_id = Column(String(14), primary_key=True) + + def __init__(self, chat_id): + self.chat_id = chat_id + + +NSFWChats.__table__.create(checkfirst=True) +INSERTION_LOCK = threading.RLock() + + +def is_nsfw(chat_id): + try: + chat = SESSION.query(NSFWChats).get(str(chat_id)) + return bool(chat) + finally: + SESSION.close() + + +def set_nsfw(chat_id): + with INSERTION_LOCK: + nsfwchat = SESSION.query(NSFWChats).get(str(chat_id)) + if not nsfwchat: + nsfwchat = NSFWChats(str(chat_id)) + SESSION.add(nsfwchat) + SESSION.commit() + + +def rem_nsfw(chat_id): + with INSERTION_LOCK: + nsfwchat = SESSION.query(NSFWChats).get(str(chat_id)) + if nsfwchat: + SESSION.delete(nsfwchat) + SESSION.commit() + + +def get_all_nsfw_chats(): + try: + return SESSION.query(NSFWChats.chat_id).all() + finally: + SESSION.close() diff --git a/Exon/modules/sql/nsfw_watch_sql.py b/Exon/modules/sql/nsfw_watch_sql.py new file mode 100644 index 00000000..6107c45f --- /dev/null +++ b/Exon/modules/sql/nsfw_watch_sql.py @@ -0,0 +1,66 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 sqlalchemy import Column, String + +from Exon.modules.sql import BASE, SESSION + + +class Nsfwatch(BASE): + __tablename__ = "nsfwatch" + chat_id = Column(String(14), primary_key=True) + + def __init__(self, chat_id): + self.chat_id = chat_id + + +Nsfwatch.__table__.create(checkfirst=True) + + +def add_nsfwatch(chat_id: str): + nsfws = Nsfwatch(str(chat_id)) + SESSION.add(nsfws) + SESSION.commit() + + +def rmnsfwatch(chat_id: str): + nsfwm = SESSION.query(Nsfwatch).get(str(chat_id)) + if nsfwm: + SESSION.delete(nsfwm) + SESSION.commit() + + +def get_all_nsfw_enabled_chat(): + stark = SESSION.query(Nsfwatch).all() + SESSION.close() + return stark + + +def is_nsfwatch_indb(chat_id: str): + try: + s__ = SESSION.query(Nsfwatch).get(str(chat_id)) + if s__: + return str(s__.chat_id) + finally: + SESSION.close() diff --git a/Exon/modules/sql/pin_sql.py b/Exon/modules/sql/pin_sql.py new file mode 100644 index 00000000..d1cf6090 --- /dev/null +++ b/Exon/modules/sql/pin_sql.py @@ -0,0 +1,97 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Boolean, Column, String + +from Exon.modules.sql import BASE, SESSION + + +class SPinSettings(BASE): + __tablename__ = "pin_settings" + + chat_id = Column(String(14), primary_key=True) + message_id = Column(BigInteger) + suacpmo = Column(Boolean, default=False) + scldpmo = Column(Boolean, default=False) + + def __init__(self, chat_id, message_id): + self.chat_id = str(chat_id) + self.message_id = message_id + + def __repr__(self): + return "<ᴘɪɴ sᴇᴛᴛɪɴɢs ғᴏʀ {} ɪɴ {}>".format(self.chat_id, self.message_id) + + +SPinSettings.__table__.create(checkfirst=True) + +PIN_INSERTION_LOCK = threading.RLock() + + +def add_mid(chat_id, message_id): + with PIN_INSERTION_LOCK: + chat = SESSION.query(SPinSettings).get(str(chat_id)) + if not chat: + chat = SPinSettings(str(chat_id), message_id) + SESSION.add(chat) + SESSION.commit() + SESSION.close() + + +def remove_mid(chat_id): + with PIN_INSERTION_LOCK: + chat = SESSION.query(SPinSettings).get(str(chat_id)) + if chat: + SESSION.delete(chat) + SESSION.commit() + SESSION.close() + + +def add_acp_o(chat_id, setting): + with PIN_INSERTION_LOCK: + chat = SESSION.query(SPinSettings).get(str(chat_id)) + if not chat: + chat = SPinSettings(str(chat_id), 0) + chat.suacpmo = setting + SESSION.add(chat) + SESSION.commit() + SESSION.close() + + +def add_ldp_m(chat_id, setting): + with PIN_INSERTION_LOCK: + chat = SESSION.query(SPinSettings).get(str(chat_id)) + if not chat: + chat = SPinSettings(str(chat_id), 0) + chat.scldpmo = setting + SESSION.add(chat) + SESSION.commit() + SESSION.close() + + +def get_current_settings(chat_id): + with PIN_INSERTION_LOCK: + chat = SESSION.query(SPinSettings).get(str(chat_id)) + return chat diff --git a/Exon/modules/sql/raid_sql.py b/Exon/modules/sql/raid_sql.py new file mode 100644 index 00000000..d0491e1a --- /dev/null +++ b/Exon/modules/sql/raid_sql.py @@ -0,0 +1,73 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String + +from Exon.modules.sql import BASE, SESSION + + +class RaidChats(BASE): + __tablename__ = "raid_chats" + chat_id = Column(String(14), primary_key=True) + + def __init__(self, chat_id): + self.chat_id = chat_id + + +RaidChats.__table__.create(checkfirst=True) +INSERTION_LOCK = threading.RLock() + + +def is_raid(chat_id): + try: + chat = SESSION.query(RaidChats).get(str(chat_id)) + return bool(chat) + finally: + SESSION.close() + + +def set_raid(chat_id): + with INSERTION_LOCK: + raidchat = SESSION.query(RaidChats).get(str(chat_id)) + if not raidchat: + raidchat = RaidChats(str(chat_id)) + SESSION.add(raidchat) + SESSION.commit() + + +def rem_raid(chat_id): + with INSERTION_LOCK: + raidchat = SESSION.query(RaidChats).get(str(chat_id)) + if raidchat: + SESSION.delete(raidchat) + SESSION.commit() + + +def get_all_raid_chats(): + try: + return SESSION.query(RaidChats.chat_id).all() + finally: + SESSION.close() diff --git a/Exon/modules/sql/remind_sql.py b/Exon/modules/sql/remind_sql.py new file mode 100644 index 00000000..ea2d3acb --- /dev/null +++ b/Exon/modules/sql/remind_sql.py @@ -0,0 +1,140 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading +import time + +from sqlalchemy import Column, Integer, String, UnicodeText +from sqlalchemy.sql.sqltypes import BigInteger + +from Exon.modules.sql import BASE, SESSION + + +class Reminds(BASE): + __tablename__ = "reminds" + chat_id = Column(String(14), primary_key=True) + time_seconds = Column(Integer, primary_key=True) + remind_message = Column(UnicodeText, default="") + user_id = Column(BigInteger, default=0) + + def __init__(self, chat_id, time_seconds): + self.chat_id = str(chat_id) + self.time_seconds = int(time_seconds) + + def __repr__(self): + return "<ʀᴇᴍɪɴᴅ ɪɴ {} ғᴏʀ ᴛɪᴍᴇ {}>".format( + self.chat_id, + self.time_seconds, + ) + + +# Reminds.__table__.drop() +Reminds.__table__.create(checkfirst=True) + +INSERTION_LOCK = threading.RLock() + +REMINDERS = {} + + +def set_remind(chat_id, time_sec, remind_message, user_id): + with INSERTION_LOCK: + reminds = SESSION.query(Reminds).get((str(chat_id), time_sec)) + if not reminds: + reminds = Reminds(chat_id, time_sec) + reminds.remind_message = remind_message + reminds.user_id = user_id + SESSION.add(reminds) + SESSION.commit() + if not time_sec in REMINDERS: + REMINDERS[time_sec] = [] + REMINDERS[time_sec].append( + {"chat_id": str(chat_id), "message": remind_message, "user_id": user_id} + ) + + +def rem_remind(chat_id, time_sec, remind_message, user_id): + with INSERTION_LOCK: + reminds = SESSION.query(Reminds).get((str(chat_id), time_sec)) + if reminds: + SESSION.delete(reminds) + SESSION.commit() + REMINDERS[time_sec].remove( + {"chat_id": str(chat_id), "message": remind_message, "user_id": user_id} + ) + return True + SESSION.close() + return False + + +def get_remind_in_chat(chat_id, timestamp): + return ( + SESSION.query(Reminds) + .filter(Reminds.chat_id == str(chat_id), Reminds.time_seconds == timestamp) + .first() + ) + + +def num_reminds_in_chat(chat_id): + return SESSION.query(Reminds).filter(Reminds.chat_id == str(chat_id)).count() + + +def get_reminds_in_chat(chat_id): + try: + return ( + SESSION.query(Reminds) + .filter(Reminds.chat_id == str(chat_id)) + .order_by(Reminds.time_seconds.asc()) + .all() + ) + finally: + SESSION.close() + + +def __get_all_reminds(): + try: + chats = SESSION.query(Reminds).all() + for chat in chats: + if (chat.time_seconds <= round(time.time())) or chat.user_id == 0: + try: + rem_remind( + chat.chat_id, + chat.time_seconds, + chat.remind_message, + chat.user_id, + ) + except: + pass + continue + REMINDERS[chat.time_seconds] = [ + { + "chat_id": chat.chat_id, + "message": chat.remind_message, + "user_id": chat.user_id, + } + ] + finally: + SESSION.close() + + +__get_all_reminds() diff --git a/Exon/modules/sql/reporting_sql.py b/Exon/modules/sql/reporting_sql.py new file mode 100644 index 00000000..7e57b6e9 --- /dev/null +++ b/Exon/modules/sql/reporting_sql.py @@ -0,0 +1,115 @@ +""" +MIT License + +Copyright (c) 2022 Arsh + +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 threading +from typing import Union + +from sqlalchemy import BigInteger, Boolean, Column, String + +from Exon.modules.sql import BASE, SESSION + + +class ReportingUserSettings(BASE): + __tablename__ = "user_report_settings" + user_id = Column(BigInteger, primary_key=True) + should_report = Column(Boolean, default=True) + + def __init__(self, user_id): + self.user_id = user_id + + def __repr__(self): + return "<ᴜsᴇʀ ʀᴇᴘᴏʀᴛ sᴇᴛᴛɪɴɢs ({})>".format(self.user_id) + + +class ReportingChatSettings(BASE): + __tablename__ = "chat_report_settings" + chat_id = Column(String(14), primary_key=True) + should_report = Column(Boolean, default=True) + + def __init__(self, chat_id): + self.chat_id = str(chat_id) + + def __repr__(self): + return "<ᴄʜᴀᴛ ʀᴇᴘᴏʀᴛ sᴇᴛᴛɪɴɢs ({})>".format(self.chat_id) + + +ReportingUserSettings.__table__.create(checkfirst=True) +ReportingChatSettings.__table__.create(checkfirst=True) + +CHAT_LOCK = threading.RLock() +USER_LOCK = threading.RLock() + + +def chat_should_report(chat_id: Union[str, int]) -> bool: + try: + chat_setting = SESSION.query(ReportingChatSettings).get(str(chat_id)) + if chat_setting: + return chat_setting.should_report + return False + finally: + SESSION.close() + + +def user_should_report(user_id: int) -> bool: + try: + user_setting = SESSION.query(ReportingUserSettings).get(user_id) + if user_setting: + return user_setting.should_report + return True + finally: + SESSION.close() + + +def set_chat_setting(chat_id: Union[int, str], setting: bool): + with CHAT_LOCK: + chat_setting = SESSION.query(ReportingChatSettings).get(str(chat_id)) + if not chat_setting: + chat_setting = ReportingChatSettings(chat_id) + + chat_setting.should_report = setting + SESSION.add(chat_setting) + SESSION.commit() + + +def set_user_setting(user_id: int, setting: bool): + with USER_LOCK: + user_setting = SESSION.query(ReportingUserSettings).get(user_id) + if not user_setting: + user_setting = ReportingUserSettings(user_id) + + user_setting.should_report = setting + SESSION.add(user_setting) + SESSION.commit() + + +def migrate_chat(old_chat_id, new_chat_id): + with CHAT_LOCK: + chat_notes = ( + SESSION.query(ReportingChatSettings) + .filter(ReportingChatSettings.chat_id == str(old_chat_id)) + .all() + ) + for note in chat_notes: + note.chat_id = str(new_chat_id) + SESSION.commit() diff --git a/Exon/modules/sql/rules_sql.py b/Exon/modules/sql/rules_sql.py new file mode 100644 index 00000000..9220ae06 --- /dev/null +++ b/Exon/modules/sql/rules_sql.py @@ -0,0 +1,79 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import Column, String, UnicodeText, distinct, func + +from Exon.modules.sql import BASE, SESSION + + +class Rules(BASE): + __tablename__ = "rules" + chat_id = Column(String(14), primary_key=True) + rules = Column(UnicodeText, default="") + + def __init__(self, chat_id): + self.chat_id = chat_id + + def __repr__(self): + return "<ᴄʜᴀᴛ {} ʀᴜʟᴇs: {}>".format(self.chat_id, self.rules) + + +Rules.__table__.create(checkfirst=True) + +INSERTION_LOCK = threading.RLock() + + +def set_rules(chat_id, rules_text): + with INSERTION_LOCK: + rules = SESSION.query(Rules).get(str(chat_id)) + if not rules: + rules = Rules(str(chat_id)) + rules.rules = rules_text + + SESSION.add(rules) + SESSION.commit() + + +def get_rules(chat_id): + rules = SESSION.query(Rules).get(str(chat_id)) + ret = rules.rules if rules else "" + SESSION.close() + return ret + + +def num_chats(): + try: + return SESSION.query(func.count(distinct(Rules.chat_id))).scalar() + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with INSERTION_LOCK: + chat = SESSION.query(Rules).get(str(old_chat_id)) + if chat: + chat.chat_id = str(new_chat_id) + SESSION.commit() diff --git a/Exon/modules/sql/userinfo_sql.py b/Exon/modules/sql/userinfo_sql.py new file mode 100644 index 00000000..cc8021fd --- /dev/null +++ b/Exon/modules/sql/userinfo_sql.py @@ -0,0 +1,100 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏᴏ + +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 threading + +from sqlalchemy import BigInteger, Column, UnicodeText + +from Exon.modules.sql import BASE, SESSION + + +class UserInfo(BASE): + __tablename__ = "userinfo" + user_id = Column(BigInteger, primary_key=True) + info = Column(UnicodeText) + + def __init__(self, user_id, info): + self.user_id = user_id + self.info = info + + def __repr__(self): + return "<ᴜsᴇʀ ɪɴғᴏ %d>" % self.user_id + + +class UserBio(BASE): + __tablename__ = "userbio" + user_id = Column(BigInteger, primary_key=True) + bio = Column(UnicodeText) + + def __init__(self, user_id, bio): + self.user_id = user_id + self.bio = bio + + def __repr__(self): + return "<ᴜsᴇʀ ɪɴғᴏ %d>" % self.user_id + + +UserInfo.__table__.create(checkfirst=True) +UserBio.__table__.create(checkfirst=True) + +INSERTION_LOCK = threading.RLock() + + +def get_user_me_info(user_id): + userinfo = SESSION.query(UserInfo).get(user_id) + SESSION.close() + if userinfo: + return userinfo.info + return None + + +def set_user_me_info(user_id, info): + with INSERTION_LOCK: + userinfo = SESSION.query(UserInfo).get(user_id) + if userinfo: + userinfo.info = info + else: + userinfo = UserInfo(user_id, info) + SESSION.add(userinfo) + SESSION.commit() + + +def get_user_bio(user_id): + userbio = SESSION.query(UserBio).get(user_id) + SESSION.close() + if userbio: + return userbio.bio + return None + + +def set_user_bio(user_id, bio): + with INSERTION_LOCK: + userbio = SESSION.query(UserBio).get(user_id) + if userbio: + userbio.bio = bio + else: + userbio = UserBio(user_id, bio) + + SESSION.add(userbio) + SESSION.commit() diff --git a/Exon/modules/sql/users_sql.py b/Exon/modules/sql/users_sql.py new file mode 100644 index 00000000..d7e7ca9c --- /dev/null +++ b/Exon/modules/sql/users_sql.py @@ -0,0 +1,258 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import ( + BigInteger, + Column, + ForeignKey, + String, + UnicodeText, + UniqueConstraint, + func, +) + +from Exon import dispatcher +from Exon.modules.sql import BASE, SESSION + + +class Users(BASE): + __tablename__ = "users" + user_id = Column(BigInteger, primary_key=True) + username = Column(UnicodeText) + + def __init__(self, user_id, username=None): + self.user_id = user_id + self.username = username + + def __repr__(self): + return "<ᴜsᴇʀ {} ({})>".format(self.username, self.user_id) + + +class Chats(BASE): + __tablename__ = "chats" + chat_id = Column(String(14), primary_key=True) + chat_name = Column(UnicodeText, nullable=False) + + def __init__(self, chat_id, chat_name): + self.chat_id = str(chat_id) + self.chat_name = chat_name + + def __repr__(self): + return "<ᴄʜᴀᴛ {} ({})>".format(self.chat_name, self.chat_id) + + +class ChatMembers(BASE): + __tablename__ = "chat_members" + priv_chat_id = Column(BigInteger, primary_key=True) + # NOTE: Use dual primary key instead of private primary key? + chat = Column( + String(14), + ForeignKey("chats.chat_id", onupdate="CASCADE", ondelete="CASCADE"), + nullable=False, + ) + user = Column( + BigInteger, + ForeignKey("users.user_id", onupdate="CASCADE", ondelete="CASCADE"), + nullable=False, + ) + __table_args__ = (UniqueConstraint("chat", "user", name="_chat_members_uc"),) + + def __init__(self, chat, user): + self.chat = chat + self.user = user + + def __repr__(self): + return "<ᴄʜᴀᴛ ᴜsᴇʀ {} ({}) ɪɴ ᴄʜᴀᴛ {} ({})>".format( + self.user.username, + self.user.user_id, + self.chat.chat_name, + self.chat.chat_id, + ) + + +Users.__table__.create(checkfirst=True) +Chats.__table__.create(checkfirst=True) +ChatMembers.__table__.create(checkfirst=True) + +INSERTION_LOCK = threading.RLock() + + +def ensure_bot_in_db(): + with INSERTION_LOCK: + bot = Users(dispatcher.bot.id, dispatcher.bot.username) + SESSION.merge(bot) + SESSION.commit() + + +def update_user(user_id, username, chat_id=None, chat_name=None): + with INSERTION_LOCK: + user = SESSION.query(Users).get(user_id) + if not user: + user = Users(user_id, username) + SESSION.add(user) + SESSION.flush() + else: + user.username = username + + if not chat_id or not chat_name: + SESSION.commit() + return + + chat = SESSION.query(Chats).get(str(chat_id)) + if not chat: + chat = Chats(str(chat_id), chat_name) + SESSION.add(chat) + SESSION.flush() + + else: + chat.chat_name = chat_name + + member = ( + SESSION.query(ChatMembers) + .filter(ChatMembers.chat == chat.chat_id, ChatMembers.user == user.user_id) + .first() + ) + if not member: + chat_member = ChatMembers(chat.chat_id, user.user_id) + SESSION.add(chat_member) + + SESSION.commit() + + +def get_userid_by_name(username): + try: + return ( + SESSION.query(Users) + .filter(func.lower(Users.username) == username.lower()) + .all() + ) + finally: + SESSION.close() + + +def get_name_by_userid(user_id): + try: + return SESSION.query(Users).get(Users.user_id == int(user_id)).first() + finally: + SESSION.close() + + +def get_chat_members(chat_id): + try: + return SESSION.query(ChatMembers).filter(ChatMembers.chat == str(chat_id)).all() + finally: + SESSION.close() + + +def get_all_chats(): + try: + return SESSION.query(Chats).all() + finally: + SESSION.close() + + +def get_all_users(): + try: + return SESSION.query(Users).all() + finally: + SESSION.close() + + +def get_user_num_chats(user_id): + try: + return ( + SESSION.query(ChatMembers).filter(ChatMembers.user == int(user_id)).count() + ) + finally: + SESSION.close() + + +def get_user_com_chats(user_id): + try: + chat_members = ( + SESSION.query(ChatMembers).filter(ChatMembers.user == int(user_id)).all() + ) + return [i.chat for i in chat_members] + finally: + SESSION.close() + + +def num_chats(): + try: + return SESSION.query(Chats).count() + finally: + SESSION.close() + + +def num_users(): + try: + return SESSION.query(Users).count() + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with INSERTION_LOCK: + chat = SESSION.query(Chats).get(str(old_chat_id)) + if chat: + chat.chat_id = str(new_chat_id) + SESSION.commit() + + chat_members = ( + SESSION.query(ChatMembers) + .filter(ChatMembers.chat == str(old_chat_id)) + .all() + ) + for member in chat_members: + member.chat = str(new_chat_id) + SESSION.commit() + + +ensure_bot_in_db() + + +def del_user(user_id): + with INSERTION_LOCK: + curr = SESSION.query(Users).get(user_id) + if curr: + SESSION.delete(curr) + SESSION.commit() + return True + + ChatMembers.query.filter(ChatMembers.user == user_id).delete() + SESSION.commit() + SESSION.close() + return False + + +def rem_chat(chat_id): + with INSERTION_LOCK: + chat = SESSION.query(Chats).get(str(chat_id)) + if chat: + SESSION.delete(chat) + SESSION.commit() + else: + SESSION.close() diff --git a/Exon/modules/sql/warns_sql.py b/Exon/modules/sql/warns_sql.py new file mode 100644 index 00000000..b188e790 --- /dev/null +++ b/Exon/modules/sql/warns_sql.py @@ -0,0 +1,341 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 threading + +from sqlalchemy import BigInteger, Boolean, Column, String, UnicodeText, distinct, func +from sqlalchemy.dialects import postgresql + +from Exon.modules.sql import BASE, SESSION + + +class Warns(BASE): + __tablename__ = "warns" + + user_id = Column(BigInteger, primary_key=True) + chat_id = Column(String(14), primary_key=True) + num_warns = Column(BigInteger, default=0) + reasons = Column(postgresql.ARRAY(UnicodeText)) + + def __init__(self, user_id, chat_id): + self.user_id = user_id + self.chat_id = str(chat_id) + self.num_warns = 0 + self.reasons = [] + + def __repr__(self): + return "<{} ᴡᴀʀɴs ғᴏʀ {} ɪɴ {} ғᴏʀ ʀᴇᴀsᴏɴs {}>".format( + self.num_warns, + self.user_id, + self.chat_id, + self.reasons, + ) + + +class WarnFilters(BASE): + __tablename__ = "warn_filters" + chat_id = Column(String(14), primary_key=True) + keyword = Column(UnicodeText, primary_key=True, nullable=False) + reply = Column(UnicodeText, nullable=False) + + def __init__(self, chat_id, keyword, reply): + self.chat_id = str(chat_id) # ensure string + self.keyword = keyword + self.reply = reply + + def __repr__(self): + return "<ᴘᴇʀᴍɪssɪᴏɴs ғᴏʀ %s>" % self.chat_id + + def __eq__(self, other): + return bool( + isinstance(other, WarnFilters) + and self.chat_id == other.chat_id + and self.keyword == other.keyword, + ) + + +class WarnSettings(BASE): + __tablename__ = "warn_settings" + chat_id = Column(String(14), primary_key=True) + warn_limit = Column(BigInteger, default=3) + soft_warn = Column(Boolean, default=False) + + def __init__(self, chat_id, warn_limit=3, soft_warn=False): + self.chat_id = str(chat_id) + self.warn_limit = warn_limit + self.soft_warn = soft_warn + + def __repr__(self): + return "<{} ʜᴀs {} ᴘᴏssɪʙʟᴇ ᴡᴀʀɴs.>".format(self.chat_id, self.warn_limit) + + +Warns.__table__.create(checkfirst=True) +WarnFilters.__table__.create(checkfirst=True) +WarnSettings.__table__.create(checkfirst=True) + +WARN_INSERTION_LOCK = threading.RLock() +WARN_FILTER_INSERTION_LOCK = threading.RLock() +WARN_SETTINGS_LOCK = threading.RLock() + +WARN_FILTERS = {} + + +def warn_user(user_id, chat_id, reason=None): + with WARN_INSERTION_LOCK: + warned_user = SESSION.query(Warns).get((user_id, str(chat_id))) + if not warned_user: + warned_user = Warns(user_id, str(chat_id)) + + warned_user.num_warns += 1 + if reason: + warned_user.reasons = warned_user.reasons + [ + reason, + ] # TODO:: double check this wizardry + + reasons = warned_user.reasons + num = warned_user.num_warns + + SESSION.add(warned_user) + SESSION.commit() + + return num, reasons + + +def remove_warn(user_id, chat_id): + with WARN_INSERTION_LOCK: + removed = False + warned_user = SESSION.query(Warns).get((user_id, str(chat_id))) + + if warned_user and warned_user.num_warns > 0: + warned_user.num_warns -= 1 + warned_user.reasons = warned_user.reasons[:-1] + SESSION.add(warned_user) + SESSION.commit() + removed = True + + SESSION.close() + return removed + + +def reset_warns(user_id, chat_id): + with WARN_INSERTION_LOCK: + warned_user = SESSION.query(Warns).get((user_id, str(chat_id))) + if warned_user: + warned_user.num_warns = 0 + warned_user.reasons = [] + + SESSION.add(warned_user) + SESSION.commit() + SESSION.close() + + +def get_warns(user_id, chat_id): + try: + user = SESSION.query(Warns).get((user_id, str(chat_id))) + if not user: + return None + reasons = user.reasons + num = user.num_warns + return num, reasons + finally: + SESSION.close() + + +def add_warn_filter(chat_id, keyword, reply): + with WARN_FILTER_INSERTION_LOCK: + warn_filt = WarnFilters(str(chat_id), keyword, reply) + + if keyword not in WARN_FILTERS.get(str(chat_id), []): + WARN_FILTERS[str(chat_id)] = sorted( + WARN_FILTERS.get(str(chat_id), []) + [keyword], + key=lambda x: (-len(x), x), + ) + + SESSION.merge(warn_filt) # merge to avoid duplicate key issues + SESSION.commit() + + +def remove_warn_filter(chat_id, keyword): + with WARN_FILTER_INSERTION_LOCK: + warn_filt = SESSION.query(WarnFilters).get((str(chat_id), keyword)) + if warn_filt: + if keyword in WARN_FILTERS.get(str(chat_id), []): # sanity check + WARN_FILTERS.get(str(chat_id), []).remove(keyword) + + SESSION.delete(warn_filt) + SESSION.commit() + return True + SESSION.close() + return False + + +def get_chat_warn_triggers(chat_id): + return WARN_FILTERS.get(str(chat_id), set()) + + +def get_chat_warn_filters(chat_id): + try: + return ( + SESSION.query(WarnFilters).filter(WarnFilters.chat_id == str(chat_id)).all() + ) + finally: + SESSION.close() + + +def get_warn_filter(chat_id, keyword): + try: + return SESSION.query(WarnFilters).get((str(chat_id), keyword)) + finally: + SESSION.close() + + +def set_warn_limit(chat_id, warn_limit): + with WARN_SETTINGS_LOCK: + curr_setting = SESSION.query(WarnSettings).get(str(chat_id)) + if not curr_setting: + curr_setting = WarnSettings(chat_id, warn_limit=warn_limit) + + curr_setting.warn_limit = warn_limit + + SESSION.add(curr_setting) + SESSION.commit() + + +def set_warn_strength(chat_id, soft_warn): + with WARN_SETTINGS_LOCK: + curr_setting = SESSION.query(WarnSettings).get(str(chat_id)) + if not curr_setting: + curr_setting = WarnSettings(chat_id, soft_warn=soft_warn) + + curr_setting.soft_warn = soft_warn + + SESSION.add(curr_setting) + SESSION.commit() + + +def get_warn_setting(chat_id): + try: + setting = SESSION.query(WarnSettings).get(str(chat_id)) + if setting: + return setting.warn_limit, setting.soft_warn + return 3, False + + finally: + SESSION.close() + + +def num_warns(): + try: + return SESSION.query(func.sum(Warns.num_warns)).scalar() or 0 + finally: + SESSION.close() + + +def num_warn_chats(): + try: + return SESSION.query(func.count(distinct(Warns.chat_id))).scalar() + finally: + SESSION.close() + + +def num_warn_filters(): + try: + return SESSION.query(WarnFilters).count() + finally: + SESSION.close() + + +def num_warn_chat_filters(chat_id): + try: + return ( + SESSION.query(WarnFilters.chat_id) + .filter(WarnFilters.chat_id == str(chat_id)) + .count() + ) + finally: + SESSION.close() + + +def num_warn_filter_chats(): + try: + return SESSION.query(func.count(distinct(WarnFilters.chat_id))).scalar() + finally: + SESSION.close() + + +def __load_chat_warn_filters(): + global WARN_FILTERS + try: + chats = SESSION.query(WarnFilters.chat_id).distinct().all() + for (chat_id,) in chats: # remove tuple by ( ,) + WARN_FILTERS[chat_id] = [] + + all_filters = SESSION.query(WarnFilters).all() + for x in all_filters: + WARN_FILTERS[x.chat_id] += [x.keyword] + + WARN_FILTERS = { + x: sorted(set(y), key=lambda i: (-len(i), i)) + for x, y in WARN_FILTERS.items() + } + + finally: + SESSION.close() + + +def migrate_chat(old_chat_id, new_chat_id): + with WARN_INSERTION_LOCK: + chat_notes = ( + SESSION.query(Warns).filter(Warns.chat_id == str(old_chat_id)).all() + ) + for note in chat_notes: + note.chat_id = str(new_chat_id) + SESSION.commit() + + with WARN_FILTER_INSERTION_LOCK: + chat_filters = ( + SESSION.query(WarnFilters) + .filter(WarnFilters.chat_id == str(old_chat_id)) + .all() + ) + for filt in chat_filters: + filt.chat_id = str(new_chat_id) + SESSION.commit() + old_warn_filt = WARN_FILTERS.get(str(old_chat_id)) + if old_warn_filt is not None: + WARN_FILTERS[str(new_chat_id)] = old_warn_filt + del WARN_FILTERS[str(old_chat_id)] + + with WARN_SETTINGS_LOCK: + chat_settings = ( + SESSION.query(WarnSettings) + .filter(WarnSettings.chat_id == str(old_chat_id)) + .all() + ) + for setting in chat_settings: + setting.chat_id = str(new_chat_id) + SESSION.commit() + + +__load_chat_warn_filters() diff --git a/Exon/modules/sql/welcome_sql.py b/Exon/modules/sql/welcome_sql.py new file mode 100644 index 00000000..93c64371 --- /dev/null +++ b/Exon/modules/sql/welcome_sql.py @@ -0,0 +1,508 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 random +import threading +from typing import Union + +from sqlalchemy import BigInteger, Boolean, Column, Integer, String, UnicodeText + +from Exon.modules.helper_funcs.msg_types import Types +from Exon.modules.sql import BASE, SESSION + +DEFAULT_WELCOME = "ʜᴇʏ {first}, ʜᴏᴡ ᴀʀᴇ ʏᴏᴜ?" +DEFAULT_GOODBYE = "ɴɪᴄᴇ ᴋɴᴏᴡɪɴɢ ʏᴀ!" + +DEFAULT_WELCOME_MESSAGES = [ + "{first} ɪs ʜᴇʀᴇ!", # Discord welcome messages copied + "ʀᴇᴀᴅʏ ᴘʟᴀʏᴇʀ {first}", + "ᴡᴇʟᴄᴏᴍᴇ ʙʀᴏ {first}", +] + +DEFAULT_GOODBYE_MESSAGES = [ + "{first} ᴡɪʟʟ ʙᴇ ᴍɪssᴇᴅ.", + "{first} ᴡʜᴇɴ ʙᴀᴄᴋ ?.", +] + + +class Welcome(BASE): + __tablename__ = "welcome_pref" + chat_id = Column(String(14), primary_key=True) + should_welcome = Column(Boolean, default=True) + should_goodbye = Column(Boolean, default=True) + custom_content = Column(UnicodeText, default=None) + + custom_welcome = Column( + UnicodeText, default=random.choice(DEFAULT_WELCOME_MESSAGES) + ) + welcome_type = Column(Integer, default=Types.TEXT.value) + + custom_leave = Column(UnicodeText, default=random.choice(DEFAULT_GOODBYE_MESSAGES)) + leave_type = Column(Integer, default=Types.TEXT.value) + + clean_welcome = Column(BigInteger) + + def __init__(self, chat_id, should_welcome=True, should_goodbye=True): + self.chat_id = chat_id + self.should_welcome = should_welcome + self.should_goodbye = should_goodbye + + def __repr__(self): + return "<ᴄʜᴀᴛ {} sʜᴏᴜʟᴅ sʜᴏᴜʟᴅ ɴᴇᴡ ᴜsᴇʀs: {}>".format( + self.chat_id, self.should_welcome + ) + + +class WelcomeButtons(BASE): + __tablename__ = "welcome_urls" + id = Column(Integer, primary_key=True, autoincrement=True) + chat_id = Column(String(14), primary_key=True) + name = Column(UnicodeText, nullable=False) + url = Column(UnicodeText, nullable=False) + same_line = Column(Boolean, default=False) + + def __init__(self, chat_id, name, url, same_line=False): + self.chat_id = str(chat_id) + self.name = name + self.url = url + self.same_line = same_line + + +class GoodbyeButtons(BASE): + __tablename__ = "leave_urls" + id = Column(Integer, primary_key=True, autoincrement=True) + chat_id = Column(String(14), primary_key=True) + name = Column(UnicodeText, nullable=False) + url = Column(UnicodeText, nullable=False) + same_line = Column(Boolean, default=False) + + def __init__(self, chat_id, name, url, same_line=False): + self.chat_id = str(chat_id) + self.name = name + self.url = url + self.same_line = same_line + + +class WelcomeMute(BASE): + __tablename__ = "welcome_mutes" + chat_id = Column(String(14), primary_key=True) + welcomemutes = Column(UnicodeText, default=False) + + def __init__(self, chat_id, welcomemutes): + self.chat_id = str(chat_id) # ensure string + self.welcomemutes = welcomemutes + + +class WelcomeMuteUsers(BASE): + __tablename__ = "human_checks" + user_id = Column(BigInteger, primary_key=True) + chat_id = Column(String(14), primary_key=True) + human_check = Column(Boolean) + + def __init__(self, user_id, chat_id, human_check): + self.user_id = user_id # ensure string + self.chat_id = str(chat_id) + self.human_check = human_check + + +class CleanServiceSetting(BASE): + __tablename__ = "clean_service" + chat_id = Column(String(14), primary_key=True) + clean_service = Column(Boolean, default=True) + + def __init__(self, chat_id): + self.chat_id = str(chat_id) + + def __repr__(self): + return "<ᴄʜᴀᴛ ᴜsᴇᴅ ᴄʟᴇᴀɴ sᴇʀᴠɪᴄᴇ ({})>".format(self.chat_id) + + +class RaidMode(BASE): + __tablename__ = "raid_mode" + chat_id = Column(String(14), primary_key=True) + status = Column(Boolean, default=False) + time = Column(Integer, default=21600) + acttime = Column(Integer, default=3600) + # permanent = Column(Boolean, default=False) + + def __init__(self, chat_id, status, time, acttime): + self.chat_id = str(chat_id) + self.status = status + self.time = time + self.acttime = acttime + # self.permanent = permanent + + +Welcome.__table__.create(checkfirst=True) +WelcomeButtons.__table__.create(checkfirst=True) +GoodbyeButtons.__table__.create(checkfirst=True) +WelcomeMute.__table__.create(checkfirst=True) +WelcomeMuteUsers.__table__.create(checkfirst=True) +CleanServiceSetting.__table__.create(checkfirst=True) +RaidMode.__table__.create(checkfirst=True) + +INSERTION_LOCK = threading.RLock() +WELC_BTN_LOCK = threading.RLock() +LEAVE_BTN_LOCK = threading.RLock() +WM_LOCK = threading.RLock() +CS_LOCK = threading.RLock() +RAID_LOCK = threading.RLock() + + +def welcome_mutes(chat_id): + try: + welcomemutes = SESSION.query(WelcomeMute).get(str(chat_id)) + if welcomemutes: + return welcomemutes.welcomemutes + return False + finally: + SESSION.close() + + +def set_welcome_mutes(chat_id, welcomemutes): + with WM_LOCK: + prev = SESSION.query(WelcomeMute).get((str(chat_id))) + if prev: + SESSION.delete(prev) + welcome_m = WelcomeMute(str(chat_id), welcomemutes) + SESSION.add(welcome_m) + SESSION.commit() + + +def set_human_checks(user_id, chat_id): + with INSERTION_LOCK: + human_check = SESSION.query(WelcomeMuteUsers).get((user_id, str(chat_id))) + if not human_check: + human_check = WelcomeMuteUsers(user_id, str(chat_id), True) + + else: + human_check.human_check = True + + SESSION.add(human_check) + SESSION.commit() + + return human_check + + +def get_human_checks(user_id, chat_id): + try: + human_check = SESSION.query(WelcomeMuteUsers).get((user_id, str(chat_id))) + if not human_check: + return None + human_check = human_check.human_check + return human_check + finally: + SESSION.close() + + +def get_welc_mutes_pref(chat_id): + welcomemutes = SESSION.query(WelcomeMute).get(str(chat_id)) + SESSION.close() + + if welcomemutes: + return welcomemutes.welcomemutes + + return False + + +def get_welc_pref(chat_id): + welc = SESSION.query(Welcome).get(str(chat_id)) + SESSION.close() + if welc: + return ( + welc.should_welcome, + welc.custom_welcome, + welc.custom_content, + welc.welcome_type, + ) + + else: + # Welcome by default. + return True, DEFAULT_WELCOME, None, Types.TEXT + + +def get_gdbye_pref(chat_id): + welc = SESSION.query(Welcome).get(str(chat_id)) + SESSION.close() + if welc: + return welc.should_goodbye, welc.custom_leave, welc.leave_type + else: + # Welcome by default. + return True, DEFAULT_GOODBYE, Types.TEXT + + +def set_clean_welcome(chat_id, clean_welcome): + with INSERTION_LOCK: + curr = SESSION.query(Welcome).get(str(chat_id)) + if not curr: + curr = Welcome(str(chat_id)) + + curr.clean_welcome = int(clean_welcome) + + SESSION.add(curr) + SESSION.commit() + + +def get_clean_pref(chat_id): + welc = SESSION.query(Welcome).get(str(chat_id)) + SESSION.close() + + if welc: + return welc.clean_welcome + + return False + + +def set_welc_preference(chat_id, should_welcome): + with INSERTION_LOCK: + curr = SESSION.query(Welcome).get(str(chat_id)) + if not curr: + curr = Welcome(str(chat_id), should_welcome=should_welcome) + else: + curr.should_welcome = should_welcome + + SESSION.add(curr) + SESSION.commit() + + +def set_gdbye_preference(chat_id, should_goodbye): + with INSERTION_LOCK: + curr = SESSION.query(Welcome).get(str(chat_id)) + if not curr: + curr = Welcome(str(chat_id), should_goodbye=should_goodbye) + else: + curr.should_goodbye = should_goodbye + + SESSION.add(curr) + SESSION.commit() + + +def set_custom_welcome( + chat_id, custom_content, custom_welcome, welcome_type, buttons=None +): + if buttons is None: + buttons = [] + + with INSERTION_LOCK: + welcome_settings = SESSION.query(Welcome).get(str(chat_id)) + if not welcome_settings: + welcome_settings = Welcome(str(chat_id), True) + + if custom_welcome or custom_content: + welcome_settings.custom_content = custom_content + welcome_settings.custom_welcome = custom_welcome + welcome_settings.welcome_type = welcome_type.value + + else: + welcome_settings.custom_welcome = DEFAULT_WELCOME + welcome_settings.welcome_type = Types.TEXT.value + + SESSION.add(welcome_settings) + + with WELC_BTN_LOCK: + prev_buttons = ( + SESSION.query(WelcomeButtons) + .filter(WelcomeButtons.chat_id == str(chat_id)) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + + for b_name, url, same_line in buttons: + button = WelcomeButtons(chat_id, b_name, url, same_line) + SESSION.add(button) + + SESSION.commit() + + +def get_custom_welcome(chat_id): + welcome_settings = SESSION.query(Welcome).get(str(chat_id)) + ret = DEFAULT_WELCOME + if welcome_settings and welcome_settings.custom_welcome: + ret = welcome_settings.custom_welcome + + SESSION.close() + return ret + + +def set_custom_gdbye(chat_id, custom_goodbye, goodbye_type, buttons=None): + if buttons is None: + buttons = [] + + with INSERTION_LOCK: + welcome_settings = SESSION.query(Welcome).get(str(chat_id)) + if not welcome_settings: + welcome_settings = Welcome(str(chat_id), True) + + if custom_goodbye: + welcome_settings.custom_leave = custom_goodbye + welcome_settings.leave_type = goodbye_type.value + + else: + welcome_settings.custom_leave = DEFAULT_GOODBYE + welcome_settings.leave_type = Types.TEXT.value + + SESSION.add(welcome_settings) + + with LEAVE_BTN_LOCK: + prev_buttons = ( + SESSION.query(GoodbyeButtons) + .filter(GoodbyeButtons.chat_id == str(chat_id)) + .all() + ) + for btn in prev_buttons: + SESSION.delete(btn) + + for b_name, url, same_line in buttons: + button = GoodbyeButtons(chat_id, b_name, url, same_line) + SESSION.add(button) + + SESSION.commit() + + +def get_custom_gdbye(chat_id): + welcome_settings = SESSION.query(Welcome).get(str(chat_id)) + ret = DEFAULT_GOODBYE + if welcome_settings and welcome_settings.custom_leave: + ret = welcome_settings.custom_leave + + SESSION.close() + return ret + + +def get_welc_buttons(chat_id): + try: + return ( + SESSION.query(WelcomeButtons) + .filter(WelcomeButtons.chat_id == str(chat_id)) + .order_by(WelcomeButtons.id) + .all() + ) + finally: + SESSION.close() + + +def get_gdbye_buttons(chat_id): + try: + return ( + SESSION.query(GoodbyeButtons) + .filter(GoodbyeButtons.chat_id == str(chat_id)) + .order_by(GoodbyeButtons.id) + .all() + ) + finally: + SESSION.close() + + +def clean_service(chat_id: Union[str, int]) -> bool: + try: + chat_setting = SESSION.query(CleanServiceSetting).get(str(chat_id)) + if chat_setting: + return chat_setting.clean_service + return False + finally: + SESSION.close() + + +def set_clean_service(chat_id: Union[int, str], setting: bool): + with CS_LOCK: + chat_setting = SESSION.query(CleanServiceSetting).get(str(chat_id)) + if not chat_setting: + chat_setting = CleanServiceSetting(chat_id) + + chat_setting.clean_service = setting + SESSION.add(chat_setting) + SESSION.commit() + + +def migrate_chat(old_chat_id, new_chat_id): + with INSERTION_LOCK: + chat = SESSION.query(Welcome).get(str(old_chat_id)) + if chat: + chat.chat_id = str(new_chat_id) + + with WELC_BTN_LOCK: + chat_buttons = ( + SESSION.query(WelcomeButtons) + .filter(WelcomeButtons.chat_id == str(old_chat_id)) + .all() + ) + for btn in chat_buttons: + btn.chat_id = str(new_chat_id) + + with LEAVE_BTN_LOCK: + chat_buttons = ( + SESSION.query(GoodbyeButtons) + .filter(GoodbyeButtons.chat_id == str(old_chat_id)) + .all() + ) + for btn in chat_buttons: + btn.chat_id = str(new_chat_id) + + SESSION.commit() + + +def getRaidStatus(chat_id): + try: + if stat := SESSION.query(RaidMode).get(str(chat_id)): + return stat.status, stat.time, stat.acttime + return False, 21600, 3600 # default + finally: + SESSION.close() + + +def setRaidStatus(chat_id, status, time=21600, acttime=3600): + with RAID_LOCK: + if prevObj := SESSION.query(RaidMode).get(str(chat_id)): + SESSION.delete(prevObj) + newObj = RaidMode(str(chat_id), status, time, acttime) + SESSION.add(newObj) + SESSION.commit() + + +def toggleRaidStatus(chat_id): + newObj = True + with RAID_LOCK: + prevObj = SESSION.query(RaidMode).get(str(chat_id)) + if prevObj: + newObj = not prevObj.status + stat = RaidMode( + str(chat_id), newObj, prevObj.time or 21600, prevObj.acttime or 3600 + ) + SESSION.add(stat) + SESSION.commit() + return newObj + + +def _ResetRaidOnRestart(): + with RAID_LOCK: + raid = SESSION.query(RaidMode).all() + for r in raid: + r.status = False + SESSION.commit() + + +# it uses a cron job to turn off so if the bot restarts and there is a pending raid disable job then raid will stay on +_ResetRaidOnRestart() diff --git a/Exon/modules/stickers.py b/Exon/modules/stickers.py new file mode 100644 index 00000000..223394c3 --- /dev/null +++ b/Exon/modules/stickers.py @@ -0,0 +1,971 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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 +import textwrap +import urllib.request as urllib +from html import escape +from urllib.parse import quote as urlquote + +from bs4 import BeautifulSoup +from cloudscraper import CloudScraper +from PIL import Image, ImageDraw, ImageFont +from telegram import ( + InlineKeyboardButton, + InlineKeyboardMarkup, + ParseMode, + TelegramError, + Update, +) +from telegram.ext import CallbackContext, CallbackQueryHandler +from telegram.utils.helpers import mention_html + +from ABG.covert import convert_gif +from Exon import dispatcher +from Exon import telethn as bot +from Exon.events import register as asau +from Exon.modules.disable import DisableAbleCommandHandler + +combot_stickers_url = "https://combot.org/telegram/stickers?q=" + + +def stickerid(update: Update, context: CallbackContext): + msg = update.effective_message + if msg.reply_to_message and msg.reply_to_message.sticker: + update.effective_message.reply_text( + "Hello " + + f"{mention_html(msg.from_user.id, msg.from_user.first_name)}" + + ", The sticker id you are replying is:\n<code>" + + escape(msg.reply_to_message.sticker.file_id) + + "</code>", + parse_mode=ParseMode.HTML, + ) + else: + update.effective_message.reply_text( + "Hello " + + f"{mention_html(msg.from_user.id, msg.from_user.first_name)}" + + ", Please reply to sticker message to get id sticker", + parse_mode=ParseMode.HTML, + ) + + +scraper = CloudScraper() + + +def get_cbs_data(query, page, user_id): + # returns (text, buttons) + text = scraper.get(f"{combot_stickers_url}{urlquote(query)}&page={page}").text + soup = BeautifulSoup(text, "lxml") + div = soup.find("div", class_="page__container") + packs = div.find_all("a", class_="sticker-pack__btn") + titles = div.find_all("div", "sticker-pack__title") + has_prev_page = has_next_page = None + highlighted_page = div.find("a", class_="pagination__link is-active") + if highlighted_page is not None and user_id is not None: + highlighted_page = highlighted_page.parent + has_prev_page = highlighted_page.previous_sibling.previous_sibling is not None + has_next_page = highlighted_page.next_sibling.next_sibling is not None + buttons = [] + if has_prev_page: + buttons.append( + InlineKeyboardButton(text="⟨", callback_data=f"cbs_{page - 1}_{user_id}") + ) + if has_next_page: + buttons.append( + InlineKeyboardButton(text="⟩", callback_data=f"cbs_{page + 1}_{user_id}") + ) + buttons = InlineKeyboardMarkup([buttons]) if buttons else None + text = f"Stickers for <code>{escape(query)}</code>:\nPage: {page}" + if packs and titles: + for pack, title in zip(packs, titles): + link = pack["href"] + text += f"\n• <a href='{link}'>{escape(title.get_text())}</a>" + elif page == 1: + text = "No results found, try a different term" + else: + text += "\n\nInterestingly, there's nothing here." + return text, buttons + + +def cb_sticker(update: Update, context: CallbackContext): + msg = update.effective_message + query = " ".join(msg.text.split()[1:]) + if not query: + msg.reply_text("Provide some term to search for a sticker pack.") + return + if len(query) > 50: + msg.reply_text("Provide a search query under 50 characters") + return + if msg.from_user: + user_id = msg.from_user.id + else: + user_id = None + text, buttons = get_cbs_data(query, 1, user_id) + msg.reply_text(text, parse_mode=ParseMode.HTML, reply_markup=buttons) + + +def cbs_callback(update: Update, context: CallbackContext): + query = update.callback_query + _, page, user_id = query.data.split("_", 2) + if int(user_id) != query.from_user.id: + query.answer("Not for you", cache_time=60 * 60) + return + search_query = query.message.text.split("\n", 1)[0].split(maxsplit=2)[2][:-1] + text, buttons = get_cbs_data(search_query, int(page), query.from_user.id) + query.edit_message_text(text, parse_mode=ParseMode.HTML, reply_markup=buttons) + query.answer() + + +def getsticker(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message + chat_id = update.effective_chat.id + if msg.reply_to_message and msg.reply_to_message.sticker: + file_id = msg.reply_to_message.sticker.file_id + with BytesIO() as file: + file.name = "sticker.png" + new_file = bot.get_file(file_id) + new_file.download(out=file) + file.seek(0) + bot.send_document(chat_id, document=file) + else: + update.effective_message.reply_text( + "Please reply to a sticker for me to upload its PNG.", + ) + + +def kang(update, context): + msg = update.effective_message + user = update.effective_user + args = context.args + packnum = 0 + packname = "a" + str(user.id) + "_by_" + context.bot.username + packname_found = 0 + max_stickers = 120 + + while packname_found == 0: + try: + stickerset = context.bot.get_sticker_set(packname) + if len(stickerset.stickers) >= max_stickers: + packnum += 1 + packname = ( + "a" + + str(packnum) + + "_" + + str(user.id) + + "_by_" + + context.bot.username + ) + else: + packname_found = 1 + except TelegramError as e: + if e.message == "Stickerset_invalid": + packname_found = 1 + + kangsticker = "kangsticker.png" + is_animated = False + is_video = False + # convert gif method + is_gif = False + file_id = "" + + if msg.reply_to_message: + if msg.reply_to_message.sticker: + if msg.reply_to_message.sticker.is_animated: + is_animated = True + elif msg.reply_to_message.sticker.is_video: + is_video = True + file_id = msg.reply_to_message.sticker.file_id + elif msg.reply_to_message.photo: + file_id = msg.reply_to_message.photo[-1].file_id + elif ( + msg.reply_to_message.document + and not msg.reply_to_message.document.mime_type == "video/mp4" + ): + file_id = msg.reply_to_message.document.file_id + elif msg.reply_to_message.animation: + file_id = msg.reply_to_message.animation.file_id + is_gif = True + else: + msg.reply_text("Yea, I can't kang that.") + kang_file = context.bot.get_file(file_id) + if not is_animated and not (is_video or is_gif): + kang_file.download("kangsticker.png") + elif is_animated: + kang_file.download("kangsticker.tgs") + elif is_video and not is_gif: + kang_file.download("kangsticker.webm") + elif is_gif: + kang_file.download("kang.mp4") + convert_gif("kang.mp4") + + if args: + sticker_emoji = str(args[0]) + elif msg.reply_to_message.sticker and msg.reply_to_message.sticker.emoji: + sticker_emoji = msg.reply_to_message.sticker.emoji + else: + sticker_emoji = "🙂" + + adding_process = msg.reply_text( + "<b>Please wait...For a Moment</b>", + parse_mode=ParseMode.HTML, + ) + + if not is_animated and not (is_video or is_gif): + try: + im = Image.open(kangsticker) + maxsize = (512, 512) + if (im.width and im.height) < 512: + size1 = im.width + size2 = im.height + if im.width > im.height: + scale = 512 / size1 + size1new = 512 + size2new = size2 * scale + else: + scale = 512 / size2 + size1new = size1 * scale + size2new = 512 + size1new = math.floor(size1new) + size2new = math.floor(size2new) + sizenew = (size1new, size2new) + im = im.resize(sizenew) + else: + im.thumbnail(maxsize) + if not msg.reply_to_message.sticker: + im.save(kangsticker, "PNG") + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + png_sticker=open("kangsticker.png", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + + except OSError as e: + + print(e) + return + + except TelegramError as e: + if e.message == "Stickerset_invalid": + makepack_internal( + update, + context, + msg, + user, + sticker_emoji, + packname, + packnum, + png_sticker=open("kangsticker.png", "rb"), + ) + adding_process.delete() + elif e.message == "Sticker_png_dimensions": + im.save(kangsticker, "PNG") + adding_process = msg.reply_text( + "<b>Please wait...For a Moment</b>", + parse_mode=ParseMode.HTML, + ) + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + png_sticker=open("kangsticker.png", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + elif e.message == "Invalid sticker emojis": + msg.reply_text("Invalid emoji(s).") + elif e.message == "Stickers_too_much": + msg.reply_text("Max packsize reached. Press F to pay respecc.") + elif e.message == "Internal Server Error: sticker set not found (500)": + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + msg.reply_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + print(e) + + elif is_animated: + packname = "animated" + str(user.id) + "_by_" + context.bot.username + packname_found = 0 + max_stickers = 50 + while packname_found == 0: + try: + stickerset = context.bot.get_sticker_set(packname) + if len(stickerset.stickers) >= max_stickers: + packnum += 1 + packname = ( + "animated" + + str(packnum) + + "_" + + str(user.id) + + "_by_" + + context.bot.username + ) + else: + packname_found = 1 + except TelegramError as e: + if e.message == "Stickerset_invalid": + packname_found = 1 + try: + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + tgs_sticker=open("kangsticker.tgs", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + except TelegramError as e: + if e.message == "Stickerset_invalid": + makepack_internal( + update, + context, + msg, + user, + sticker_emoji, + packname, + packnum, + tgs_sticker=open("kangsticker.tgs", "rb"), + ) + adding_process.delete() + elif e.message == "Invalid sticker emojis": + msg.reply_text("Invalid emoji(s).") + elif e.message == "Internal Server Error: sticker set not found (500)": + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + print(e) + + elif is_video or is_gif: + packname = "video" + str(user.id) + "_by_" + context.bot.username + packname_found = 0 + max_stickers = 50 + while packname_found == 0: + try: + stickerset = context.bot.get_sticker_set(packname) + if len(stickerset.stickers) >= max_stickers: + packnum += 1 + packname = ( + "video" + + str(packnum) + + "_" + + str(user.id) + + "_by_" + + context.bot.username + ) + else: + packname_found = 1 + except TelegramError as e: + if e.message == "Stickerset_invalid": + packname_found = 1 + try: + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + webm_sticker=open("kangsticker.webm", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + except TelegramError as e: + if e.message == "Stickerset_invalid": + makepack_internal( + update, + context, + msg, + user, + sticker_emoji, + packname, + packnum, + webm_sticker=open("kangsticker.webm", "rb"), + ) + adding_process.delete() + elif e.message == "Invalid sticker emojis": + msg.reply_text("Invalid emoji(s).") + elif e.message == "Internal Server Error: sticker set not found (500)": + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + print(e) + + elif args: + try: + try: + urlemoji = msg.text.split(" ") + png_sticker = urlemoji[1] + sticker_emoji = urlemoji[2] + except IndexError: + sticker_emoji = "🙃" + urllib.urlretrieve(png_sticker, kangsticker) + im = Image.open(kangsticker) + maxsize = (512, 512) + if (im.width and im.height) < 512: + size1 = im.width + size2 = im.height + if im.width > im.height: + scale = 512 / size1 + size1new = 512 + size2new = size2 * scale + else: + scale = 512 / size2 + size1new = size1 * scale + size2new = 512 + size1new = math.floor(size1new) + size2new = math.floor(size2new) + sizenew = (size1new, size2new) + im = im.resize(sizenew) + else: + im.thumbnail(maxsize) + im.save(kangsticker, "PNG") + msg.reply_photo(photo=open("kangsticker.png", "rb")) + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + png_sticker=open("kangsticker.png", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + except OSError as e: + msg.reply_text("I can only kang images m8.") + print(e) + return + except TelegramError as e: + if e.message == "Stickerset_invalid": + makepack_internal( + update, + context, + msg, + user, + sticker_emoji, + packname, + packnum, + png_sticker=open("kangsticker.png", "rb"), + ) + adding_process.delete() + elif e.message == "Sticker_png_dimensions": + im.save(kangsticker, "png") + context.bot.add_sticker_to_set( + user_id=user.id, + name=packname, + png_sticker=open("kangsticker.png", "rb"), + emojis=sticker_emoji, + ) + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="View Pack", url=f"t.me/addstickers/{packname}" + ) + ] + ] + ) + adding_process.edit_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + elif e.message == "Invalid sticker emojis": + msg.reply_text("Invalid emoji(s).") + elif e.message == "Stickers_too_much": + msg.reply_text("Max packsize reached. Press F to pay respect.") + elif e.message == "Internal Server Error: sticker set not found (500)": + msg.reply_text( + f"<b>ʏᴏᴜʀ ꜱᴛɪᴄᴋᴇʀ ʜᴀꜱ ʙᴇᴇɴ ᴀᴅᴅᴇᴅ! \nғᴏʀ ғᴀꜱᴛ ᴜᴘᴅᴀᴛᴇ .ʀᴇᴍᴏᴠᴇ ʏᴏᴜʀ ᴘᴀᴄᴋ.& ᴀᴅᴅ ᴀɢᴀɪɴ </b>" + f"\nᴇᴍᴏᴊɪ ɪꜱ: {sticker_emoji}", + reply_markup=edited_keyboard, + parse_mode=ParseMode.HTML, + ) + print(e) + else: + packs_text = "*Please reply to a sticker, or image to kang it!*\n" + if packnum > 0: + firstpackname = "a" + str(user.id) + "_by_" + context.bot.username + for i in range(0, packnum + 1): + if i == 0: + packs = f"t.me/addstickers/{firstpackname}" + else: + packs = f"t.me/addstickers/{packname}" + else: + packs = f"t.me/addstickers/{packname}" + + edited_keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text="Sticker Pack", url=f"{packs}"), + ], + ] + ) + msg.reply_text( + packs_text, reply_markup=edited_keyboard, parse_mode=ParseMode.MARKDOWN + ) + try: + if os.path.isfile("kangsticker.png"): + os.remove("kangsticker.png") + elif os.path.isfile("kangsticker.tgs"): + os.remove("kangsticker.tgs") + elif os.path.isfile("kangsticker.webm"): + os.remove("kangsticker.webm") + elif os.path.isfile("kang.mp4"): + os.remove("kang.mp4") + except: + pass + + +def makepack_internal( + update, + context, + msg, + user, + emoji, + packname, + packnum, + png_sticker=None, + tgs_sticker=None, + webm_sticker=None, +): + name = user.first_name + name = name[:50] + keyboard = InlineKeyboardMarkup( + [[InlineKeyboardButton(text="View Pack", url=f"t.me/addstickers/{packname}")]] + ) + try: + extra_version = "" + if packnum > 0: + extra_version = " " + str(packnum) + if png_sticker: + sticker_pack_name = ( + f"{name}'s sticker pack (@{context.bot.username})" + extra_version + ) + success = context.bot.create_new_sticker_set( + user.id, + packname, + sticker_pack_name, + png_sticker=png_sticker, + emojis=emoji, + ) + if tgs_sticker: + sticker_pack_name = ( + f"{name}'s animated pack (@{context.bot.username})" + extra_version + ) + success = context.bot.create_new_sticker_set( + user.id, + packname, + sticker_pack_name, + tgs_sticker=tgs_sticker, + emojis=emoji, + ) + if webm_sticker: + sticker_pack_name = ( + f"{name}'s video pack (@{context.bot.username})" + extra_version + ) + success = context.bot.create_new_sticker_set( + user.id, + packname, + sticker_pack_name, + webm_sticker=webm_sticker, + emojis=emoji, + ) + + except TelegramError as e: + print(e) + if e.message == "Sticker set name is already occupied": + msg.reply_text( + "<b>Your Sticker Pack is already created!</b>" + "\n\nYou can now reply to images, stickers and animated sticker with /steal to add them to your pack" + "\n\n<b>Send /stickers to find any sticker pack.</b>", + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + elif e.message == "Peer_id_invalid" or "bot was blocked by the user": + msg.reply_text( + f"{context.bot.first_name} was blocked by you.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="Unblock", url=f"t.me/{context.bot.username}" + ) + ] + ] + ), + ) + elif e.message == "Internal Server Error: created sticker set not found (500)": + msg.reply_text( + "<b>Your Sticker Pack has been created!</b>" + "\n\nYou can now reply to images, stickers and animated sticker with /steal to add them to your pack" + "\n\n<b>Send /stickers to find sticker pack.</b>", + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + return + + if success: + msg.reply_text( + "<b>Your Sticker Pack has been created!</b>" + "\n\nYou can now reply to images, stickers and animated sticker with /steal to add them to your pack" + "\n\n<b>Send /stickers to find sticker pack.</b>", + reply_markup=keyboard, + parse_mode=ParseMode.HTML, + ) + else: + msg.reply_text("Failed to create sticker pack. Possibly due to blek mejik.") + + +def getsticker(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message + chat_id = update.effective_chat.id + if msg.reply_to_message and msg.reply_to_message.sticker: + file_id = msg.reply_to_message.sticker.file_id + new_file = bot.get_file(file_id) + new_file.download("sticker.png") + bot.send_document(chat_id, document=open("sticker.png", "rb")) + os.remove("sticker.png") + else: + update.effective_message.reply_text( + "Please reply to a sticker for me to upload its PNG." + ) + + +def getvidsticker(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message + chat_id = update.effective_chat.id + if msg.reply_to_message and msg.reply_to_message.sticker: + file_id = msg.reply_to_message.sticker.file_id + new_file = bot.get_file(file_id) + new_file.download("sticker.mp4") + bot.send_video(chat_id, video=open("sticker.mp4", "rb")) + os.remove("sticker.mp4") + else: + update.effective_message.reply_text( + "Please reply to a video sticker to upload its MP4." + ) + + +def delsticker(update, context): + msg = update.effective_message + if msg.reply_to_message and msg.reply_to_message.sticker: + file_id = msg.reply_to_message.sticker.file_id + context.bot.delete_sticker_from_set(file_id) + msg.reply_text("Deleted!") + else: + update.effective_message.reply_text( + "Please reply to sticker message to del sticker" + ) + + +def video(update: Update, context: CallbackContext): + bot = context.bot + msg = update.effective_message + chat_id = update.effective_chat.id + if msg.reply_to_message and msg.reply_to_message.animation: + file_id = msg.reply_to_message.animation.file_id + new_file = bot.get_file(file_id) + new_file.download("video.mp4") + bot.send_video(chat_id, video=open("video.mp4", "rb")) + os.remove("video.mp4") + else: + update.effective_message.reply_text( + "Please reply to a gif for me to get it's video." + ) + + +@asau(pattern="^/mmf ?(.*)") +async def handler(event): + if event.fwd_from: + return + if not event.reply_to_msg_id: + await event.reply("Reply to an image or a sticker to memeify it Nigga!!") + return + reply_message = await event.get_reply_message() + if not reply_message.media: + await event.reply("Provide some Text please") + return + file = await bot.download_media(reply_message) + msg = await event.reply("Memifying this image! Please wait") + + text = str(event.pattern_match.group(1)).strip() + if len(text) < 1: + return await msg.edit("You might want to try `/mmf text`") + meme = await drawText(file, text) + await bot.send_file(event.chat_id, file=meme, force_document=False) + await msg.delete() + os.remove(meme) + + +async def drawText(image_path, text): + img = Image.open(image_path) + os.remove(image_path) + i_width, i_height = img.size + if os.name == "nt": + fnt = "ariel.ttf" + else: + fnt = "./Exon/resources/default.ttf" + m_font = ImageFont.truetype(fnt, 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): + u_width, u_height = draw.textsize(u_text, font=m_font) + draw.text( + xy=(((i_width - u_width) / 2) - 2, int((current_h / 640) * i_width)), + text=u_text, + font=m_font, + fill=(0, 0, 0), + ) + + draw.text( + xy=(((i_width - u_width) / 2) + 2, int((current_h / 640) * i_width)), + text=u_text, + font=m_font, + fill=(0, 0, 0), + ) + draw.text( + xy=((i_width - u_width) / 2, int(((current_h / 640) * i_width)) - 2), + text=u_text, + font=m_font, + fill=(0, 0, 0), + ) + + draw.text( + xy=(((i_width - u_width) / 2), int(((current_h / 640) * i_width)) + 2), + text=u_text, + font=m_font, + fill=(0, 0, 0), + ) + + 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): + u_width, u_height = draw.textsize(l_text, font=m_font) + draw.text( + xy=( + ((i_width - u_width) / 2) - 2, + i_height - u_height - int((20 / 640) * i_width), + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + ) + draw.text( + xy=( + ((i_width - u_width) / 2) + 2, + i_height - u_height - int((20 / 640) * i_width), + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + ) + draw.text( + xy=( + (i_width - u_width) / 2, + (i_height - u_height - int((20 / 640) * i_width)) - 2, + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + ) + draw.text( + xy=( + (i_width - u_width) / 2, + (i_height - u_height - int((20 / 640) * i_width)) + 2, + ), + text=l_text, + font=m_font, + fill=(0, 0, 0), + ) + + draw.text( + xy=( + (i_width - u_width) / 2, + i_height - u_height - int((20 / 640) * i_width), + ), + text=l_text, + font=m_font, + fill=(255, 255, 255), + ) + current_h += u_height + pad + image_name = "memify.webp" + webp_file = os.path.join(image_name) + img.save(webp_file, "webp") + return webp_file + + +__mod_name__ = "𝚂ᴛɪᴄᴋᴇʀ" + +__help__ = """ +*ʜᴇʟᴘ ᴍᴇɴᴜ ғᴏʀ ꜱᴛɪᴄᴋᴇʀꜱ ᴛᴏᴏʟꜱ* + +•➥ /stickerid*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ꜱᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴛᴇʟʟ ʏᴏᴜ ɪᴛꜱ ғɪʟᴇ ɪᴅ`. + +•➥ /getsticker*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ꜱᴛɪᴄᴋᴇʀ ᴛᴏ ᴍᴇ ᴛᴏ ᴜᴘʟᴏᴀᴅ ɪᴛꜱ ʀᴀᴡ ᴘɴɢ ғɪʟᴇ.` + +•➥ /kang*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ꜱᴛɪᴄᴋᴇʀ ᴛᴏ ᴀᴅᴅ ɪᴛ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ`. + +•➥ /delsticker*:* `ʀᴇᴘʟʏ ᴛᴏ ʏᴏᴜʀ ᴀɴɪᴍᴇ ᴇxɪꜱᴛ ꜱᴛɪᴄᴋᴇʀ ᴛᴏ ʏᴏᴜʀ ᴘᴀᴄᴋ ᴛᴏ ᴅᴇʟᴇᴛᴇ ɪᴛ.` + +•➥ /stickers*:* `ғɪɴᴅ ꜱᴛɪᴄᴋᴇʀꜱ ғᴏʀ ɢɪᴠᴇɴ ᴛᴇʀᴍ ᴏɴ ᴄᴏᴍʙᴏᴛ ꜱᴛɪᴄᴋᴇʀ ᴄᴀᴛᴀʟᴏɢᴜᴇ` + +•➥ /mmf <reply with text>*:* `ᴛᴏ ᴅʀᴀᴡ a ᴛᴇxᴛ ғᴏʀ ꜱᴛɪᴄᴋᴇʀ ᴏʀ ᴘᴏʜᴏᴛꜱ` +""" + + +STICKERID_HANDLER = DisableAbleCommandHandler("stickerid", stickerid, run_async=True) +GETSTICKER_HANDLER = DisableAbleCommandHandler("getsticker", getsticker, run_async=True) +GETVIDSTICKER_HANDLER = DisableAbleCommandHandler( + "getvidsticker", getvidsticker, run_async=True +) +KANG_HANDLER = DisableAbleCommandHandler("kang", kang, pass_args=True, run_async=True) +DEL_HANDLER = DisableAbleCommandHandler("delsticker", delsticker, run_async=True) +STICKERS_HANDLER = DisableAbleCommandHandler("stickers", cb_sticker, run_async=True) +VIDEO_HANDLER = DisableAbleCommandHandler("getvideo", video, run_async=True) +CBSCALLBACK_HANDLER = CallbackQueryHandler(cbs_callback, pattern="cbs_", run_async=True) + +dispatcher.add_handler(VIDEO_HANDLER) +dispatcher.add_handler(CBSCALLBACK_HANDLER) +dispatcher.add_handler(STICKERS_HANDLER) +dispatcher.add_handler(STICKERID_HANDLER) +dispatcher.add_handler(GETSTICKER_HANDLER) +dispatcher.add_handler(GETVIDSTICKER_HANDLER) +dispatcher.add_handler(KANG_HANDLER) +dispatcher.add_handler(DEL_HANDLER) diff --git a/Exon/modules/tagall.py b/Exon/modules/tagall.py new file mode 100644 index 00000000..050fcf62 --- /dev/null +++ b/Exon/modules/tagall.py @@ -0,0 +1,128 @@ +""" +MIT License +Copyright (c) 2022 Aʙɪsʜɴᴏɪ +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import asyncio + +from telethon import events +from telethon.errors import UserNotParticipantError +from telethon.tl.functions.channels import GetParticipantRequest +from telethon.tl.types import ChannelParticipantAdmin, ChannelParticipantCreator + +from Exon import telethn as client + +spam_chats = [] + + +@client.on(events.NewMessage(pattern="^/tagall|@all|/all ?(.*)")) +async def mentionall(event): + chat_id = event.chat_id + if event.is_private: + return await event.respond( + "__ᴛʜɪꜱ ᴄᴏᴍᴍᴀɴᴅ ᴄᴀɴ ʙᴇ ᴜꜱᴇ ɪɴ ɢʀᴏᴜᴘꜱ ᴀɴᴅ ᴄʜᴀɴɴᴇʟꜱ!__" + ) + + is_admin = False + try: + partici_ = await client(GetParticipantRequest(event.chat_id, event.sender_id)) + except UserNotParticipantError: + is_admin = False + else: + if isinstance( + partici_.participant, (ChannelParticipantAdmin, ChannelParticipantCreator) + ): + is_admin = True + if not is_admin: + return await event.reply("__ᴏɴʟʏ ᴀᴅᴍɪɴꜱ ᴄᴀɴ ᴍᴇɴᴛɪᴏɴ ᴀʟʟ!__") + + if event.pattern_match.group(1) and event.is_reply: + return await event.reply("__ɢɪᴠᴇ ᴍᴇ ᴏɴᴇ ᴀʀɢᴜᴍᴇɴᴛ!__") + elif event.pattern_match.group(1): + mode = "text_on_cmd" + msg = event.pattern_match.group(1) + elif event.is_reply: + mode = "text_on_reply" + msg = await event.get_reply_message() + if msg == None: + return await event.respond( + "__I ᴄᴀɴ'ᴛ ᴍᴇɴᴛɪᴏɴ ᴍᴇᴍʙᴇʀꜱ ғᴏʀ ᴏʟᴅᴇʀ ᴍᴇꜱꜱᴀɢᴇꜱ! (ᴍᴇꜱꜱᴀɢᴇꜱ ᴡʜɪᴄʜ ᴀʀᴇ ꜱᴇɴᴛ ʙᴇғᴏʀᴇ ɪ'ᴍ ᴀᴅᴅᴇᴅ ᴛᴏ ɢʀᴏᴜᴘ)__" + ) + else: + return await event.reply( + "__ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴍᴇꜱꜱᴀɢᴇ ᴏʀ ɢɪᴠᴇ ᴍᴇ ꜱᴏᴍᴇ ᴛᴇxᴛ ᴛᴏ ᴍᴇɴᴛɪᴏɴ ᴏᴛʜᴇʀꜱ!__" + ) + + spam_chats.append(chat_id) + usrnum = 0 + usrtxt = "" + async for usr in client.iter_participants(chat_id): + if not chat_id in spam_chats: + break + usrnum += 1 + usrtxt += f"[{usr.first_name}](tg://user?id={usr.id}), " + if usrnum == 5: + if mode == "text_on_cmd": + txt = f"{msg}\n{usrtxt}" + await client.send_message(chat_id, txt) + elif mode == "text_on_reply": + await msg.reply(usrtxt) + await asyncio.sleep(2) + usrnum = 0 + usrtxt = "" + try: + spam_chats.remove(chat_id) + except: + pass + + +@client.on(events.NewMessage(pattern="^/cancel$")) +async def cancel_spam(event): + is_admin = False + try: + partici_ = await client(GetParticipantRequest(event.chat_id, event.sender_id)) + except UserNotParticipantError: + is_admin = False + else: + if isinstance( + partici_.participant, (ChannelParticipantAdmin, ChannelParticipantCreator) + ): + is_admin = True + if not is_admin: + return await event.reply("__ᴏɴʟʏ ᴀᴅᴍɪɴꜱ ᴄᴀɴ ᴇxᴇᴄᴜᴛᴇ ᴛʜɪꜱ ᴄᴏᴍᴍᴀɴᴅ!__") + if not event.chat_id in spam_chats: + return await event.reply("__ᴛʜᴇʀᴇ ɪꜱ ɴᴏ ᴘʀᴏᴄᴄᴇꜱꜱ ᴏɴ ɢᴏɪɴɢ...__") + else: + try: + spam_chats.remove(event.chat_id) + except: + pass + return await event.respond("__ꜱᴛᴏᴘᴘᴇᴅ ᴍᴇɴᴛɪᴏɴ.__") + + +__mod_name__ = "𝚃ᴀɢɢᴇʀ" +__help__ = """ +⍟ /tagall : ` ᴍᴇɴᴛɪᴏɴ ᴀʟʟ ᴍᴇᴍʙᴇʀs` + +ᴇɢ:- /tagall <ʀᴇᴘʟʏ> +""" diff --git a/Exon/modules/telegraph.py b/Exon/modules/telegraph.py new file mode 100644 index 00000000..c3fb7f37 --- /dev/null +++ b/Exon/modules/telegraph.py @@ -0,0 +1,128 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import os +from datetime import datetime + +from PIL import Image +from telegraph import Telegraph, exceptions, upload_file + +from Exon import telethn +from Exon.events import register + +TMP_DOWNLOAD_DIRECTORY = "tg-File/" +babe = "ExonRobot" # ᴅᴏɴ'ᴛ ᴇᴅɪᴛ ᴛʜɪᴀ ʟɪɴᴇ +telegraph = Telegraph() +r = telegraph.create_account(short_name=babe) +auth_url = r["auth_url"] + + +@register(pattern="^/t(gm|gt) ?(.*)") +async def _(event): + if event.fwd_from: + return + optional_title = event.pattern_match.group(2) + if event.reply_to_msg_id: + start = datetime.now() + r_message = await event.get_reply_message() + input_str = event.pattern_match.group(1) + if input_str == "gm": + downloaded_file_name = await telethn.download_media( + r_message, TMP_DOWNLOAD_DIRECTORY + ) + end = datetime.now() + ms = (end - start).seconds + h = await event.reply( + "ᴅᴏᴡɴʟᴏᴀᴅᴇᴅ ᴛᴏ {} in {} sᴇᴄᴏɴᴅs.".format(downloaded_file_name, ms) + ) + if downloaded_file_name.endswith((".webp")): + resize_image(downloaded_file_name) + try: + start = datetime.now() + media_urls = upload_file(downloaded_file_name) + except exceptions.TelegraphException as exc: + await h.edit("ᴇʀʀᴏʀ: " + str(exc)) + os.remove(downloaded_file_name) + else: + end = datetime.now() + ms_two = (end - start).seconds + os.remove(downloaded_file_name) + await h.edit( + "ᴜᴘʟᴏᴀᴅᴇᴅ ᴛᴏ [ᴛᴇʟᴇɢʀᴀᴘʜ](https://telegra.ph{}) ɪɴ {} sᴇᴄᴏɴᴅs.".format( + media_urls[0], (ms + ms_two) + ), + link_preview=True, + ) + elif input_str == "gt": + user_object = await telethn.get_entity(r_message.sender_id) + title_of_page = user_object.first_name # + " " + user_object.last_name + # apparently, all Users do not have last_name field + if optional_title: + title_of_page = optional_title + page_content = r_message.message + if r_message.media: + if page_content != "": + title_of_page = page_content + downloaded_file_name = await telethn.download_media( + r_message, TMP_DOWNLOAD_DIRECTORY + ) + m_list = None + with open(downloaded_file_name, "rb") as fd: + m_list = fd.readlines() + for m in m_list: + page_content += m.decode("UTF-8") + "\n" + os.remove(downloaded_file_name) + page_content = page_content.replace("\n", "<br>") + response = telegraph.create_page(title_of_page, html_content=page_content) + end = datetime.now() + ms = (end - start).seconds + await event.reply( + "ᴘᴀsᴛᴇᴅ ᴛᴏ [ᴛᴇʟᴇɢʀᴀᴘʜ](https://telegra.ph/{}) ɪɴ {} sᴇᴄᴏɴᴅs.".format( + response["path"], ms + ), + link_preview=True, + ) + else: + await event.reply("ʀᴇᴘʟʏ ᴛᴏ a ᴍᴇssᴀɢᴇ ᴛᴏ ɢᴇᴛ ᴀ ᴘᴇʀᴍᴀɴᴇɴᴛ telegra.ph ʟɪɴᴋ.") + + +def resize_image(image): + im = Image.open(image) + im.save(image, "PNG") + + +file_help = os.path.basename(__file__) +file_help = file_help.replace(".py", "") +file_helpo = file_help.replace("_", " ") + + +__help__ = """ +ᴛᴇʟᴇɢʀᴀᴘʜ: + +⍟ /tgm*:* `ɢᴇᴛ ᴛᴇʟᴇɢʀᴀᴘʜ ʟɪɴᴋ ᴏғ ʀᴇᴘʟɪᴇᴅ ᴍᴇᴅɪᴀ ` + +⍟ /tgt*:* `ɢᴇᴛ ᴛᴇʟᴇɢʀᴀᴘʜ Link ᴏғ ʀᴇᴘʟɪᴇᴅ ᴛᴇxᴛ ` + """ + +__mod_name__ = "𝚃ᴇʟᴇɢʀᴀᴘʜ" diff --git a/Exon/modules/telethon.py b/Exon/modules/telethon.py new file mode 100644 index 00000000..68f50a1e --- /dev/null +++ b/Exon/modules/telethon.py @@ -0,0 +1,97 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 io +import sys +import traceback + +from telethon.sync import events + +from Exon import telethn as client + +# telethon eval + + +@client.on( + events.NewMessage(from_users=[1452219013], pattern="^/te ?(.*)") +) # add owner/dev id here +async def eval(event): + if event.fwd_from: + return + cmd = "".join(event.message.message.split(maxsplit=1)[1:]) + if not cmd: + return + catevent = await client.send_message(event.chat.id, "ʀᴜɴɴɪɴɢ ...", reply_to=event) + old_stderr = sys.stderr + old_stdout = sys.stdout + redirected_output = sys.stdout = io.StringIO() + redirected_error = sys.stderr = io.StringIO() + stdout, stderr, exc = None, None, None + try: + await aexec(cmd, event) + except Exception: + exc = traceback.format_exc() + stdout = redirected_output.getvalue() + stderr = redirected_error.getvalue() + sys.stdout = old_stdout + sys.stderr = old_stderr + evaluation = "" + if exc: + evaluation = exc + elif stderr: + evaluation = stderr + elif stdout: + evaluation = stdout + else: + evaluation = "sᴜᴄᴄᴇss" + final_output = f"**• ᴇᴠᴀʟ : **\n{cmd} \n\n**• ʀᴇsᴜʟᴛ : **\n{evaluation} \n" + MAX_MESSAGE_SIZE_LIMIT = 4095 + if len(final_output) > MAX_MESSAGE_SIZE_LIMIT: + with io.BytesIO(str.encode(final_output)) as out_file: + out_file.name = "eval.text" + await client.send_file( + event.chat_id, + out_file, + force_document=True, + allow_cache=False, + caption=cmd, + ) + else: + await catevent.edit(final_output) + + +async def aexec(code, smessatatus): + message = event = smessatatus + + def p(_x): + return print(slitu.yaml_format(_x)) + + reply = await event.get_reply_message() + exec( + "async def __aexec(message, reply, client, p): " + + "\n event = smessatatus = message" + + "".join(f"\n {l}" for l in code.split("\n")) + ) + return await locals()["__aexec"](message, reply, client, p) diff --git a/Exon/modules/truthdare.py b/Exon/modules/truthdare.py new file mode 100644 index 00000000..c64221a2 --- /dev/null +++ b/Exon/modules/truthdare.py @@ -0,0 +1,44 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 requests + +from Exon.events import register + + +@register(pattern="[/!]dare") +async def dare(event): + gay = requests.get("https://api.truthordarebot.xyz/v1/dare").json() + dare = gay["question"] + BOOB = "{}" + await event.reply(BOOB.format(dare)) + + +@register(pattern="[/!]truth") +async def truth(event): + gae = requests.get("https://api.truthordarebot.xyz/v1/truth").json() + truth = gae["question"] + BOOB = "{}" + + await event.reply(BOOB.format(truth)) diff --git a/Exon/modules/tts.py b/Exon/modules/tts.py new file mode 100644 index 00000000..c5919fd0 --- /dev/null +++ b/Exon/modules/tts.py @@ -0,0 +1,88 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import os + +from gtts import gTTS, gTTSError + +from Exon import telethn as tbot +from Exon.events import register + + +@register(pattern="^/tts (.*)") +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + reply_to_id = event.message.id + if event.reply_to_msg_id: + previous_message = await event.get_reply_message() + text = previous_message.message + lan = input_str + elif "|" in input_str: + lan, text = input_str.split("|") + else: + await event.reply("ɪɴᴠᴀʟɪᴅ ꜱʏɴᴛᴀx\nғᴏʀ eg: `/tts en | hello`") + return + text = text.strip() + lan = lan.strip() + try: + tts = gTTS(text, tld="com", lang=lan) + tts.save("k.mp3") + except AssertionError: + await event.reply( + "ᴛʜᴇ ᴛᴇxᴛ ɪs ᴇᴍᴘᴛʏ.\n" + "ɴᴏᴛʜɪɴɢ ʟᴇғᴛ ᴛᴏ sᴘᴇᴀᴋ ᴀғᴛᴇʀ ᴘʀᴇ-ᴘʀᴇᴄᴇssɪɴɢ, " + "ᴛᴏᴋᴇɴɪᴢɪɴɢ ᴀɴᴅ ᴄʟᴇᴀɴɪɴɢ." + ) + return + except ValueError: + await event.reply("ʟᴀɴɢᴜᴀɢᴇ ɪs ɴᴏᴛ sᴜᴘᴘᴏʀᴛᴇᴅ.") + return + except RuntimeError: + await event.reply("ᴇʀʀᴏʀ ʟᴏᴀᴅɪɴɢ ᴛʜᴇ ʟᴀɴɢᴜᴀɢᴇs ᴅɪᴄᴛɪᴏɴᴀʀʏ.") + return + except gTTSError: + await event.reply("ᴇʀʀᴏʀ ɪɴ ɢᴏᴏɢʟᴇ ᴛᴇxᴛ-ᴛᴏ-sᴘᴇᴇᴄʜ ᴀᴘɪ ʀᴇǫᴜᴇsᴛ !") + return + with open("k.mp3", "r"): + await tbot.send_file( + event.chat_id, "k.mp3", voice_note=True, reply_to=reply_to_id + ) + os.remove("k.mp3") + + +__help__ = """ + +⍟ /tts hi|hello *:* `ᴛᴇxᴛ ᴛᴏ sᴘᴇᴇᴄʜ ` + + +""" + +__mod_name__ = "𝚃ᴛs" diff --git a/Exon/modules/ud.py b/Exon/modules/ud.py new file mode 100644 index 00000000..7c24ce95 --- /dev/null +++ b/Exon/modules/ud.py @@ -0,0 +1,48 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 requests +from telethon import Button + +from Exon.events import register as asau + + +@asau(pattern="[/!]ud") +async def ud_(e): + try: + text = e.text.split(" ", maxsplit=1)[1] + except IndexError: + return await e.reply("ɪɴᴠᴀʟɪᴅ ᴀʀɢs") + results = requests.get( + f"https://api.urbandictionary.com/v0/define?term={text}" + ).json() + try: + reply_txt = f'<bold>{text}</bold>\n\n{results["list"][0]["definition"]}\n\n<i>{results["list"][0]["ᴇxᴀᴍᴘʟᴇ"]}</i>' + except: + reply_txt = "ɴᴏ ʀᴇsᴜʟᴛs ғᴏᴜɴᴅ." + await e.reply( + reply_txt, + buttons=Button.url("🔎 ɢᴏᴏɢʟᴇ ɪᴛ!", f"https://www.google.com/search?q={text}"), + parse_mode="html", + ) diff --git a/Exon/modules/userinfo.py b/Exon/modules/userinfo.py new file mode 100644 index 00000000..76d31214 --- /dev/null +++ b/Exon/modules/userinfo.py @@ -0,0 +1,224 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html + +from telegram import MAX_MESSAGE_LENGTH, ParseMode, Update +from telegram.ext.dispatcher import CallbackContext +from telegram.utils.helpers import escape_markdown + +import Exon.modules.sql.userinfo_sql as sql +from Exon import DEV_USERS +from Exon import DRAGONS as SUDO_USERS +from Exon.modules.helper_funcs.decorators import Exoncmd +from Exon.modules.helper_funcs.extraction import extract_user + + +@Exoncmd(command="me", pass_args=True) +def about_me(update: Update, context: CallbackContext): + args = context.args + bot = context.bot + message = update.effective_message + user_id = extract_user(message, args) + + user = bot.get_chat(user_id) if user_id else message.from_user + info = sql.get_user_me_info(user.id) + + if info: + update.effective_message.reply_text( + f"*{user.first_name}*:\n{escape_markdown(info)}", + parse_mode=ParseMode.MARKDOWN, + ) + elif message.reply_to_message: + username = message.reply_to_message.from_user.first_name + update.effective_message.reply_text( + f"{username} ʜᴀsɴ'ᴛ sᴇᴛ ᴀɴ ɪɴғᴏ ᴍᴇssᴀɢᴇ ᴀʙᴏᴜᴛ ᴛʜᴇᴍsᴇʟᴠᴇs ʏᴇᴛ!" + ) + else: + update.effective_message.reply_text( + "ʏᴏᴜ haven't sᴇᴛ ᴀɴ ɪɴғᴏ ᴍᴇssᴀɢᴇ ᴀʙᴏᴜᴛ ʏᴏᴜʀsᴇʟғ ʏᴇᴛ!" + ) + + +@Exoncmd(command="setme") +def set_about_me(update: Update, context: CallbackContext): + bot = context.bot + message = update.effective_message + user_id = message.from_user.id + if user_id in (777000, 1087968824): + message.reply_text("ᴅᴏɴ'ᴛ sᴇᴛ ɪɴғᴏ ғᴏʀ ᴛᴇʟᴇɢʀᴀᴍ ʙᴏᴛs!") + return + if message.reply_to_message: + repl_message = message.reply_to_message + repl_user_id = repl_message.from_user.id + if repl_user_id == bot.id and (user_id in SUDO_USERS or user_id in DEV_USERS): + user_id = repl_user_id + + text = message.text + info = text.split(None, 1) + + if len(info) == 2: + if len(info[1]) < MAX_MESSAGE_LENGTH // 4: + sql.set_user_me_info(user_id, info[1]) + if user_id == bot.id: + message.reply_text("ᴜᴘᴅᴀᴛᴇᴅ ᴍʏ ɪɴғᴏ!") + else: + message.reply_text("ᴜᴘᴅᴀᴛᴇᴅ ʏᴏᴜʀ ɪɴғᴏ!") + else: + message.reply_text( + "ᴛʜᴇ ɪɴғᴏ ɴᴇᴇᴅs ᴛᴏ ʙᴇ ᴜɴᴅᴇʀ {} ᴄʜᴀʀᴀᴄᴛᴇʀs! ʏᴏᴜ ʜᴀᴠᴇ {}.".format( + MAX_MESSAGE_LENGTH // 4, len(info[1]) + ) + ) + + +@Exoncmd(command="bio", pass_args=True) +def about_bio(update: Update, context: CallbackContext): + args = context.args + bot = context.bot + message = update.effective_message + + user_id = extract_user(message, args) + user = bot.get_chat(user_id) if user_id else message.from_user + info = sql.get_user_bio(user.id) + + if info: + update.effective_message.reply_text( + "*{}*:\n{}".format(user.first_name, escape_markdown(info)), + parse_mode=ParseMode.MARKDOWN, + ) + elif message.reply_to_message: + username = user.first_name + update.effective_message.reply_text( + f"{username} ʜᴀsɴ'ᴛ ʜᴀᴅ ᴀ ᴍᴇssᴀɢᴇ sᴇᴛ ᴀʙᴏᴜᴛ ᴛʜᴇᴍsᴇʟᴠᴇs ʏᴇᴛ!" + ) + else: + update.effective_message.reply_text( + "ʏᴏᴜ ʜᴀᴠᴇɴ'ᴛ ʜᴀᴅ a ʙɪᴏ sᴇᴛ ᴀʙᴏᴜᴛ ʏᴏᴜʀsᴇʟғ ʏᴇᴛ!" + ) + message = update.effective_message + if message.reply_to_message: + repl_message = message.reply_to_message + user_id = repl_message.from_user.id + + if user_id == message.from_user.id: + message.reply_text( + "ʜɪʜɪ ᴏɴɪᴄʜᴀɴ, ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ʏᴏᴜʀ ᴏᴡɴ ʙɪᴏ! ʏᴏᴜ'ʀᴇ ᴀᴛ ᴛʜᴇ ᴍᴇʀᴄʏ ᴏғ ᴏᴛʜᴇʀs ʜᴇʀᴇ..." + ) + return + + sender_id = update.effective_user.id + + if ( + user_id == bot.id + and sender_id not in SUDO_USERS + and sender_id not in DEV_USERS + ): + message.reply_text( + "ᴇʀᴍ... ʏᴇᴀʜ, I ᴏɴʟʏ ᴛʀᴜsᴛ ᴍʏ ғᴀᴍɪʟʏ ᴏʀ ʙᴇsᴛ ғʀɪᴇɴᴅs ᴛᴏ sᴇᴛ ᴍʏ ʙɪᴏ." + ) + return + + text = message.text + # use python's maxsplit to only remove the cmd, hence keeping newlines. + bio = text.split(None, 1) + + if len(bio) == 2: + if len(bio[1]) < MAX_MESSAGE_LENGTH // 4: + sql.set_user_bio(user_id, bio[1]) + message.reply_text( + "ᴜᴘᴅᴀᴛᴇᴅ {}'s ʙɪᴏ!".format(repl_message.from_user.first_name) + ) + else: + message.reply_text( + "A ʙɪᴏ needs ᴛᴏ ʙᴇ ᴜɴᴅᴇʀ {} ᴄʜᴀʀᴀᴄᴛᴇʀs! ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ {}.".format( + MAX_MESSAGE_LENGTH // 4, len(bio[1]) + ) + ) + else: + message.reply_text("ʀᴇᴘʟʏ ᴛᴏ sᴏᴍᴇᴏɴᴇ's ᴍᴇssᴀɢᴇ ᴛᴏ sᴇᴛ ᴛʜᴇɪʀ ʙɪᴏ!") + + +@Exoncmd(command="setbio") +def set_about_bio(update: Update, context: CallbackContext): + message = update.effective_message + sender_id = update.effective_user.id + bot = context.bot + + if message.reply_to_message: + repl_message = message.reply_to_message + user_id = repl_message.from_user.id + if user_id in (777000, 1087968824): + message.reply_text("ᴅᴏɴ'ᴛ sᴇᴛ ʙɪᴏ ғᴏʀ ᴛᴇʟᴇɢʀᴀᴍ ʙᴏᴛs!") + return + + if user_id == message.from_user.id: + message.reply_text( + "ʜɪʜɪ ᴏɴ ɪ ᴄʜᴀɴ, ʏᴏᴜ ᴄᴀɴ'ᴛ sᴇᴛ ʏᴏᴜʀ ᴏᴡɴ ʙɪᴏ! ʏᴏᴜ'ʀᴇ ᴀᴛ ᴛʜᴇ ᴍᴇʀᴄʏ ᴏғ ᴏᴛʜᴇʀs ʜᴇʀᴇ..." + ) + return + + if user_id in [777000, 1087968824] and sender_id not in DEV_USERS: + message.reply_text("ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀᴜᴛʜᴏʀɪsᴇᴅ") + return + + if user_id == bot.id and sender_id not in DEV_USERS: + message.reply_text("ᴇʀᴍ... ʏᴇᴀʜ, ɪ ᴏɴʟʏ ᴛʀᴜsᴛ ᴍʏ ғᴀᴍɪʟʏ ᴛᴏ sᴇᴛ ᴍʏ ʙɪᴏ.") + return + + text = message.text + bio = text.split( + None, 1 + ) # use python's maxsplit to only remove the cmd, hence keeping newlines. + + if len(bio) == 2: + if len(bio[1]) < MAX_MESSAGE_LENGTH // 4: + sql.set_user_bio(user_id, bio[1]) + message.reply_text( + "ᴜᴘᴅᴀᴛᴇᴅ {}'s ʙɪᴏ!".format(repl_message.from_user.first_name) + ) + else: + message.reply_text( + "ʙɪᴏ ɴᴇᴇᴅs ᴛᴏ ʙᴇ ᴜɴᴅᴇʀ {} ᴄʜᴀʀᴀᴄᴛᴇʀs! ʏᴏᴜ ᴛʀɪᴇᴅ ᴛᴏ sᴇᴛ {}.".format( + MAX_MESSAGE_LENGTH // 4, len(bio[1]) + ) + ) + else: + message.reply_text("ʀᴇᴘʟʏ ᴛᴏ sᴏᴍᴇᴏɴᴇ ᴛᴏ sᴇᴛ ᴛʜᴇɪʀ ʙɪᴏ!") + + +def __user_info__(user_id): + bio = html.escape(sql.get_user_bio(user_id) or "") + me = html.escape(sql.get_user_me_info(user_id) or "") + if bio and me: + return f"\n<b>ᴀʙᴏᴜᴛ ᴜsᴇʀ:</b>\n{me}\n<b>ᴡʜᴀᴛ ᴏᴛʜᴇʀs sᴀʏ:</b>\n{bio}\n" + elif bio: + return f"\n<b>ᴡʜᴀᴛ ᴏᴛʜᴇʀs sᴀʏ:</b>\n{bio}\n" + elif me: + return f"\n<b>ᴀʙᴏᴜᴛ ᴜsᴇʀ:</b>\n{me}\n" + else: + return "\n" + + +__mod_name__ = "𝙰ʙᴏᴜᴛs" diff --git a/Exon/modules/users.py b/Exon/modules/users.py new file mode 100644 index 00000000..cdbbf584 --- /dev/null +++ b/Exon/modules/users.py @@ -0,0 +1,240 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 contextlib +from io import BytesIO +from time import sleep + +from telegram import TelegramError, Update +from telegram.error import BadRequest +from telegram.ext import CallbackContext, CommandHandler, Filters, MessageHandler + +import Exon.modules.sql.users_sql as sql +from Exon import DEV_USERS +from Exon import LOGGER as log +from Exon import OWNER_ID, dispatcher +from Exon.modules.helper_funcs.chat_status import dev_plus, sudo_plus +from Exon.modules.sql.users_sql import get_all_users + +USERS_GROUP = 4 +CHAT_GROUP = 5 +DEV_AND_MORE = DEV_USERS.append(int(OWNER_ID)) + + +def get_user_id(username): + # ensure valid userid + if len(username) <= 5: + return None + + if username.startswith("@"): + username = username[1:] + + users = sql.get_userid_by_name(username) + + if not users: + return None + + elif len(users) == 1: + return users[0].user_id + + else: + for user_obj in users: + try: + userdat = dispatcher.bot.get_chat(user_obj.user_id) + if userdat.username == username: + return userdat.id + + except BadRequest as excp: + if excp.message != "ᴄʜᴀᴛ ɴᴏᴛ ғᴏᴜɴᴅ": + log.exception("ᴇʀʀᴏʀ ᴇxᴛʀᴀᴄᴛɪɴɢ ᴜsᴇʀ ID") + + return None + + +@dev_plus +def broadcast(update: Update, context: CallbackContext): + to_send = update.effective_message.text.split(None, 1) + + if len(to_send) >= 2: + to_group = False + to_user = False + if to_send[0] == "/broadcastgroups": + to_group = True + if to_send[0] == "/broadcastusers": + to_user = True + else: + to_group = to_user = True + chats = sql.get_all_chats() or [] + users = get_all_users() + failed = 0 + failed_user = 0 + if to_group: + for chat in chats: + try: + context.bot.sendMessage( + int(chat.chat_id), + to_send[1], + parse_mode="MARKDOWN", + disable_web_page_preview=True, + ) + sleep(0.1) + except TelegramError: + failed += 1 + if to_user: + for user in users: + try: + context.bot.sendMessage( + int(user.user_id), + to_send[1], + parse_mode="MARKDOWN", + disable_web_page_preview=True, + ) + sleep(0.1) + except TelegramError: + failed_user += 1 + update.effective_message.reply_text( + f"ʙʀᴏᴀᴅᴄᴀsᴛ ᴄᴏᴍᴘʟᴇᴛᴇ.\nɢʀᴏᴜᴘs ғᴀɪʟᴇᴅ: {failed}.\nᴜsᴇʀs ғᴀɪʟᴇᴅ: {failed_user}." + ) + + +def log_user(update: Update, _: CallbackContext): + chat = update.effective_chat + msg = update.effective_message + + sql.update_user(msg.from_user.id, msg.from_user.username, chat.id, chat.title) + + if rep := msg.reply_to_message: + sql.update_user( + rep.from_user.id, + rep.from_user.username, + chat.id, + chat.title, + ) + + if rep.forward_from: + sql.update_user( + rep.forward_from.id, + rep.forward_from.username, + ) + + if rep.entities: + for entity in rep.entities: + if entity.type in ["text_mention", "mention"]: + with contextlib.suppress(AttributeError): + sql.update_user(entity.user.id, entity.user.username) + if rep.sender_chat and not rep.is_automatic_forward: + sql.update_user( + rep.sender_chat.id, + rep.sender_chat.username, + chat.id, + chat.title, + ) + + if msg.forward_from: + sql.update_user(msg.forward_from.id, msg.forward_from.username) + + if msg.entities: + for entity in msg.entities: + if entity.type in ["text_mention", "mention"]: + with contextlib.suppress(AttributeError): + sql.update_user(entity.user.id, entity.user.username) + if msg.sender_chat and not msg.is_automatic_forward: + sql.update_user( + msg.sender_chat.id, msg.sender_chat.username, chat.id, chat.title + ) + + if msg.new_chat_members: + for user in msg.new_chat_members: + if user.id == msg.from_user.id: # we already added that in the first place + continue + sql.update_user(user.id, user.username, chat.id, chat.title) + + +@sudo_plus +def chats(update: Update, context: CallbackContext): + all_chats = sql.get_all_chats() or [] + chatfile = "ʟɪsᴛ ᴏғ ᴄʜᴀᴛs.\n0. ᴄʜᴀᴛ ɴᴀᴍᴇ | ᴄʜᴀᴛ ɪᴅ | ᴍᴇᴍʙᴇʀs ᴄᴏᴜɴᴛ\n" + P = 1 + for chat in all_chats: + try: + curr_chat = context.bot.getChat(chat.chat_id) + curr_chat.get_member(context.bot.id) + chat_members = curr_chat.get_member_count(context.bot.id) + chatfile += "{}. {} | {} | {}\n".format( + P, chat.chat_name, chat.chat_id, chat_members + ) + P += 1 + except: + pass + + with BytesIO(str.encode(chatfile)) as output: + output.name = "glist.txt" + update.effective_message.reply_document( + document=output, + filename="glist.txt", + caption="ʜᴇʀᴇ ʙᴇ ᴛʜᴇ ʟɪsᴛ ᴏғ ɢʀᴏᴜᴘs ɪɴ ᴇxᴏɴ ᴅᴀᴛᴀʙᴀsᴇ.", + ) + + +def chat_checker(update: Update, context: CallbackContext): + bot = context.bot + if update.effective_message.chat.get_member(bot.id).can_send_messages is False: + bot.leaveChat(update.effective_message.chat.id) + + +def __user_info__(user_id): + if user_id in [777000, 1087968824]: + return """<b>ɢʀᴏᴜᴘs ᴄᴏᴜɴᴛ</b>: idk :p</code>""" + if user_id == dispatcher.bot.id: + return """<b>ɢʀᴏᴜᴘs ᴄᴏᴜɴᴛ</b>: idk :p</code>""" + num_chats = sql.get_user_num_chats(user_id) + return f"""ɢʀᴏᴜᴘs ᴄᴏᴜɴᴛ: <code>{num_chats}</code>""" + + +def __stats__(): + return f"•➥ {sql.num_users()} users, across {sql.num_chats()} chats" + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +BROADCAST_HANDLER = CommandHandler( + ["broadcastall", "broadcastusers", "broadcastgroups"], broadcast, run_async=True +) +USER_HANDLER = MessageHandler( + Filters.all & Filters.chat_type.groups, log_user, run_async=True +) +CHAT_CHECKER_HANDLER = MessageHandler( + Filters.all & Filters.chat_type.groups, chat_checker, run_async=True +) +# CHATLIST_HANDLER = CommandHandler("chatlist", chats, run_async=True) + +dispatcher.add_handler(USER_HANDLER, USERS_GROUP) +dispatcher.add_handler(BROADCAST_HANDLER) +# dispatcher.add_handler(CHATLIST_HANDLER) +dispatcher.add_handler(CHAT_CHECKER_HANDLER, CHAT_GROUP) + +__mod_name__ = "Users" +__handlers__ = [(USER_HANDLER, USERS_GROUP), BROADCAST_HANDLER] diff --git a/Exon/modules/wallpaper.py b/Exon/modules/wallpaper.py new file mode 100644 index 00000000..4872e854 --- /dev/null +++ b/Exon/modules/wallpaper.py @@ -0,0 +1,81 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 random import randint + +import requests as r +from telegram import ChatAction, Update +from telegram.ext import CallbackContext + +from Exon import SUPPORT_CHAT, WALL_API, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.alternate import send_action + + +@send_action(ChatAction.UPLOAD_PHOTO) +def wall(update: Update, context: CallbackContext): + chat_id = update.effective_chat.id + msg = update.effective_message + args = context.args + msg_id = update.effective_message.message_id + bot = context.bot + query = " ".join(args) + if not query: + msg.reply_text("ᴘʟᴇᴀsᴇ ᴇɴᴛᴇʀ ᴀ ǫᴜᴇʀʏ!") + return + caption = query + term = query.replace(" ", "%20") + json_rep = r.get( + f"https://wall.alphacoders.com/api2.0/get.php?auth={WALL_API}&method=search&term={term}" + ).json() + if not json_rep.get("sᴜᴄᴄᴇss"): + msg.reply_text(f"ᴀɴ ᴇʀʀᴏʀ ᴏᴄᴄᴜʀʀᴇᴅ! ʀᴇᴘᴏʀᴛ ᴛʜɪs @{SUPPORT_CHAT} \n") + else: + wallpapers = json_rep.get("wallpapers") + if not wallpapers: + msg.reply_text("ɴᴏ ʀᴇsᴜʟᴛs found! Refine your search.") + return + index = randint(0, len(wallpapers) - 1) # Choose random index + wallpaper = wallpapers[index] + wallpaper = wallpaper.get("url_image") + wallpaper = wallpaper.replace("\\", "") + bot.send_photo( + chat_id, + photo=wallpaper, + caption="Preview", + reply_to_message_id=msg_id, + timeout=60, + ) + bot.send_document( + chat_id, + document=wallpaper, + filename="wallpaper", + caption=caption, + reply_to_message_id=msg_id, + timeout=60, + ) + + +WALLPAPER_HANDLER = DisableAbleCommandHandler("wall", wall, run_async=True) +dispatcher.add_handler(WALLPAPER_HANDLER) diff --git a/Exon/modules/warns.py b/Exon/modules/warns.py new file mode 100644 index 00000000..78f4c69d --- /dev/null +++ b/Exon/modules/warns.py @@ -0,0 +1,601 @@ +""" +MIT License + +Copyright (c) 2022 Arsh + +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 html +import re +from typing import Optional + +import telegram +from telegram import ( + CallbackQuery, + Chat, + InlineKeyboardButton, + InlineKeyboardMarkup, + Message, + ParseMode, + Update, + User, +) +from telegram.error import BadRequest +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + DispatcherHandlerStop, + Filters, + MessageHandler, +) +from telegram.utils.helpers import mention_html + +from Exon import TIGERS, WOLVES, dispatcher +from Exon.modules.disable import DisableAbleCommandHandler +from Exon.modules.helper_funcs.chat_status import ( + bot_admin, + can_restrict, + is_user_admin, + user_admin, + user_admin_no_reply, +) +from Exon.modules.helper_funcs.extraction import ( + extract_text, + extract_user, + extract_user_and_text, +) +from Exon.modules.helper_funcs.filters import CustomFilters +from Exon.modules.helper_funcs.misc import split_message +from Exon.modules.helper_funcs.string_handling import split_quotes +from Exon.modules.log_channel import loggable +from Exon.modules.sql import warns_sql as sql +from Exon.modules.sql.approve_sql import is_approved + +WARN_HANDLER_GROUP = 9 +CURRENT_WARNING_FILTER_STRING = "<b>ᴄᴜʀʀᴇɴᴛ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀs ɪɴ ᴛʜɪs ᴄʜᴀᴛ:</b>\n" + + +# Not async +def warn( + user: User, chat: Chat, reason: str, message: Message, warner: User = None +) -> str: + + if is_user_admin(chat, user.id): + # message.reply_text("Damn admins, They are too far to be One Punched!") + return + + if is_approved(chat.id, user.id): + if warner: + message.reply_text( + "ᴛʜɪs ᴜsᴇʀ ɪs ᴀᴘᴘʀᴏᴠᴇᴅ ɪɴ ᴛʜɪs ᴄʜᴀᴛ ᴀɴᴅ ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀs ᴄᴀɴ'ᴛ ʙᴇ ᴡᴀʀɴᴇᴅ!" + ) + else: + message.reply_text( + "ᴀᴘᴘʀᴏᴠᴇᴅ ᴜsᴇʀ ᴛʀɪɢɢᴇʀᴇᴅ ᴀɴ ᴀᴜᴛᴏ ғɪʟᴛᴇʀ! ʙᴜᴛ ᴛʜᴇʏ ᴄᴀɴ'ᴛ ʙᴇ ᴡᴀʀɴᴇᴅ." + ) + return + + if user.id in TIGERS: + if warner: + message.reply_text("ᴄʟᴀssᴍᴀᴛᴇs ᴄᴀɴ'ᴛ ʙᴇ ᴡᴀʀɴᴇᴅ.") + else: + message.reply_text( + "ᴏɴᴇ ᴏғ ᴛʜᴇ ᴄʟᴀssᴍᴀᴛᴇ ᴛʀɪɢɢᴇʀᴇᴅ ᴀɴ ᴀᴜᴛᴏ ᴡᴀʀɴ ғɪʟᴛᴇʀ!\n I ᴄᴀɴ'ᴛ ᴡᴀʀɴ our ᴏᴡɴ ᴄʟᴀssᴍᴀᴛᴇs ʙᴜᴛ ᴛʜᴇʏ sʜᴏᴜʟᴅ ᴀᴠᴏɪᴅ ᴀʙᴜsɪɴɢ ᴛʜɪs." + ) + return + + if user.id in WOLVES: + if warner: + message.reply_text("ᴀʙɪsʜɴᴏɪ ᴀʀᴇ ᴡᴀʀɴ ɪᴍᴍᴜɴᴇ.") + else: + message.reply_text( + "ᴀʙɪsʜɴᴏɪ ᴛʀɪɢɢᴇʀᴇᴅ ᴀɴ ᴀᴜᴛᴏ ᴡᴀʀɴ ғɪʟᴛᴇʀ!\nI ᴄᴀɴ'ᴛ ᴡᴀʀɴ ᴇxᴏɴ ʙᴜᴛ ᴛʜᴇʏ sʜᴏᴜʟᴅ ᴀᴠᴏɪᴅ ᴀʙᴜsɪɴɢ ᴛʜɪs." + ) + return + + if warner: + warner_tag = mention_html(warner.id, warner.first_name) + else: + warner_tag = "ᴀᴜᴛᴏᴍᴀᴛᴇᴅ ᴡᴀʀɴ ғɪʟᴛᴇʀ." + + limit, soft_warn = sql.get_warn_setting(chat.id) + num_warns, reasons = sql.warn_user(user.id, chat.id, reason) + if num_warns >= limit: + sql.reset_warns(user.id, chat.id) + if soft_warn: # punch + chat.unban_member(user.id) + reply = ( + f"<code>❕</code><b>ᴋɪᴄᴋ ᴇᴠᴇɴᴛ</b>\n\n" + f"<code> </code><b>✦ ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n" + f"<code> </code><b>✦ ᴄᴏᴜɴᴛ:</b> {limit}" + ) + + else: # ban + chat.ban_member(user.id) + reply = ( + f"<code>❕</code><b>ʙᴀɴ ᴇᴠᴇɴᴛ</b>\n\n" + f"<code> </code><b>✦ ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n" + f"<code> </code><b>✦ ᴄᴏᴜɴᴛ:</b> {limit}" + ) + + for warn_reason in reasons: + reply += f"\n - {html.escape(warn_reason)}" + + # message.bot.send_sticker(chat.id, BAN_STICKER) + keyboard = None + log_reason = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴀʀɴ_ʙᴀɴ\n\n" + f"<b>✦ ᴀᴅᴍɪɴ:</b> {warner_tag}\n" + f"<b>✦ ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>✦ ʀᴇᴀsᴏɴ:</b> {reason}\n" + f"<b>✦ ᴄᴏᴜɴᴛs:</b> <code>{num_warns}/{limit}</code>" + ) + + else: + keyboard = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "ʀᴇᴍᴏᴠᴇ ᴡᴀʀɴ", callback_data="rm_warn({})".format(user.id) + ) + ] + ] + ) + + reply = ( + f"<code>❕</code><b>ᴡᴀʀɴ ᴇᴠᴇɴᴛ</b>\n\n" + f"<code> </code><b>✦ ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n" + f"<code> </code><b>✦ ᴄᴏᴜɴᴛ:</b> {num_warns}/{limit}" + ) + if reason: + reply += f"\n<code> </code><b>✦ ʀᴇᴀsᴏɴ:</b> {html.escape(reason)}" + + log_reason = ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴀʀɴ\n\n" + f"<b>✦ ᴀᴅᴍɪɴ:</b> {warner_tag}\n" + f"<b>✦ ᴜsᴇʀ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>✦ ʀᴇᴀsᴏɴ:</b> {reason}\n" + f"<b>✦ ᴄᴏᴜɴᴛs:</b> <code>{num_warns}/{limit}</code>" + ) + + try: + message.reply_text(reply, reply_markup=keyboard, parse_mode=ParseMode.HTML) + except BadRequest as excp: + if excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ ғᴜ*ᴋ ʏᴏᴜ ʙᴀʙʏ": + # Do not reply + message.reply_text( + reply, reply_markup=keyboard, parse_mode=ParseMode.HTML, quote=False + ) + else: + raise + return log_reason + + +@user_admin_no_reply +@bot_admin +@loggable +def button(update: Update, context: CallbackContext) -> str: + query: Optional[CallbackQuery] = update.callback_query + user: Optional[User] = update.effective_user + match = re.match(r"rm_warn\((.+?)\)", query.data) + if match: + user_id = match.group(1) + chat: Optional[Chat] = update.effective_chat + res = sql.remove_warn(user_id, chat.id) + if res: + update.effective_message.edit_text( + "ᴡᴀʀɴ ʀᴇᴍᴏᴠᴇᴅ ʙʏ {}.".format(mention_html(user.id, user.first_name)), + parse_mode=ParseMode.HTML, + ) + user_member = chat.get_member(user_id) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴜɴᴡᴀʀɴ\n\n" + f"<b>✦ ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>✦ ᴜsᴇʀ:</b> {mention_html(user_member.user.id, user_member.user.first_name)}" + ) + update.effective_message.edit_text( + "ᴜsᴇʀ ᴀʟʀᴇᴀᴅʏ ʜᴀs ɴᴏ ᴡᴀʀɴs.", parse_mode=ParseMode.HTML + ) + + return "" + + +@user_admin +@can_restrict +@loggable +def warn_user(update: Update, context: CallbackContext) -> str: + args = context.args + message: Optional[Message] = update.effective_message + chat: Optional[Chat] = update.effective_chat + warner: Optional[User] = update.effective_user + + user_id, reason = extract_user_and_text(message, args) + if message.text.startswith("/d") and message.reply_to_message: + message.reply_to_message.delete() + return warn(chat, reason, warner, message) + if user_id: + if ( + message.reply_to_message + and message.reply_to_message.from_user.id == user_id + ): + return warn( + message.reply_to_message.from_user, + chat, + reason, + message.reply_to_message, + warner, + ) + return warn(chat.get_member(user_id).user, chat, reason, message, warner) + message.reply_text("ᴛʜᴀᴛ ʟᴏᴏᴋs ʟɪᴋᴇ ᴀɴ ɪɴᴠᴀʟɪᴅ ᴜsᴇʀ ID ᴛᴏ ᴍᴇ.") + return "" + + +@user_admin +@bot_admin +@loggable +def reset_warns(update: Update, context: CallbackContext) -> str: + args = context.args + message: Optional[Message] = update.effective_message + chat: Optional[Chat] = update.effective_chat + user: Optional[User] = update.effective_user + + user_id = extract_user(message, args) + + if user_id: + sql.reset_warns(user_id, chat.id) + message.reply_text("Warns have been reset!") + warned = chat.get_member(user_id).user + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴇsᴇᴛᴡᴀʀɴs\n\n" + f"<b>✦ ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"<b>✦ ᴜsᴇʀ:</b> {mention_html(warned.id, warned.first_name)}" + ) + message.reply_text("ɴᴏ ᴜsᴇʀ ʜᴀs ʙᴇᴇɴ ᴅᴇsɪɢɴᴀᴛᴇᴅ!") + return "" + + +def warns(update: Update, context: CallbackContext): + args = context.args + message: Optional[Message] = update.effective_message + chat: Optional[Chat] = update.effective_chat + user_id = extract_user(message, args) or update.effective_user.id + result = sql.get_warns(user_id, chat.id) + + if result and result[0] != 0: + num_warns, reasons = result + limit, soft_warn = sql.get_warn_setting(chat.id) + + if reasons: + text = ( + f"ᴛʜɪs ᴜsᴇʀ ʜᴀs {num_warns}/{limit} ᴡᴀʀɴs, ғᴏʀ ᴛʜᴇ ғᴏʟʟᴏᴡɪɴɢ ʀᴇᴀsᴏɴs:" + ) + for reason in reasons: + text += f"\n • {reason}" + + msgs = split_message(text) + for msg in msgs: + update.effective_message.reply_text(msg) + else: + update.effective_message.reply_text( + f"ᴜsᴇʀ ʜᴀs {num_warns}/{limit} ᴡᴀʀɴs, ʙᴜᴛ ɴᴏ ʀᴇᴀsᴏɴs ғᴏʀ ᴀɴʏ ᴏғ ᴛʜᴇᴍ." + ) + else: + update.effective_message.reply_text("ᴛʜɪs ᴜsᴇʀ ᴅᴏᴇsɴ'ᴛ ʜᴀᴠᴇ ᴀɴʏ ᴡᴀʀɴs ɴɪᴄᴇ !") + + +# Dispatcher handler stop - do not async +@user_admin +def add_warn_filter(update: Update, context: CallbackContext): + chat: Optional[Chat] = update.effective_chat + msg: Optional[Message] = update.effective_message + + args = msg.text.split( + None, 1 + ) # use python's maxsplit to separate Cmd, keyword, and reply_text + + if len(args) < 2: + return + + extracted = split_quotes(args[1]) + + if len(extracted) < 2: + return + + # set trigger -> lower, so as to avoid adding duplicate filters with different cases + keyword = extracted[0].lower() + content = extracted[1] + + # Note: perhaps handlers can be removed somehow using sql.get_chat_filters + for handler in dispatcher.handlers.get(WARN_HANDLER_GROUP, []): + if handler.filters == (keyword, chat.id): + dispatcher.remove_handler(handler, WARN_HANDLER_GROUP) + + sql.add_warn_filter(chat.id, keyword, content) + + update.effective_message.reply_text(f"ᴡᴀʀɴ ʜᴀɴᴅʟᴇʀ ᴀᴅᴅᴇᴅ ғᴏʀ '{keyword}'!") + raise DispatcherHandlerStop + + +@user_admin +def remove_warn_filter(update: Update, context: CallbackContext): + chat: Optional[Chat] = update.effective_chat + msg: Optional[Message] = update.effective_message + + args = msg.text.split( + None, 1 + ) # use python's maxsplit to separate Cmd, keyword, and reply_text + + if len(args) < 2: + return + + extracted = split_quotes(args[1]) + + if len(extracted) < 1: + return + + to_remove = extracted[0] + + chat_filters = sql.get_chat_warn_triggers(chat.id) + + if not chat_filters: + msg.reply_text("ɴᴏ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀs ᴀʀᴇ ᴀᴄᴛɪᴠᴇ ʜᴇʀᴇ!") + return + + for filt in chat_filters: + if filt == to_remove: + sql.remove_warn_filter(chat.id, to_remove) + msg.reply_text("ᴏᴋᴀʏ, I'll sᴛᴏᴘ ᴡᴀʀɴɪɴɢ ᴘᴇᴏᴘʟᴇ ғᴏʀ ᴛʜᴀᴛ.") + raise DispatcherHandlerStop + + msg.reply_text( + "ᴛʜᴀᴛ's ɴᴏᴛ ᴀ ᴄᴜʀʀᴇɴᴛ warning ғɪʟᴛᴇʀ - ʀᴜɴ /warnlist ғᴏʀ ᴀʟʟ ᴀᴄᴛɪᴠᴇ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀs." + ) + + +def list_warn_filters(update: Update, context: CallbackContext): + chat: Optional[Chat] = update.effective_chat + all_handlers = sql.get_chat_warn_triggers(chat.id) + + if not all_handlers: + update.effective_message.reply_text("ɴᴏ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀs ᴀʀᴇ ᴀᴄᴛɪᴠᴇ ʜᴇʀᴇ!") + return + + filter_list = CURRENT_WARNING_FILTER_STRING + for keyword in all_handlers: + entry = f" - {html.escape(keyword)}\n" + if len(entry) + len(filter_list) > telegram.MAX_MESSAGE_LENGTH: + update.effective_message.reply_text(filter_list, parse_mode=ParseMode.HTML) + filter_list = entry + else: + filter_list += entry + + if filter_list != CURRENT_WARNING_FILTER_STRING: + update.effective_message.reply_text(filter_list, parse_mode=ParseMode.HTML) + + +@loggable +def reply_filter(update: Update, context: CallbackContext) -> str: + chat: Optional[Chat] = update.effective_chat + message: Optional[Message] = update.effective_message + user: Optional[User] = update.effective_user + + if not user: # Ignore channel + return + + if user.id == 777000: + return + + if is_approved(chat.id, user.id): + return + + chat_warn_filters = sql.get_chat_warn_triggers(chat.id) + to_match = extract_text(message) + if not to_match: + return "" + + for keyword in chat_warn_filters: + pattern = r"( |^|[^\w])" + re.escape(keyword) + r"( |$|[^\w])" + if re.search(pattern, to_match, flags=re.IGNORECASE): + user: Optional[User] = update.effective_user + warn_filter = sql.get_warn_filter(chat.id, keyword) + return warn(user, chat, warn_filter.reply, message) + return "" + + +@user_admin +@loggable +def set_warn_limit(update: Update, context: CallbackContext) -> str: + args = context.args + chat: Optional[Chat] = update.effective_chat + user: Optional[User] = update.effective_user + msg: Optional[Message] = update.effective_message + + if args: + if args[0].isdigit(): + if int(args[0]) < 3: + msg.reply_text("The ᴍɪɴɪᴍᴜᴍ ᴡᴀʀɴ ʟɪᴍɪᴛ ɪs 3!") + else: + sql.set_warn_limit(chat.id, int(args[0])) + msg.reply_text("ᴜᴘᴅᴀᴛᴇᴅ ᴛʜᴇ ᴡᴀʀɴ ʟɪᴍɪᴛ ᴛᴏ {}".format(args[0])) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#sᴇᴛ_ᴡᴀʀɴ_ʟɪᴍɪᴛ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"sᴇᴛ ᴛʜᴇ warn ʟɪᴍɪᴛ ᴛᴏ <code>{args[0]}</code>" + ) + else: + msg.reply_text("ɢɪᴠᴇ ᴍᴇ ᴀ ɴᴜᴍʙᴇʀ ᴀs ᴀɴ ᴀʀɢ!") + else: + limit, soft_warn = sql.get_warn_setting(chat.id) + + msg.reply_text("ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴡᴀʀɴ ʟɪᴍɪᴛ ɪs {}".format(limit)) + return "" + + +@user_admin +def set_warn_strength(update: Update, context: CallbackContext): + args = context.args + chat: Optional[Chat] = update.effective_chat + user: Optional[User] = update.effective_user + msg: Optional[Message] = update.effective_message + + if args: + if args[0].lower() in ("on", "yes"): + sql.set_warn_strength(chat.id, False) + msg.reply_text("ᴛᴏᴏ ᴍᴀɴʏ ᴡᴀʀɴs ᴡɪʟʟ ɴᴏᴡ ʀᴇsᴜʟᴛ ɪɴ a ʙᴀɴ!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴇɴᴀʙʟᴇᴅ sᴛʀᴏɴɢ ᴡᴀʀɴs. ᴜsᴇʀs ᴡɪʟʟ ʙᴇ sᴇʀɪᴏᴜsʟʏ ᴘᴜɴᴄʜᴇᴅ.(ʙᴀɴɴᴇᴅ)" + ) + + if args[0].lower() in ("off", "no"): + sql.set_warn_strength(chat.id, True) + msg.reply_text( + "ᴛᴏᴏ ᴍᴀɴʏ ᴡᴀʀɴs ᴡɪʟʟ ɴᴏᴡ ʀᴇsᴜʟᴛ ɪɴ ᴀ ɴᴏʀᴍᴀʟ ᴘᴜɴᴄʜ! ᴜsᴇʀs ᴡɪʟʟ ʙᴇ ᴀʙʟᴇ ᴛᴏ ᴊᴏɪɴ ᴀɢᴀɪɴ ᴀғᴛᴇʀ." + ) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴅɪsᴀʙʟᴇᴅ sᴛʀᴏɴɢ ᴘᴜɴᴄʜᴇs. I ᴡɪʟʟ ᴜsᴇ ɴᴏʀᴍᴀʟ ᴘᴜɴᴄʜ ᴏɴ ᴜsᴇʀs." + ) + msg.reply_text("ɪ ᴏɴʟʏ ᴜɴᴅᴇʀsᴛᴀɴᴅ on/yes/no/off!") + else: + limit, soft_warn = sql.get_warn_setting(chat.id) + if soft_warn: + msg.reply_text( + "ᴡᴀʀɴs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ *ᴘᴜɴᴄʜ* ᴜsᴇʀs ᴡʜᴇɴ ᴛʜᴇʏ ᴇxᴄᴇᴇᴅ ᴛʜᴇ ʟɪᴍɪᴛs.", + parse_mode=ParseMode.MARKDOWN, + ) + else: + msg.reply_text( + "ᴡᴀʀɴs ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ sᴇᴛ ᴛᴏ *ʙᴀɴ* ᴜsᴇʀs ᴡʜᴇɴ ᴛʜᴇʏ ᴇxᴄᴇᴇᴅ ᴛʜᴇ ʟɪᴍɪᴛs.", + parse_mode=ParseMode.MARKDOWN, + ) + return "" + + +def __stats__(): + return ( + f"•➥ {sql.num_warns()} overall ᴡᴀʀɴs, ᴀᴄʀᴏss {sql.num_warn_chats()} ᴄʜᴀᴛs.\n" + f"•➥ {sql.num_warn_filters()} ᴡᴀʀɴ ғɪʟᴛᴇʀs, ᴀᴄʀᴏss {sql.num_warn_filter_chats()} ᴄʜᴀᴛs." + ) + + +def __import_data__(chat_id, data): + for user_id, count in data.get("warns", {}).items(): + for _ in range(int(count)): + sql.warn_user(user_id, chat_id) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + num_warn_filters = sql.num_warn_chat_filters(chat_id) + limit, soft_warn = sql.get_warn_setting(chat_id) + return ( + f"ᴛʜɪs ᴄʜᴀᴛ ʜᴀs `{num_warn_filters}` ᴡᴀʀɴ ғɪʟᴛᴇʀs. " + f"It ᴛᴀᴋᴇs `{limit}` ᴡᴀʀɴs ʙᴇғᴏʀᴇ ᴛʜᴇ ᴜsᴇʀ ɢᴇᴛs *{'kicked' if soft_warn else 'banned'}*." + ) + + +__help__ = ( + """ + +➻ /warns <ᴜsᴇʀʜᴀɴᴅʟᴇ>: `ɢᴇᴛ ᴀ ᴜsᴇʀ's ɴᴜᴍʙᴇʀ, ᴀɴᴅ ʀᴇᴀsᴏɴ, ᴏғ ᴡᴀʀɴs`. + +➻ /warnliat : `ʟɪsᴛ ᴏғ ᴀʟʟ ᴄᴜʀʀᴇɴᴛ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀs` + +➻ /warn <ᴜsᴇʀʜᴀɴᴅʟᴇ>: `ᴡᴀʀɴ ᴀ ᴜsᴇʀ. ᴀғᴛᴇʀ 3 ᴡᴀʀɴs, ᴛʜᴇ ᴜsᴇʀ ᴡɪʟʟ ʙᴇ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ɢʀᴏᴜᴘ. ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ` + +➻ /dwarn <ᴜsᴇʀʜᴀɴᴅʟᴇ>: `ᴡᴀʀɴ ᴀ ᴜsᴇʀ ᴀɴᴅ ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴍᴇssᴀɢᴇ. ᴀғᴛᴇʀ 3 ᴡᴀʀɴs, ᴛʜᴇ ᴜsᴇʀ ᴡɪʟʟ ʙᴇ ʙᴀɴɴᴇᴅ ғʀᴏᴍ ᴛʜᴇ ɢʀᴏᴜᴘ. ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ.` + +➻ /resetwarn <ᴜsᴇʀʜᴀɴᴅʟᴇ>: `ʀᴇsᴇᴛ ᴛʜᴇ ᴡᴀʀɴs ғᴏʀ ᴀ ᴜsᴇʀ. ᴄᴀɴ ᴀʟsᴏ ʙᴇ ᴜsᴇᴅ ᴀs ᴀ ʀᴇᴘʟʏ.` + +➻ /addwarn <ᴋᴇʏᴡᴏʀᴅ> <ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ>: `sᴇᴛ ᴀ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀ ᴏɴ ᴀ ᴄᴇʀᴛᴀɪɴ ᴋᴇʏᴡᴏʀᴅ. ɪғ ʏᴏᴜ ᴡᴀɴᴛ ʏᴏᴜʀ ᴋᴇʏᴡᴏʀᴅ ᴛᴏ ʙᴇ ᴀ sᴇɴᴛᴇɴᴄᴇ, ᴇɴᴄᴏᴍᴘᴀss ɪᴛ ᴡɪᴛʜ ϙᴜᴏᴛᴇs, ᴀs sᴜᴄʜ: /ᴀᴅᴅᴡᴀʀɴ "ᴠᴇʀʏ ᴀɴɢʀʏ" ᴛʜɪs ɪs ᴀɴ ᴀɴɢʀʏ ᴜsᴇʀ.` + +➻ /nowarn <ᴋᴇʏᴡᴏʀᴅ>: `sᴛᴏᴘ ᴀ ᴡᴀʀɴɪɴɢ ғɪʟᴛᴇʀ` + +➻ /warnlimit <ɴᴜᴍ>: `sᴇᴛ ᴛʜᴇ ᴡᴀʀɴɪɴɢ ʟɪᴍɪᴛ` + +➻ /strongwarn <ᴏɴ/ʏᴇs/ᴏғғ/ɴᴏ>: `ɪғ sᴇᴛ ᴛᴏ ᴏɴ, ᴇxᴄᴇᴇᴅɪɴɢ ᴛʜᴇ ᴡᴀʀɴ ʟɪᴍɪᴛ ᴡɪʟʟ ʀᴇsᴜʟᴛ ɪɴ ᴀ ʙᴀɴ. ᴇʟsᴇ, ᴡɪʟʟ ᴊᴜsᴛ ᴘᴜɴᴄʜ`. + + +""" + "" +) + +__mod_name__ = "𝚆ᴀʀɴs" + +WARN_HANDLER = CommandHandler( + ["warn", "dwarn"], warn_user, filters=Filters.chat_type.groups, run_async=True +) +RESET_WARN_HANDLER = CommandHandler( + ["resetwarn", "resetwarns"], + reset_warns, + filters=Filters.chat_type.groups, + run_async=True, +) +CALLBACK_QUERY_HANDLER = CallbackQueryHandler( + button, pattern=r"rm_warn", run_async=True +) +MYWARNS_HANDLER = DisableAbleCommandHandler( + "warns", warns, filters=Filters.chat_type.groups, run_async=True +) +ADD_WARN_HANDLER = CommandHandler( + "addwarn", add_warn_filter, filters=Filters.chat_type.groups +) +RM_WARN_HANDLER = CommandHandler( + ["nowarn", "stopwarn"], remove_warn_filter, filters=Filters.chat_type.groups +) +LIST_WARN_HANDLER = DisableAbleCommandHandler( + ["warnlist", "warnfilters"], + list_warn_filters, + filters=Filters.chat_type.groups, + admin_ok=True, + run_async=True, +) +WARN_FILTER_HANDLER = MessageHandler( + CustomFilters.has_text & Filters.chat_type.groups, reply_filter, run_async=True +) +WARN_LIMIT_HANDLER = CommandHandler( + "warnlimit", set_warn_limit, filters=Filters.chat_type.groups, run_async=True +) +WARN_STRENGTH_HANDLER = CommandHandler( + "strongwarn", set_warn_strength, filters=Filters.chat_type.groups, run_async=True +) + +dispatcher.add_handler(WARN_HANDLER) +dispatcher.add_handler(CALLBACK_QUERY_HANDLER) +dispatcher.add_handler(RESET_WARN_HANDLER) +dispatcher.add_handler(MYWARNS_HANDLER) +dispatcher.add_handler(ADD_WARN_HANDLER) +dispatcher.add_handler(RM_WARN_HANDLER) +dispatcher.add_handler(LIST_WARN_HANDLER) +dispatcher.add_handler(WARN_LIMIT_HANDLER) +dispatcher.add_handler(WARN_STRENGTH_HANDLER) +dispatcher.add_handler(WARN_FILTER_HANDLER, WARN_HANDLER_GROUP) diff --git a/Exon/modules/watchorder.py b/Exon/modules/watchorder.py new file mode 100644 index 00000000..e03c7eb9 --- /dev/null +++ b/Exon/modules/watchorder.py @@ -0,0 +1,58 @@ +""" +MIT License + +Copyright (c) 2022 A𝚋𝚒𝚜𝚑𝚗𝚘𝚒 + +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 requests +from bs4 import BeautifulSoup +from pyrogram import filters + +from Exon import pgram + + +@pgram.on_message(filters.command("watchorder")) +def watchorderx(_, message): + anime = message.text.replace(message.text.split(" ")[0], "") + res = requests.get( + f"https://chiaki.site/?/tools/autocomplete_series&term={anime}" + ).json() + data = None + id_ = res[0]["id"] + res_ = requests.get(f"https://chiaki.site/?/tools/watch_order/id/{id_}").text + soup = BeautifulSoup(res_, "html.parser") + anime_names = soup.find_all("span", class_="wo_title") + for x in anime_names: + if data: + data = f"{data}\n{x.text}" + else: + data = x.text + message.reply_text(f"**ᴡᴀᴛᴄʜɪɴɢ ᴏʀᴅᴇʀ ʟɪsᴛ ᴏғ {anime}:** \n\n```{data}```") + + +__help__ = """ +ɢᴇᴛ ᴡᴀᴛᴄʜ ᴏʀᴅᴇʀ (ᴡᴀᴛᴄʜɪɴɢ sᴇǫᴜᴇɴᴄᴇ) ᴏғ ᴀɴʏ ᴀɴɪᴍᴇ sᴇʀɪᴇs +ᴜsᴀɢᴇ: + +/watchorder <ᴀɴɪᴍᴇ ɴᴀᴍᴇ> +""" + +__mod_name__ = "𝚆ᴀᴛᴄʜ ᴏʀᴅᴇʀ" diff --git a/Exon/modules/webss.py b/Exon/modules/webss.py new file mode 100644 index 00000000..a0fac09c --- /dev/null +++ b/Exon/modules/webss.py @@ -0,0 +1,55 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +from pyrogram import filters +from pyrogram.types import Message + +from Exon import pgram +from Exon.utils.errors import capture_err + + +@pgram.on_message(filters.command("webss")) +@capture_err +async def take_ss(_, message: Message): + try: + if len(message.command) != 2: + return await message.reply_text( + "ɢɪᴠᴇ ᴀ ᴜʀʟ ᴛᴏ ғᴇᴛᴄʜ sᴄʀᴇᴇɴsʜᴏᴛ \nʟɪᴋᴇ ||xɴxx.ᴄᴏᴍ||." + ) + url = message.text.split(None, 1)[1] + m = await message.reply_text("**ᴛᴀᴋɪɴɢ sᴄʀᴇᴇɴsʜᴏᴛ**") + await m.edit("**ᴜᴘʟᴏᴀᴅɪɴɢ...**") + try: + await message.reply_photo( + photo=f"https://webshot.amanoteam.com/print?q={url}", + quote=False, + ) + except TypeError: + return await m.edit("ɴᴏ sᴜᴄʜ ᴡᴇʙsɪᴛᴇ ᴍᴀʏ ʙᴇ ʏᴏᴜ ɴᴏᴛ ᴜsᴇ 𝚇.ᴄᴏᴍ.") + await m.delete() + except Exception as e: + await message.reply_text(str(e)) + + +__mod_name__ = "𝚆ᴇʙss" diff --git a/Exon/modules/welcome.py b/Exon/modules/welcome.py new file mode 100644 index 00000000..fa2bc02e --- /dev/null +++ b/Exon/modules/welcome.py @@ -0,0 +1,1350 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 html +import random +import re +import time +from functools import partial +from io import BytesIO + +from telegram import ( + ChatPermissions, + InlineKeyboardButton, + InlineKeyboardMarkup, + ParseMode, + Update, + User, +) +from telegram.error import BadRequest, TelegramError +from telegram.ext import ( + CallbackContext, + CallbackQueryHandler, + CommandHandler, + Filters, + MessageHandler, +) +from telegram.utils.helpers import escape_markdown, mention_html, mention_markdown + +import Exon.modules.sql.log_channel_sql as logsql +import Exon.modules.sql.welcome_sql as sql +from Exon import DEMONS, DEV_USERS, DRAGONS +from Exon import LOGGER as log +from Exon import OWNER_ID, WOLVES, dispatcher, sw +from Exon.modules.helper_funcs.anonymous import AdminPerms, user_admin +from Exon.modules.helper_funcs.chat_status import is_user_ban_protected +from Exon.modules.helper_funcs.chat_status import user_admin as u_admin +from Exon.modules.helper_funcs.misc import build_keyboard, revert_buttons +from Exon.modules.helper_funcs.msg_types import get_welcome_type +from Exon.modules.helper_funcs.string_handling import ( + escape_invalid_curly_brackets, + markdown_parser, +) +from Exon.modules.log_channel import loggable +from Exon.modules.sql.global_bans_sql import is_user_gbanned + +VALID_WELCOME_FORMATTERS = [ + "first", + "last", + "fullname", + "username", + "id", + "count", + "chatname", + "mention", +] + +ENUM_FUNC_MAP = { + sql.Types.TEXT.value: dispatcher.bot.send_message, + sql.Types.BUTTON_TEXT.value: dispatcher.bot.send_message, + sql.Types.STICKER.value: dispatcher.bot.send_sticker, + sql.Types.DOCUMENT.value: dispatcher.bot.send_document, + sql.Types.PHOTO.value: dispatcher.bot.send_photo, + sql.Types.AUDIO.value: dispatcher.bot.send_audio, + sql.Types.VOICE.value: dispatcher.bot.send_voice, + sql.Types.VIDEO.value: dispatcher.bot.send_video, +} + +VERIFIED_USER_WAITLIST = {} +CAPTCHA_ANS_DICT = {} + +from multicolorcaptcha import CaptchaGenerator + +WHITELISTED = [OWNER_ID] + DEV_USERS + DRAGONS + DEMONS + WOLVES +# do not async +def send(update, message, keyboard, backup_message): + chat = update.effective_chat + cleanserv = sql.clean_service(chat.id) + reply = update.message.message_id + # Clean service welcome + if cleanserv: + try: + dispatcher.bot.delete_message(chat.id, update.message.message_id) + except BadRequest: + pass + reply = False + try: + msg = update.effective_message.reply_text( + message, + parse_mode=ParseMode.MARKDOWN, + reply_markup=keyboard, + reply_to_message_id=reply, + allow_sending_without_reply=True, + ) + except BadRequest as excp: + if excp.message == "Button_url_invalid": + msg = update.effective_message.reply_text( + markdown_parser( + ( + backup_message + + "\nɴᴏᴛᴇ: ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴍᴇssᴀɢᴇ ʜᴀs ᴀɴ ɪɴᴠᴀʟɪᴅ ᴜʀʟ ɪɴ ᴏɴᴇ ᴏғ ɪᴛs ʙᴜᴛᴛᴏɴs. ᴘʟᴇᴀsᴇ ᴜᴘᴅᴀᴛᴇ." + ) + ), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + ) + + elif excp.message == "ʜᴀᴠᴇ ɴᴏ ʀɪɢʜᴛs ᴛᴏ sᴇɴᴅ ᴀ ᴍᴇssᴀɢᴇ": + return + elif excp.message == "ʀᴇᴘʟʏ ᴍᴇssᴀɢᴇ ɴᴏᴛ ғᴏᴜɴᴅ": + msg = update.effective_message.reply_text( + message, + parse_mode=ParseMode.MARKDOWN, + reply_markup=keyboard, + quote=False, + ) + + elif excp.message == "Unsupported url protocol": + msg = update.effective_message.reply_text( + markdown_parser( + ( + backup_message + + "\nNote: ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴍᴇssᴀɢᴇ ʜᴀs ʙᴜᴛᴛᴏɴs ᴡʜɪᴄʜ ᴜsᴇ ᴜʀʟ ᴘʀᴏᴛᴏᴄᴏʟs ᴛʜᴀᴛ ᴀʀᴇ ᴜɴsᴜᴘᴘᴏʀᴛᴇᴅ ʙʏ " + "ᴛᴇʟᴇɢʀᴀᴍ. ᴘʟᴇᴀsᴇ ᴜᴘᴅᴀᴛᴇ. " + ) + ), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + ) + + elif excp.message == "Wrong url host": + msg = update.effective_message.reply_text( + markdown_parser( + ( + backup_message + + "\nɴᴏᴛᴇ : ᴛʜᴇ ᴄᴜʀʀᴇɴᴛ ᴍᴇssᴀɢᴇ ʜᴀs sᴏᴍᴇ ʙᴀᴅ ᴜʀʟs. ᴘʟᴇᴀsᴇ ᴜᴘᴅᴀᴛᴇ." + ) + ), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + ) + + log.warning(message) + log.warning(keyboard) + log.exception("ᴄᴏᴜʟᴅ ɴᴏᴛ ᴘᴀʀsᴇ! ɢᴏᴛ ɪɴᴠᴀʟɪᴅ ᴜʀʟ ʜᴏsᴛ ᴇʀʀᴏʀs") + else: + msg = update.effective_message.reply_text( + markdown_parser( + ( + backup_message + + "\nɴᴏᴛᴇ :: ᴀɴ ᴇʀʀᴏʀ ᴏᴄᴄᴜʀᴇᴅ ᴡʜᴇɴ sᴇɴᴅɪɴɢ ᴛʜᴇ ᴄᴜsᴛᴏᴍ ᴍᴇssᴀɢᴇ. ᴘʟᴇᴀsᴇ ᴜᴘᴅᴀᴛᴇ." + ) + ), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + ) + + log.exception() + return msg + + +@loggable +def new_member(update: Update, context: CallbackContext): # sourcery no-metrics + bot, job_queue = context.bot, context.job_queue + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + log_setting = logsql.get_chat_setting(chat.id) + if not log_setting: + logsql.set_chat_setting( + logsql.LogChannelSettings(chat.id, True, True, True, True, True) + ) + log_setting = logsql.get_chat_setting(chat.id) + should_welc, cust_welcome, cust_content, welc_type = sql.get_welc_pref(chat.id) + welc_mutes = sql.welcome_mutes(chat.id) + human_checks = sql.get_human_checks(user.id, chat.id) + raid, _, deftime = sql.getRaidStatus(str(chat.id)) + + new_members = update.effective_message.new_chat_members + + for new_mem in new_members: + + welcome_log = None + res = None + sent = None + should_mute = True + welcome_bool = True + media_wel = False + + if raid and new_mem.id not in WHITELISTED: + bantime = deftime + try: + chat.ban_member(new_mem.id, until_date=bantime) + except BadRequest: + pass + return + + if sw != None: + sw_ban = sw.get_ban(new_mem.id) + if sw_ban: + return + + reply = update.message.message_id + cleanserv = sql.clean_service(chat.id) + # Clean service welcome + if cleanserv: + try: + dispatcher.bot.delete_message(chat.id, update.message.message_id) + except BadRequest: + pass + reply = False + + if should_welc: + + # Give the owner a special welcome + if new_mem.id == OWNER_ID: + update.effective_message.reply_text( + "ᴏɴɪᴄʜᴀɴ ᴀʀʀɪᴠᴇᴅ~ ᴍʏ ʜᴇᴀʀᴛ ɢᴏᴇs ᴍᴇᴏᴡ ᴍᴇᴏᴡ :3", + reply_to_message_id=reply, + ) + welcome_log = ( + f"{html.escape(chat.title)}\n" + f"#ᴜsᴇʀ_ᴊᴏɪɴᴇᴅ\n" + f"ʙᴏᴛ ᴏᴡɴᴇʀ ᴊᴜsᴛ ᴊᴏɪɴᴇᴅ ᴛʜᴇ ᴄʜᴀᴛ 🥰" + ) + continue + + # Welcome Devs + if new_mem.id in DEV_USERS: + update.effective_message.reply_text( + "ᴡʜᴏ ᴀ! ᴀ ᴍᴇᴍʙᴇʀ ᴏғ ᴍʏ ғᴀᴍɪʟʏ ᴊᴜsᴛ ᴊᴏɪɴᴇᴅ!", + reply_to_message_id=reply, + ) + continue + + # Welcome Sudos + elif new_mem.id in DRAGONS: + update.effective_message.reply_text( + "ʜᴜʜ! ᴍʏ ʙᴇsᴛғʀɪᴇɴᴅ ᴊᴜsᴛ ᴊᴏɪɴᴇᴅ! sᴛᴀʏ ᴀʟᴇʀᴛ !", + reply_to_message_id=reply, + ) + continue + + # Welcome Support + elif new_mem.id in DEMONS: + update.effective_message.reply_text( + "ʜᴜʜ! ɪs ᴛʜᴀᴛ ᴀ ғʀɪᴇɴᴅ <3", + reply_to_message_id=reply, + ) + continue + + # Welcome WOLVES + elif new_mem.id in WOLVES: + update.effective_message.reply_text( + "ᴏᴏғ! ᴍʏ ᴄʟᴀssᴍᴀᴛᴇ ᴊᴜsᴛ ᴊᴏɪɴᴇᴅ!", reply_to_message_id=reply + ) + continue + + # Welcome yourself + elif new_mem.id == bot.id: + update.effective_message.reply_text( + "ᴛʜᴀɴᴋs ғᴏʀ ᴀᴅᴅɪɴɢ ᴍᴇ! ᴄʜᴇᴄᴋᴏᴜᴛ @AbishnoiMF ғᴏʀ ᴍᴏʀᴇ.", + reply_to_message_id=reply, + ) + continue + + else: + buttons = sql.get_welc_buttons(chat.id) + keyb = build_keyboard(buttons) + + if welc_type not in (sql.Types.TEXT, sql.Types.BUTTON_TEXT): + media_wel = True + + first_name = ( + new_mem.first_name or "PersonWithNoName" + ) # edge case of empty name - occurs for some bugs. + + if cust_welcome: + if cust_welcome == sql.DEFAULT_WELCOME: + cust_welcome = random.choice( + sql.DEFAULT_WELCOME_MESSAGES + ).format(first=escape_markdown(first_name)) + + if new_mem.last_name: + fullname = escape_markdown(f"{first_name} {new_mem.last_name}") + else: + fullname = escape_markdown(first_name) + count = chat.get_member_count() + mention = mention_markdown(new_mem.id, escape_markdown(first_name)) + if new_mem.username: + username = "@" + escape_markdown(new_mem.username) + else: + username = mention + + valid_format = escape_invalid_curly_brackets( + cust_welcome, VALID_WELCOME_FORMATTERS + ) + res = valid_format.format( + first=escape_markdown(first_name), + last=escape_markdown(new_mem.last_name or first_name), + fullname=escape_markdown(fullname), + username=username, + mention=mention, + count=count, + chatname=escape_markdown(chat.title), + id=new_mem.id, + ) + + else: + res = random.choice(sql.DEFAULT_WELCOME_MESSAGES).format( + first=escape_markdown(first_name) + ) + keyb = [] + + backup_message = random.choice(sql.DEFAULT_WELCOME_MESSAGES).format( + first=escape_markdown(first_name) + ) + keyboard = InlineKeyboardMarkup(keyb) + + else: + welcome_bool = False + res = None + keyboard = None + backup_message = None + reply = None + + # User exceptions from welcomemutes + if ( + is_user_ban_protected(chat, new_mem.id, chat.get_member(new_mem.id)) + or human_checks + ): + should_mute = False + # Join welcome: soft mute + if new_mem.is_bot: + should_mute = False + + if user.id == new_mem.id and should_mute: + if welc_mutes == "soft": + bot.restrict_chat_member( + chat.id, + new_mem.id, + permissions=ChatPermissions( + can_send_messages=True, + can_send_media_messages=False, + can_send_other_messages=False, + can_invite_users=False, + can_pin_messages=False, + can_send_polls=False, + can_change_info=False, + can_add_web_page_previews=False, + ), + until_date=(int(time.time() + 24 * 60 * 60)), + ) + sql.set_human_checks(user.id, chat.id) + if welc_mutes == "strong": + welcome_bool = False + if not media_wel: + VERIFIED_USER_WAITLIST.update( + { + (chat.id, new_mem.id): { + "should_welc": should_welc, + "media_wel": False, + "status": False, + "update": update, + "res": res, + "keyboard": keyboard, + "backup_message": backup_message, + } + } + ) + else: + VERIFIED_USER_WAITLIST.update( + { + (chat.id, new_mem.id): { + "should_welc": should_welc, + "chat_id": chat.id, + "status": False, + "media_wel": True, + "cust_content": cust_content, + "welc_type": welc_type, + "res": res, + "keyboard": keyboard, + } + } + ) + new_join_mem = ( + f"[{escape_markdown(new_mem.first_name)}](tg://user?id={user.id})" + ) + message = msg.reply_text( + f"{new_join_mem}, ᴄʟɪᴄᴋ ᴛʜᴇ ʙᴜᴛᴛᴏɴ ʙᴇʟᴏᴡ ᴛᴏ ᴘʀᴏᴠᴇ ʏᴏᴜ'ʀᴇ ʜᴜᴍᴀɴ.\nʏᴏᴜ ʜᴀᴠᴇ 119 sᴇᴄᴏɴᴅs.", + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text="ʏᴇs, I'ᴍ ʜᴜᴍᴀɴ.", + callback_data=f"user_join_({new_mem.id})", + ) + ] + ] + ), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + allow_sending_without_reply=True, + ) + bot.restrict_chat_member( + chat.id, + new_mem.id, + permissions=ChatPermissions( + can_send_messages=False, + can_invite_users=False, + can_pin_messages=False, + can_send_polls=False, + can_change_info=False, + can_send_media_messages=False, + can_send_other_messages=False, + can_add_web_page_previews=False, + ), + ) + job_queue.run_once( + partial(check_not_bot, new_mem, chat.id, message.message_id), + 120, + name="welcomemute", + ) + if welc_mutes == "captcha": + btn = [] + # Captcha image size number (2 -> 640x360) + CAPCTHA_SIZE_NUM = 2 + # Create Captcha Generator object of specified size + generator = CaptchaGenerator(CAPCTHA_SIZE_NUM) + + # Generate a captcha image + captcha = generator.gen_captcha_image(difficult_level=3) + # Get information + image = captcha["image"] + characters = captcha["characters"] + # print(characters) + fileobj = BytesIO() + fileobj.name = f"captcha_{new_mem.id}.png" + image.save(fp=fileobj) + fileobj.seek(0) + CAPTCHA_ANS_DICT[(chat.id, new_mem.id)] = int(characters) + welcome_bool = False + if not media_wel: + VERIFIED_USER_WAITLIST.update( + { + (chat.id, new_mem.id): { + "should_welc": should_welc, + "media_wel": False, + "status": False, + "update": update, + "res": res, + "keyboard": keyboard, + "backup_message": backup_message, + "captcha_correct": characters, + } + } + ) + else: + VERIFIED_USER_WAITLIST.update( + { + (chat.id, new_mem.id): { + "should_welc": should_welc, + "chat_id": chat.id, + "status": False, + "media_wel": True, + "cust_content": cust_content, + "welc_type": welc_type, + "res": res, + "keyboard": keyboard, + "captcha_correct": characters, + } + } + ) + + nums = [random.randint(1000, 9999) for _ in range(7)] + nums.append(characters) + random.shuffle(nums) + to_append = [] + # print(nums) + for a in nums: + to_append.append( + InlineKeyboardButton( + text=str(a), + callback_data=f"user_captchajoin_({chat.id},{new_mem.id})_({a})", + ) + ) + if len(to_append) > 2: + btn.append(to_append) + to_append = [] + if to_append: + btn.append(to_append) + + message = msg.reply_photo( + fileobj, + caption=f"ᴡᴇʟᴄᴏᴍᴇ [{escape_markdown(new_mem.first_name)}](tg://user?id={user.id}). ᴄʟɪᴄᴋ ᴛʜᴇ ᴄᴏʀʀᴇᴄᴛ ʙᴜᴛᴛᴏɴ ᴛᴏ ɢᴇᴛ ᴜɴᴍᴜᴛᴇᴅ!\n" + f"ʏᴏᴜ ɢᴏᴛ 119 sᴇᴄᴏɴᴅs ғᴏʀ ᴛʜɪs.", + reply_markup=InlineKeyboardMarkup(btn), + parse_mode=ParseMode.MARKDOWN, + reply_to_message_id=reply, + allow_sending_without_reply=True, + ) + bot.restrict_chat_member( + chat.id, + new_mem.id, + permissions=ChatPermissions( + can_send_messages=False, + can_invite_users=False, + can_pin_messages=False, + can_send_polls=False, + can_change_info=False, + can_send_media_messages=False, + can_send_other_messages=False, + can_add_web_page_previews=False, + ), + ) + job_queue.run_once( + partial(check_not_bot, new_mem, chat.id, message.message_id), + 120, + name="welcomemute", + ) + + if welcome_bool: + if media_wel: + if ENUM_FUNC_MAP[welc_type] == dispatcher.bot.send_sticker: + sent = ENUM_FUNC_MAP[welc_type]( + chat.id, + cust_content, + reply_markup=keyboard, + reply_to_message_id=reply, + ) + else: + sent = ENUM_FUNC_MAP[welc_type]( + chat.id, + cust_content, + caption=res, + reply_markup=keyboard, + reply_to_message_id=reply, + parse_mode="markdown", + ) + else: + sent = send(update, res, keyboard, backup_message) + prev_welc = sql.get_clean_pref(chat.id) + if prev_welc: + try: + bot.delete_message(chat.id, prev_welc) + except BadRequest: + pass + + if sent: + sql.set_clean_welcome(chat.id, sent.message_id) + + if not log_setting.log_joins: + return "" + if welcome_log: + return welcome_log + + return "" + + +def check_not_bot( + member: User, chat_id: int, message_id: int, context: CallbackContext +): + bot = context.bot + member_dict = VERIFIED_USER_WAITLIST.pop((chat_id, member.id)) + member_status = member_dict.get("status") + if not member_status: + try: + bot.unban_chat_member(chat_id, member.id) + except BadRequest: + pass + + try: + bot.edit_message_text( + "*ᴋɪᴄᴋs ᴜsᴇʀ*\nᴛʜᴇʏ ᴄᴀɴ ᴀʟᴡᴀʏs ʀᴇᴊᴏɪɴ ᴀɴᴅ ᴛʀʏ.", + chat_id=chat_id, + message_id=message_id, + ) + except TelegramError: + bot.delete_message(chat_id=chat_id, message_id=message_id) + bot.send_message( + "{} ᴡᴀs ᴋɪᴄᴋᴇᴅ ᴀs ᴛʜᴇʏ ғᴀɪʟᴇᴅ ᴛᴏ ᴠᴇʀɪғʏ ᴛʜᴇᴍsᴇʟᴠᴇs".format( + mention_html(member.id, member.first_name) + ), + chat_id=chat_id, + parse_mode=ParseMode.HTML, + ) + + +def left_member(update: Update, context: CallbackContext): # sourcery no-metrics + bot = context.bot + chat = update.effective_chat + user = update.effective_user + should_goodbye, cust_goodbye, goodbye_type = sql.get_gdbye_pref(chat.id) + + if user.id == bot.id: + return + + reply = update.message.message_id + cleanserv = sql.clean_service(chat.id) + # Clean service welcome + if cleanserv: + try: + dispatcher.bot.delete_message(chat.id, update.message.message_id) + except BadRequest: + pass + reply = False + + if should_goodbye: + + left_mem = update.effective_message.left_chat_member + if left_mem: + + # Thingy for spamwatched users + if sw: + sw_ban = sw.get_ban(left_mem.id) + if sw_ban: + return + + # Dont say goodbyes to gbanned users + if is_user_gbanned(left_mem.id): + return + + # Ignore bot being kicked + if left_mem.id == bot.id: + return + + # Give the owner a special goodbye + if left_mem.id == OWNER_ID: + update.effective_message.reply_text( + "sᴏʀʀʏ ᴛᴏ sᴇᴇ ʏᴏᴜ ʟᴇᴀᴠᴇ :(", reply_to_message_id=reply + ) + return + + # Give the devs a special goodbye + elif left_mem.id in DEV_USERS: + update.effective_message.reply_text( + "sᴇᴇ ʏᴏᴜ ʟᴀᴛᴇʀ ᴀᴛ ᴛʜᴇ ᴇᴀɢʟᴇ ᴜɴɪᴏɴ!", + reply_to_message_id=reply, + ) + return + + # if media goodbye, use appropriate function for it + if goodbye_type not in [sql.Types.TEXT, sql.Types.BUTTON_TEXT]: + ENUM_FUNC_MAP[goodbye_type](chat.id, cust_goodbye) + return + + first_name = ( + left_mem.first_name or "PersonWithNoName" + ) # edge case of empty name - occurs for some bugs. + if cust_goodbye: + if cust_goodbye == sql.DEFAULT_GOODBYE: + cust_goodbye = random.choice(sql.DEFAULT_GOODBYE_MESSAGES).format( + first=escape_markdown(first_name) + ) + if left_mem.last_name: + fullname = escape_markdown(f"{first_name} {left_mem.last_name}") + else: + fullname = escape_markdown(first_name) + count = chat.get_member_count() + mention = mention_markdown(left_mem.id, first_name) + if left_mem.username: + username = "@" + escape_markdown(left_mem.username) + else: + username = mention + + valid_format = escape_invalid_curly_brackets( + cust_goodbye, VALID_WELCOME_FORMATTERS + ) + res = valid_format.format( + first=escape_markdown(first_name), + last=escape_markdown(left_mem.last_name or first_name), + fullname=escape_markdown(fullname), + username=username, + mention=mention, + count=count, + chatname=escape_markdown(chat.title), + id=left_mem.id, + ) + buttons = sql.get_gdbye_buttons(chat.id) + keyb = build_keyboard(buttons) + + else: + res = random.choice(sql.DEFAULT_GOODBYE_MESSAGES).format( + first=first_name + ) + keyb = [] + + keyboard = InlineKeyboardMarkup(keyb) + + send( + update, + res, + keyboard, + random.choice(sql.DEFAULT_GOODBYE_MESSAGES).format(first=first_name), + ) + + +@u_admin +def welcome(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + # if no args, show current replies. + if not args or args[0].lower() == "noformat": + noformat = True + pref, welcome_m, cust_content, welcome_type = sql.get_welc_pref(chat.id) + update.effective_message.reply_text( + f"ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ɪᴛ's ᴡᴇʟᴄᴏᴍᴇ sᴇᴛᴛɪɴɢ sᴇᴛ ᴛᴏ: `{pref}`.\n" + f"*ᴛʜᴇ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ (not filling the {{}}) ɪs:*", + parse_mode=ParseMode.MARKDOWN, + ) + + if welcome_type in [sql.Types.BUTTON_TEXT, sql.Types.TEXT]: + buttons = sql.get_welc_buttons(chat.id) + if noformat: + welcome_m += revert_buttons(buttons) + update.effective_message.reply_text(welcome_m) + + else: + keyb = build_keyboard(buttons) + keyboard = InlineKeyboardMarkup(keyb) + + send(update, welcome_m, keyboard, sql.DEFAULT_WELCOME) + else: + buttons = sql.get_welc_buttons(chat.id) + if noformat: + welcome_m += revert_buttons(buttons) + ENUM_FUNC_MAP[welcome_type](chat.id, cust_content, caption=welcome_m) + + else: + keyb = build_keyboard(buttons) + keyboard = InlineKeyboardMarkup(keyb) + ENUM_FUNC_MAP[welcome_type]( + chat.id, + cust_content, + caption=welcome_m, + reply_markup=keyboard, + parse_mode=ParseMode.MARKDOWN, + disable_web_page_preview=True, + ) + + elif len(args) >= 1: + if args[0].lower() in ("on", "yes"): + sql.set_welc_preference(str(chat.id), True) + update.effective_message.reply_text( + "ᴏᴋᴀʏ! I'll ɢʀᴇᴇᴛ ᴍᴇᴍʙᴇʀs ᴡʜᴇɴ ᴛʜᴇʏ ᴊᴏɪɴ." + ) + + elif args[0].lower() in ("off", "no"): + sql.set_welc_preference(str(chat.id), False) + update.effective_message.reply_text( + "I'll ɢᴏ ʟᴏᴀғ ᴀʀᴏᴜɴᴅ ᴀɴᴅ ɴᴏᴛ ᴡᴇʟᴄᴏᴍᴇ ᴀɴʏᴏɴᴇ ᴛʜᴇɴ." + ) + + else: + update.effective_message.reply_text( + "I ᴜɴᴅᴇʀsᴛᴀɴᴅ 'on/yes' ᴏʀ 'off/no' ᴏɴʟʏ!" + ) + + +@u_admin +def goodbye(update: Update, context: CallbackContext): + args = context.args + chat = update.effective_chat + + if not args or args[0] == "noformat": + noformat = True + pref, goodbye_m, goodbye_type = sql.get_gdbye_pref(chat.id) + update.effective_message.reply_text( + f"ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ɪᴛ's ɢᴏᴏᴅʙʏᴇ sᴇᴛᴛɪɴɢ sᴇᴛ ᴛᴏ: `{pref}`.\n" + f"*ᴛʜᴇ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ (not filling the {{}}) ɪs:*", + parse_mode=ParseMode.MARKDOWN, + ) + + if goodbye_type == sql.Types.BUTTON_TEXT: + buttons = sql.get_gdbye_buttons(chat.id) + if noformat: + goodbye_m += revert_buttons(buttons) + update.effective_message.reply_text(goodbye_m) + + else: + keyb = build_keyboard(buttons) + keyboard = InlineKeyboardMarkup(keyb) + + send(update, goodbye_m, keyboard, sql.DEFAULT_GOODBYE) + + elif noformat: + ENUM_FUNC_MAP[goodbye_type](chat.id, goodbye_m) + + else: + ENUM_FUNC_MAP[goodbye_type]( + chat.id, goodbye_m, parse_mode=ParseMode.MARKDOWN + ) + + elif len(args) >= 1: + if args[0].lower() in ("on", "yes"): + sql.set_gdbye_preference(str(chat.id), True) + update.effective_message.reply_text("Ok!") + + elif args[0].lower() in ("off", "no"): + sql.set_gdbye_preference(str(chat.id), False) + update.effective_message.reply_text("Ok!") + + else: + # idek what you're writing, say yes or no + update.effective_message.reply_text( + "I ᴜɴᴅᴇʀsᴛᴀɴᴅ 'on/yes' ᴏʀ 'off/no' ᴏɴʟʏ!" + ) + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def set_welcome(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + + text, data_type, content, buttons = get_welcome_type(msg) + + if data_type is None: + msg.reply_text("ʏᴏᴜ ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғʏ ᴡʜᴀᴛ ᴛᴏ ʀᴇᴘʟʏ ᴡɪᴛʜ!") + return "" + + sql.set_custom_welcome(chat.id, content, text, data_type, buttons) + msg.reply_text("sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴛ ᴄᴜsᴛᴏᴍ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ!") + + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#sᴇᴛ_ᴡᴇʟᴄᴏᴍᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"sᴇᴛ ᴛʜᴇ welcome ᴍᴇssᴀɢᴇ." + ) + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def reset_welcome(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + + sql.set_custom_welcome(chat.id, None, sql.DEFAULT_WELCOME, sql.Types.TEXT) + update.effective_message.reply_text( + "sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇsᴇᴛ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇғᴀᴜʟᴛ!" + ) + + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴇsᴇᴛ_ᴡᴇʟᴄᴏᴍᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʀᴇsᴇᴛ ᴛʜᴇ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇғᴀᴜʟᴛ." + ) + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def set_goodbye(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + text, data_type, content, buttons = get_welcome_type(msg) + + if data_type is None: + msg.reply_text("You ᴅɪᴅɴ'ᴛ sᴘᴇᴄɪғʏ ᴡʜᴀᴛ ᴛᴏ ʀᴇᴘʟʏ ᴡɪᴛʜ!") + return "" + + sql.set_custom_gdbye(chat.id, content or text, data_type, buttons) + msg.reply_text("sᴜᴄᴄᴇssғᴜʟʟʏ sᴇᴛ ᴄᴜsᴛᴏᴍ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#sᴇᴛ_ɢᴏᴏᴅʙʏᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"sᴇᴛ ᴛʜᴇ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ." + ) + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def reset_goodbye(update: Update, context: CallbackContext) -> str: + chat = update.effective_chat + user = update.effective_user + + sql.set_custom_gdbye(chat.id, sql.DEFAULT_GOODBYE, sql.Types.TEXT) + update.effective_message.reply_text( + "sᴜᴄᴄᴇssғᴜʟʟʏ ʀᴇsᴇᴛ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴅᴇғᴀᴜʟᴛ!" + ) + + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ʀᴇsᴇᴛ_ɢᴏᴏᴅʙʏᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʀᴇsᴇᴛ ᴛʜᴇ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ." + ) + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def welcomemute(update: Update, context: CallbackContext) -> str: + args = context.args + chat = update.effective_chat + user = update.effective_user + msg = update.effective_message + + if len(args) >= 1: + if args[0].lower() in ("off", "no"): + sql.set_welcome_mutes(chat.id, False) + msg.reply_text("I ᴡɪʟʟ ɴᴏ ʟᴏɴɢᴇʀ ᴍᴜᴛᴇ ᴘᴇᴏᴘʟᴇ ᴏɴ ᴊᴏɪɴɪɴɢ!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴇʟᴄᴏᴍᴇ_ᴍᴜᴛᴇ\n" + f"<b>• ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴜᴛᴇ ᴛᴏ <b>ᴏғғ</b>." + ) + elif args[0].lower() in ["soft"]: + sql.set_welcome_mutes(chat.id, "soft") + msg.reply_text( + "I ᴡɪʟʟ ʀᴇsᴛʀɪᴄᴛ ᴜsᴇʀ's ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ sᴇɴᴅ ᴍᴇᴅɪᴀ ғᴏʀ 24 ʜᴏᴜʀs." + ) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴇʟᴄᴏᴍᴇ_ᴍᴜᴛᴇ\n" + f"<b>• ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴜᴛᴇ ᴛᴏ <b>sᴏғᴛ</b>." + ) + elif args[0].lower() in ["strong"]: + sql.set_welcome_mutes(chat.id, "strong") + msg.reply_text( + "I ᴡɪʟʟ ɴᴏᴡ ᴍᴜᴛᴇ ᴘᴇᴏᴘʟᴇ ᴡʜᴇɴ ᴛʜᴇʏ ᴊᴏɪɴ ᴜɴᴛɪʟ ᴛʜᴇʏ ᴘʀᴏᴠᴇ ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ᴀ ʙᴏᴛ.\nᴛʜᴇʏ ᴡɪʟʟ ʜᴀᴠᴇ 119 sᴇᴄᴏɴᴅs " + "ʙᴇғᴏʀᴇ ᴛʜᴇʏ ɢᴇᴛ ᴋɪᴄᴋᴇᴅ. " + ) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴇʟᴄᴏᴍᴇ_ᴍᴜᴛᴇ\n" + f"<b>• ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴛᴏɢɢʟᴇᴅ ᴍᴜᴛᴇ ᴛᴏ <b>sᴛʀᴏɴɢ</b>." + ) + elif args[0].lower() in ["captcha"]: + sql.set_welcome_mutes(chat.id, "captcha") + msg.reply_text( + "I ᴡɪʟʟ ɴᴏᴡ ᴍᴜᴛᴇ ᴘᴇᴏᴘʟᴇ ᴡʜᴇɴ ᴛʜᴇʏ ᴊᴏɪɴ ᴜɴᴛɪʟ ᴛʜᴇʏ ᴘʀᴏᴠᴇ ᴛʜᴇʏ'ʀᴇ ɴᴏᴛ ᴀ ʙᴏᴛ.\n ᴛʜᴇʏ ʜᴀᴠᴇ ᴛᴏ sᴏʟᴠᴇ a " + "ᴄᴀᴘᴛᴄʜᴀ ᴛᴏ ɢᴇᴛ ᴜɴᴍᴜᴛᴇᴅ. " + ) + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴡᴇʟᴄᴏᴍᴇ_ᴍᴜᴛᴇ\n" + f"<b>• ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴜᴛᴇ ᴛᴏ <b>ᴄᴀᴘᴛᴄʜᴀ</b>." + ) + else: + msg.reply_text( + "ᴘʟᴇᴀsᴇ ᴇɴᴛᴇʀ `off`/`no`/`soft`/`strong`/`captcha`!", + parse_mode=ParseMode.MARKDOWN, + ) + return "" + else: + curr_setting = sql.welcome_mutes(chat.id) + reply = ( + f"\n ɢɪᴠᴇ ᴍᴇ ᴀ sᴇᴛᴛɪɴɢ!\nᴄʜᴏᴏsᴇ ᴏɴᴇ ᴏᴜᴛ ᴏғ: `off`/`no` ᴏʀ `soft`, `strong` ᴏʀ `captcha` ᴏɴʟʏ! \n" + f"ᴄᴜʀʀᴇɴᴛ sᴇᴛᴛɪɴɢ: `{curr_setting}`" + ) + msg.reply_text(reply, parse_mode=ParseMode.MARKDOWN) + return "" + + +@user_admin(AdminPerms.CAN_CHANGE_INFO) +@loggable +def clean_welcome(update: Update, context: CallbackContext) -> str: + args = context.args + chat = update.effective_chat + user = update.effective_user + + if not args: + clean_pref = sql.get_clean_pref(chat.id) + if clean_pref: + update.effective_message.reply_text( + "I sʜᴏᴜʟᴅ ʙᴇ ᴅᴇʟᴇᴛɪɴɢ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs ᴜᴘ ᴛᴏ ᴛᴡᴏ ᴅᴀʏs ᴏʟᴅ." + ) + else: + update.effective_message.reply_text( + "I'ᴍ ᴄᴜʀʀᴇɴᴛʟʏ not ᴅᴇʟᴇᴛɪɴɢ ᴏʟᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs!" + ) + return "" + + if args[0].lower() in ("on", "yes"): + sql.set_clean_welcome(str(chat.id), True) + update.effective_message.reply_text("I'ʟʟ ᴛʀʏ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴏʟᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs!") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴄʟᴇᴀɴ_ᴡᴇʟᴄᴏᴍᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴄʟᴇᴀɴ ᴡᴇʟᴄᴏᴍᴇs ᴛᴏ <code>ON</code>." + ) + elif args[0].lower() in ("off", "no"): + sql.set_clean_welcome(str(chat.id), False) + update.effective_message.reply_text("I ᴡᴏɴ'ᴛ ᴅᴇʟᴇᴛᴇ ᴏʟᴅ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs.") + return ( + f"<b>{html.escape(chat.title)}:</b>\n" + f"#ᴄʟᴇᴀɴ_ᴡᴇʟᴄᴏᴍᴇ\n" + f"<b>ᴀᴅᴍɪɴ:</b> {mention_html(user.id, user.first_name)}\n" + f"ʜᴀs ᴛᴏɢɢʟᴇᴅ ᴄʟᴇᴀɴ ᴡᴇʟᴄᴏᴍᴇs ᴛᴏ <code>OFF</code>." + ) + else: + update.effective_message.reply_text("I ᴜɴᴅᴇʀsᴛᴀɴᴅ 'on/yes' ᴏʀ 'off/no' only!") + return "" + + +def user_button(update: Update, context: CallbackContext): + chat = update.effective_chat + user = update.effective_user + query = update.callback_query + bot = context.bot + match = re.match(r"user_join_\((.+?)\)", query.data) + message = update.effective_message + join_user = int(match.group(1)) + + if join_user == user.id: + sql.set_human_checks(user.id, chat.id) + member_dict = VERIFIED_USER_WAITLIST[(chat.id, user.id)] + member_dict["status"] = True + query.answer(text="ʏᴇᴇᴛ ! ʏᴏᴜ'ʀᴇ ᴀ ʜᴜᴍᴀɴ, ᴜɴᴍᴜᴛᴇᴅ!") + bot.restrict_chat_member( + chat.id, + user.id, + permissions=ChatPermissions( + can_send_messages=True, + can_invite_users=True, + can_pin_messages=True, + can_send_polls=True, + can_change_info=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + ), + ) + try: + bot.deleteMessage(chat.id, message.message_id) + except: + pass + if member_dict["should_welc"]: + if member_dict["media_wel"]: + sent = ENUM_FUNC_MAP[member_dict["welc_type"]]( + member_dict["chat_id"], + member_dict["cust_content"], + caption=member_dict["res"], + reply_markup=member_dict["keyboard"], + parse_mode="markdown", + ) + else: + sent = send( + member_dict["update"], + member_dict["res"], + member_dict["keyboard"], + member_dict["backup_message"], + ) + + prev_welc = sql.get_clean_pref(chat.id) + if prev_welc: + try: + bot.delete_message(chat.id, prev_welc) + except BadRequest: + pass + + if sent: + sql.set_clean_welcome(chat.id, sent.message_id) + + else: + query.answer(text="ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀʟʟᴏᴡᴇᴅ ᴛᴏ ᴅᴏ ᴛʜɪs!") + + +def user_captcha_button(update: Update, context: CallbackContext): + # sourcery no-metrics + chat = update.effective_chat + user = update.effective_user + query = update.callback_query + bot = context.bot + # print(query.data) + match = re.match(r"user_captchajoin_\(([\d\-]+),(\d+)\)_\((\d{4})\)", query.data) + message = update.effective_message + join_chat = int(match.group(1)) + join_user = int(match.group(2)) + captcha_ans = int(match.group(3)) + join_usr_data = bot.getChat(join_user) + + if join_user == user.id: + c_captcha_ans = CAPTCHA_ANS_DICT.pop((join_chat, join_user)) + if c_captcha_ans == captcha_ans: + sql.set_human_checks(user.id, chat.id) + member_dict = VERIFIED_USER_WAITLIST[(chat.id, user.id)] + member_dict["status"] = True + query.answer(text="ʏᴇᴇᴛ! ʏᴏᴜ'ʀᴇ a ʜᴜᴍᴀɴ, ᴜɴᴍᴜᴛᴇᴅ!") + bot.restrict_chat_member( + chat.id, + user.id, + permissions=ChatPermissions( + can_send_messages=True, + can_invite_users=True, + can_pin_messages=True, + can_send_polls=True, + can_change_info=True, + can_send_media_messages=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + ), + ) + try: + bot.deleteMessage(chat.id, message.message_id) + except: + pass + if member_dict["should_welc"]: + if member_dict["media_wel"]: + sent = ENUM_FUNC_MAP[member_dict["welc_type"]]( + member_dict["chat_id"], + member_dict["cust_content"], + caption=member_dict["res"], + reply_markup=member_dict["keyboard"], + parse_mode="markdown", + ) + else: + sent = send( + member_dict["update"], + member_dict["res"], + member_dict["keyboard"], + member_dict["backup_message"], + ) + + prev_welc = sql.get_clean_pref(chat.id) + if prev_welc: + try: + bot.delete_message(chat.id, prev_welc) + except BadRequest: + pass + + if sent: + sql.set_clean_welcome(chat.id, sent.message_id) + else: + try: + bot.deleteMessage(chat.id, message.message_id) + except: + pass + kicked_msg = f""" + ❌ [{escape_markdown(join_usr_data.first_name)}](tg://user?id={join_user}) ғᴀɪʟᴇᴅ ᴛʜᴇ ᴄᴀᴘᴛᴄʜᴀ ᴀɴᴅ ᴡᴀs ᴋɪᴄᴋᴇᴅ. + """ + query.answer(text="ᴡʀᴏɴɢ ᴀɴsᴡᴇʀ") + res = chat.unban_member(join_user) + if res: + bot.sendMessage( + chat_id=chat.id, text=kicked_msg, parse_mode=ParseMode.MARKDOWN + ) + + else: + query.answer(text="ᴀʙᴇ ʟᴇᴠᴅᴇ ᴀᴘɴᴀ ᴋᴀᴍ ᴋᴀʀ ɴᴀ!") + + +WELC_HELP_TXT = ( + "Your group's welcome/goodbye messages can be personalised in multiple ways. If you want the messages" + " to be individually generated, like the default welcome message is, you can use *these* variables:\n" + " • `{first}`*:* this represents the user's *first* name\n" + " • `{last}`*:* this represents the user's *last* name. Defaults to *first name* if user has no " + "last name.\n" + " • `{fullname}`*:* this represents the user's *full* name. Defaults to *first name* if user has no " + "last name.\n" + " • `{username}`*:* this represents the user's *username*. Defaults to a *mention* of the user's " + "first name if has no username.\n" + " • `{mention}`*:* this simply *mentions* a user - tagging them with their first name.\n" + " • `{id}`*:* this represents the user's *id*\n" + " • `{count}`*:* this represents the user's *member number*.\n" + " • `{chatname}`*:* this represents the *current chat name*.\n" + "\nEach variable MUST be surrounded by `{}` to be replaced.\n" + "Welcome messages also support markdown, so you can make any elements bold/italic/code/links. " + "Buttons are also supported, so you can make your welcomes look awesome with some nice intro " + "buttons.\n" + f"To create a button linking to your rules, use this: `[Rules](buttonurl://t.me/{dispatcher.bot.username}?start=group_id)`. " + "Simply replace `group_id` with your group's id, which can be obtained via /id, and you're good to " + "go. Note that group ids are usually preceded by a `-` sign; this is required, so please don't " + "remove it.\n" + "You can even set images/gifs/videos/voice messages as the welcome message by " + "replying to the desired media, and calling `/setwelcome`." +) + +WELC_MUTE_HELP_TXT = ( + "You can get the bot to mute new people who join your group and hence prevent spambots from flooding your group. " + "The following options are possible:\n" + "• `/welcomemute soft`*:* restricts new members from sending media for 24 hours.\n" + "• `/welcomemute strong`*:* mutes new members till they tap on a button thereby verifying they're human.\n" + "• `/welcomemute captcha`*:* mutes new members till they solve a button captcha thereby verifying they're human.\n" + "• `/welcomemute off`*:* turns off welcomemute.\n" + "*Note:* Strong mode kicks a user from the chat if they dont verify in 120seconds. They can always rejoin though" +) + + +@u_admin +def welcome_help(update: Update, context: CallbackContext): + update.effective_message.reply_text(WELC_HELP_TXT, parse_mode=ParseMode.MARKDOWN) + + +@u_admin +def welcome_mute_help(update: Update, context: CallbackContext): + update.effective_message.reply_text( + WELC_MUTE_HELP_TXT, parse_mode=ParseMode.MARKDOWN + ) + + +# TODO: get welcome data from group butler snap +# def __import_data__(chat_id, data): +# welcome = data.get('info', {}).get('rules') +# welcome = welcome.replace('$username', '{username}') +# welcome = welcome.replace('$name', '{fullname}') +# welcome = welcome.replace('$id', '{id}') +# welcome = welcome.replace('$title', '{chatname}') +# welcome = welcome.replace('$surname', '{lastname}') +# welcome = welcome.replace('$rules', '{rules}') +# sql.set_custom_welcome(chat_id, welcome, sql.Types.TEXT) + + +def __migrate__(old_chat_id, new_chat_id): + sql.migrate_chat(old_chat_id, new_chat_id) + + +def __chat_settings__(chat_id, user_id): + welcome_pref = sql.get_welc_pref(chat_id)[0] + goodbye_pref = sql.get_gdbye_pref(chat_id)[0] + return ( + "ᴛʜɪs ᴄʜᴀᴛ ʜᴀs ɪᴛ's ᴡᴇʟᴄᴏᴍᴇ ᴘʀᴇғᴇʀᴇɴᴄᴇ sᴇᴛ ᴛᴏ `{}`.\n" + "It's ɢᴏᴏᴅʙʏᴇ ᴘʀᴇғᴇʀᴇɴᴄᴇ ɪs `{}`.".format(welcome_pref, goodbye_pref) + ) + + +__help__ = """ +*ᴀᴅᴍɪɴs ᴏɴʟʏ:* + +❂ /welcome <ᴏɴ/ᴏғғ>*:* `ᴇɴᴀʙʟᴇ/ᴅɪsᴀʙʟᴇ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs.` + +❂ /welcome *:* `sʜᴏᴡs ᴄᴜʀʀᴇɴᴛ ᴡᴇʟᴄᴏᴍᴇ sᴇᴛᴛɪɴɢs.` + +❂ /welcome noformat *:* `sʜᴏᴡs ᴄᴜʀʀᴇɴᴛ ᴡᴇʟᴄᴏᴍᴇ sᴇᴛᴛɪɴɢs, ᴡɪᴛʜᴏᴜᴛ ᴛʜᴇ ғᴏʀᴍᴀᴛᴛɪɴɢ - ᴜsᴇғᴜʟ ᴛᴏ ʀᴇᴄʏᴄʟᴇ ʏᴏᴜʀ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇs!` + +❂ /goodbye *:* `sᴀᴍᴇ ᴜsᴀɢᴇ ᴀɴᴅ ᴀʀɢs ᴀs` `/ᴡᴇʟᴄᴏᴍᴇ`. + +❂ /setwelcome <sᴏᴍᴇᴛᴇxᴛ>*:* `sᴇᴛ ᴀ ᴄᴜsᴛᴏᴍ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ. ɪғ ᴜsᴇᴅ ʀᴇᴘʟʏɪɴɢ ᴛᴏ ᴍᴇᴅɪᴀ, ᴜsᴇs ᴛʜᴀᴛ ᴍᴇᴅɪᴀ.` + +❂ /setgoodbye <sᴏᴍᴇᴛᴇxᴛ>*:* `sᴇᴛ ᴀ ᴄᴜsᴛᴏᴍ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ. ɪғ ᴜsᴇᴅ ʀᴇᴘʟʏɪɴɢ ᴛᴏ ᴍᴇᴅɪᴀ, ᴜsᴇs ᴛʜᴀᴛ ᴍᴇᴅɪᴀ.` + +❂ /resetwelcome *:* `ʀᴇsᴇᴛ ᴛᴏ ᴛʜᴇ ᴅᴇғᴀᴜʟᴛ ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ.` + +❂ /resetgoodbye *:* `ʀᴇsᴇᴛ ᴛᴏ ᴛʜᴇ ᴅᴇғᴀᴜʟᴛ ɢᴏᴏᴅʙʏᴇ ᴍᴇssᴀɢᴇ.` + +❂ /cleanwelcome <ᴏɴ/ᴏғғ>*:* `ᴏɴ ɴᴇᴡ ᴍᴇᴍʙᴇʀ, ᴛʀʏ ᴛᴏ ᴅᴇʟᴇᴛᴇ ᴛʜᴇ ᴘʀᴇᴠɪᴏᴜs ᴡᴇʟᴄᴏᴍᴇ ᴍᴇssᴀɢᴇ ᴛᴏ ᴀᴠᴏɪᴅ sᴘᴀᴍᴍɪɴɢ ᴛʜᴇ ᴄʜᴀᴛ` + +❂ /welcomemutehelp *:* `ɢɪᴠᴇs ɪɴғᴏʀᴍᴀᴛɪᴏɴ ᴀʙᴏᴜᴛ ᴡᴇʟᴄᴏᴍᴇ ᴍᴜᴛᴇs.` + +❂ /cleanservice <ᴏɴ/ᴏғғ*:* `ᴅᴇʟᴇᴛᴇs ᴛᴇʟᴇɢʀᴀᴍs ᴡᴇʟᴄᴏᴍᴇ/ʟᴇғᴛ sᴇʀᴠɪᴄᴇ ᴍᴇssᴀɢᴇs.` + +""" + +NEW_MEM_HANDLER = MessageHandler( + Filters.status_update.new_chat_members, new_member, run_async=True +) +LEFT_MEM_HANDLER = MessageHandler( + Filters.status_update.left_chat_member, left_member, run_async=True +) +WELC_PREF_HANDLER = CommandHandler( + "welcome", welcome, filters=Filters.chat_type.groups, run_async=True +) +GOODBYE_PREF_HANDLER = CommandHandler( + "goodbye", goodbye, filters=Filters.chat_type.groups, run_async=True +) +SET_WELCOME = CommandHandler( + "setwelcome", set_welcome, filters=Filters.chat_type.groups, run_async=True +) +SET_GOODBYE = CommandHandler( + "setgoodbye", set_goodbye, filters=Filters.chat_type.groups, run_async=True +) +RESET_WELCOME = CommandHandler( + "resetwelcome", reset_welcome, filters=Filters.chat_type.groups, run_async=True +) +RESET_GOODBYE = CommandHandler( + "resetgoodbye", reset_goodbye, filters=Filters.chat_type.groups, run_async=True +) +WELCOMEMUTE_HANDLER = CommandHandler( + "welcomemute", welcomemute, filters=Filters.chat_type.groups, run_async=True +) +# CLEAN_SERVICE_HANDLER = CommandHandler( +# "cleanservice", cleanservice, filters=Filters.chat_type.groups, run_async=True +# ) +CLEAN_WELCOME = CommandHandler( + "cleanwelcome", clean_welcome, filters=Filters.chat_type.groups, run_async=True +) +WELCOME_HELP = CommandHandler("welcomehelp", welcome_help, run_async=True) +WELCOME_MUTE_HELP = CommandHandler("welcomemutehelp", welcome_mute_help, run_async=True) +BUTTON_VERIFY_HANDLER = CallbackQueryHandler( + user_button, pattern=r"user_join_", run_async=True +) +CAPTCHA_BUTTON_VERIFY_HANDLER = CallbackQueryHandler( + user_captcha_button, + pattern=r"user_captchajoin_\([\d\-]+,\d+\)_\(\d{4}\)", + run_async=True, +) + +dispatcher.add_handler(NEW_MEM_HANDLER) +dispatcher.add_handler(LEFT_MEM_HANDLER) +dispatcher.add_handler(WELC_PREF_HANDLER) +dispatcher.add_handler(GOODBYE_PREF_HANDLER) +dispatcher.add_handler(SET_WELCOME) +dispatcher.add_handler(SET_GOODBYE) +dispatcher.add_handler(RESET_WELCOME) +dispatcher.add_handler(RESET_GOODBYE) +dispatcher.add_handler(CLEAN_WELCOME) +dispatcher.add_handler(WELCOME_HELP) +dispatcher.add_handler(WELCOMEMUTE_HANDLER) +# dispatcher.add_handler(CLEAN_SERVICE_HANDLER) +dispatcher.add_handler(BUTTON_VERIFY_HANDLER) +dispatcher.add_handler(WELCOME_MUTE_HELP) +dispatcher.add_handler(CAPTCHA_BUTTON_VERIFY_HANDLER) + +__mod_name__ = "𝚆ᴇʟᴄᴏᴍᴇ" +__command_list__ = [] +__handlers__ = [ + NEW_MEM_HANDLER, + LEFT_MEM_HANDLER, + WELC_PREF_HANDLER, + GOODBYE_PREF_HANDLER, + SET_WELCOME, + SET_GOODBYE, + RESET_WELCOME, + RESET_GOODBYE, + CLEAN_WELCOME, + WELCOME_HELP, + WELCOMEMUTE_HANDLER, + # CLEAN_SERVICE_HANDLER, + BUTTON_VERIFY_HANDLER, + CAPTCHA_BUTTON_VERIFY_HANDLER, + WELCOME_MUTE_HELP, +] diff --git a/Exon/modules/wiki.py b/Exon/modules/wiki.py new file mode 100644 index 00000000..daf8a3ea --- /dev/null +++ b/Exon/modules/wiki.py @@ -0,0 +1,79 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 wikipedia +from telegram import ParseMode, Update +from telegram.ext import CallbackContext +from wikipedia.exceptions import DisambiguationError, PageError + +from Exon import dispatcher +from Exon.modules.disable import DisableAbleCommandHandler + + +def wiki(update: Update, context: CallbackContext): + msg = update.effective_message.reply_to_message or update.effective_message + res = "" + if msg == update.effective_message: + search = msg.text.split(" ", maxsplit=1)[1] + else: + search = msg.text + try: + res = wikipedia.summary(search) + except DisambiguationError as e: + update.message.reply_text( + "ᴅɪsᴀᴍʙɪɢᴜᴀᴛᴇᴅ ᴘᴀɢᴇs ғᴏᴜɴᴅ! ᴀᴅᴊᴜsᴛ ʏᴏᴜʀ ǫᴜᴇʀʏ ᴀᴄᴄᴏʀᴅɪɴɢʟʏ.\n<i>{}</i>".format( + e, + ), + parse_mode=ParseMode.HTML, + ) + except PageError as e: + update.message.reply_text( + "<code>{}</code>".format(e), + parse_mode=ParseMode.HTML, + ) + if res: + result = f"<b>{search}</b>\n\n" + result += f"<i>{res}</i>\n" + result += f"""<a href="https://en.wikipedia.org/wiki/{search.replace(" ", "%20")}">ʀᴇᴀᴅ ᴍᴏʀᴇ...</a>""" + if len(result) > 4000: + with open("result.txt", "w") as f: + f.write(f"{result}\n\nUwU OwO OmO UmU") + with open("result.txt", "rb") as f: + context.bot.send_document( + document=f, + filename=f.name, + reply_to_message_id=update.message.message_id, + chat_id=update.effective_chat.id, + parse_mode=ParseMode.HTML, + ) + else: + update.message.reply_text( + result, + parse_mode=ParseMode.HTML, + disable_web_page_preview=True, + ) + + +WIKI_HANDLER = DisableAbleCommandHandler("wiki", wiki, run_async=True) +dispatcher.add_handler(WIKI_HANDLER) diff --git a/Exon/modules/write.py b/Exon/modules/write.py new file mode 100644 index 00000000..8037d2d9 --- /dev/null +++ b/Exon/modules/write.py @@ -0,0 +1,35 @@ +from pyrogram import filters +from pyrogram.types import Message + +from Exon import pgram + + +@pgram.on_message(filters.command("write")) +async def handwrite(_, message: Message): + if not message.reply_to_message: + name = ( + message.text.split(None, 1)[1] + if len(message.command) < 3 + else message.text.split(None, 1)[1].replace(" ", "%20") + ) + m = await pgram.send_message(message.chat.id, "waito...") + photo = "https://apis.xditya.me/write?text=" + name + await pgram.send_photo(message.chat.id, photo=photo) + await m.delete() + else: + lol = message.reply_to_message.text + name = lol.split(None, 0)[0].replace(" ", "%20") + m = await pgram.send_message(message.chat.id, "waito..") + photo = "https://apis.xditya.me/write?text=" + name + await pgram.send_photo(message.chat.id, photo=photo) + await m.delete() + + +__mod_name__ = "𝚆ʀɪᴛᴇ" + +__help__ = """ + +ᴡʀɪᴛᴇs ᴛʜᴇ ɢɪᴠᴇɴ ᴛᴇxᴛ ᴏɴ ᴡʜɪᴛᴇ ᴘᴀɢᴇ ᴡɪᴛʜ ᴀ ᴘᴇɴ 🖊 + +/write <text> *:*` ᴡʀɪᴛᴇs ᴛʜᴇ ɢɪᴠᴇɴ ᴛᴇxᴛ `. + """ diff --git a/Exon/modules/ytmusic.py b/Exon/modules/ytmusic.py new file mode 100644 index 00000000..a6a4b7e5 --- /dev/null +++ b/Exon/modules/ytmusic.py @@ -0,0 +1,148 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 datetime +import os +from asyncio import get_running_loop +from functools import partial +from io import BytesIO + +from pyrogram import filters +from pytube import YouTube +from requests import get + +from Exon import aiohttpsession as session +from Exon import arq, pgram +from Exon.core.decorators.errors import capture_err +from Exon.utils.pastebin import paste + +is_downloading = False + + +def download_youtube_audio(arq_resp): + r = arq_resp.result[0] + + title = r.title + performer = r.channel + + m, s = r.duration.split(":") + duration = int(datetime.timedelta(minutes=int(m), seconds=int(s)).total_seconds()) + + if duration > 1800: + return + + thumb = get(r.thumbnails[0]).content + with open("thumbnail.png", "wb") as f: + f.write(thumb) + thumbnail_file = "thumbnail.png" + + url = f"https://youtube.com{r.url_suffix}" + yt = YouTube(url) + audio = yt.streams.filter(only_audio=True).get_audio_only() + + out_file = audio.download() + base, _ = os.path.splitext(out_file) + audio_file = base + ".mp3" + os.rename(out_file, audio_file) + + return [title, performer, duration, audio_file, thumbnail_file] + + +@pgram.on_message(filters.command("song") & ~filters.edited) +@capture_err +async def music(_, message): + global is_downloading + if len(message.command) < 2: + return await message.reply_text("/song ɴᴇᴇᴅs a ǫᴜᴇʀʏ ᴀs ᴀʀɢᴜᴍᴇɴᴛ") + + url = message.text.split(None, 1)[1] + if is_downloading: + return await message.reply_text( + "ᴀɴᴏᴛʜᴇʀ ᴅᴏᴡɴʟᴏᴀᴅ ɪs ɪɴ ᴘʀᴏɢʀᴇss, ᴛʀʏ ᴀɢᴀɪɴ ᴀғᴛᴇʀ sᴏᴍᴇᴛɪᴍᴇ." + ) + is_downloading = True + m = await message.reply_text(f"ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ.. {url}", disable_web_page_preview=True) + try: + loop = get_running_loop() + arq_resp = await arq.youtube(url) + music = await loop.run_in_executor( + None, partial(download_youtube_audio, arq_resp) + ) + + if not music: + return await message.reply_text("[ᴇʀʀᴏʀ]: ᴍᴜsɪᴄ ᴛᴏᴏ ʟᴏɴɢ") + ( + title, + performer, + duration, + audio_file, + thumbnail_file, + ) = music + except Exception as e: + is_downloading = False + return await m.edit(str(e)) + await message.reply_audio( + audio_file, + duration=duration, + performer=performer, + title=title, + thumb=thumbnail_file, + ) + await m.delete() + os.remove(audio_file) + os.remove(thumbnail_file) + is_downloading = False + + +# Funtion To Download Song +async def download_song(url): + async with session.get(url) as resp: + song = await resp.read() + song = BytesIO(song) + song.name = "a.mp3" + return song + + +@pgram.on_message(filters.command("lyrics") & ~filters.edited) +async def lyrics_func(_, message): + if len(message.command) < 2: + return await message.reply_text("**ᴜsᴀɢᴇ:**\n/lyrics [QUERY]") + m = await message.reply_text("**sᴇᴀʀᴄʜɪɴɢ**") + query = message.text.strip().split(None, 1)[1] + + resp = await arq.lyrics(query) + + if not (resp.ok and resp.result): + return await m.edit("ɴᴏ ʟʏʀɪᴄs ғᴏᴜɴᴅ.") + + song = resp.result[0] + song_name = song["song"] + artist = song["artist"] + lyrics = song["lyrics"] + msg = f"**{song_name}** | **{artist}**\n\n__{lyrics}__" + + if len(msg) > 4095: + msg = await paste(msg) + msg = f"**ʟʏʀɪᴄs_ᴛᴏᴏ_ʟᴏɴɢ:** [ᴜʀʟ]({msg})" + return await m.edit(msg) diff --git a/Exon/modules/zip.py b/Exon/modules/zip.py new file mode 100644 index 00000000..69973128 --- /dev/null +++ b/Exon/modules/zip.py @@ -0,0 +1,219 @@ +import os +import time +import zipfile + +from telethon import types +from telethon.tl import functions + +from Exon import TEMP_DOWNLOAD_DIRECTORY +from Exon import telethn as client +from Exon.events import register + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + + return isinstance( + ( + await client(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + if isinstance(chat, types.InputPeerChat): + + ui = await client.get_peer_id(user) + ps = ( + await client(functions.messages.GetFullChatRequest(chat.chat_id)) + ).full_chat.participants.participants + return isinstance( + next((p for p in ps if p.user_id == ui), None), + (types.ChatParticipantAdmin, types.ChatParticipantCreator), + ) + return None + + +@register(pattern="^/zip") +async def _(event): + if event.fwd_from: + return + + if not event.is_reply: + await event.reply("ʀᴇᴘʟʏ ᴛᴏ a ғɪʟᴇ to ᴄᴏᴍᴘʀᴇss ɪᴛ.") + return + if event.is_group: + if not (await is_register_admin(event.input_chat, event.message.sender_id)): + await event.reply( + "Hey, ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀᴅᴍɪɴ. ʏᴏᴜ ᴄᴀɴ'ᴛ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ, ʙᴜᴛ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ ɪɴ ᴍʏ ᴅᴍ🙂" + ) + return + + mone = await event.reply("⏳.") + if not os.path.isdir(TEMP_DOWNLOAD_DIRECTORY): + os.makedirs(TEMP_DOWNLOAD_DIRECTORY) + if event.reply_to_msg_id: + reply_message = await event.get_reply_message() + try: + time.time() + downloaded_file_name = await event.client.download_media( + reply_message, TEMP_DOWNLOAD_DIRECTORY + ) + directory_name = downloaded_file_name + except Exception as e: # pylint:disable=C0103,W0703 + await mone.reply(str(e)) + zipfile.ZipFile(directory_name + ".zip", "w", zipfile.ZIP_DEFLATED).write( + directory_name + ) + await event.client.send_file( + event.chat_id, + directory_name + ".zip", + force_document=True, + allow_cache=False, + reply_to=event.message.id, + ) + + +def zipdir(path, ziph): + # ziph is zipfile handle + for root, dirs, files in os.walk(path): + for file in files: + ziph.write(os.path.join(root, file)) + os.remove(os.path.join(root, file)) + + +from datetime import datetime + +from hachoir.metadata import extractMetadata +from hachoir.parser import createParser +from telethon.tl.types import DocumentAttributeVideo + +extracted = TEMP_DOWNLOAD_DIRECTORY + "extracted/" +thumb_image_path = TEMP_DOWNLOAD_DIRECTORY + "/thumb_image.jpg" +if not os.path.isdir(extracted): + os.makedirs(extracted) + + +async def is_register_admin(chat, user): + if isinstance(chat, (types.InputPeerChannel, types.InputChannel)): + + return isinstance( + ( + await client(functions.channels.GetParticipantRequest(chat, user)) + ).participant, + (types.ChannelParticipantAdmin, types.ChannelParticipantCreator), + ) + if isinstance(chat, types.InputPeerChat): + + ui = await client.get_peer_id(user) + ps = ( + await client(functions.messages.GetFullChatRequest(chat.chat_id)) + ).full_chat.participants.participants + return isinstance( + next((p for p in ps if p.user_id == ui), None), + (types.ChatParticipantAdmin, types.ChatParticipantCreator), + ) + return None + + +@register(pattern="^/unzip") +async def _(event): + if event.fwd_from: + return + + if not event.is_reply: + await event.reply("ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴢɪᴘ ғɪʟᴇ.") + return + if event.is_group: + if not (await is_register_admin(event.input_chat, event.message.sender_id)): + await event.reply( + "ʜᴇʏ, ʏᴏᴜ ᴀʀᴇ ɴᴏᴛ ᴀᴅᴍɪɴ. ʏᴏᴜ ᴄᴀɴ'ᴛ ᴜsᴇ ᴛʜɪs ᴄᴏᴍᴍᴀɴᴅ, ʙᴜᴛ ʏᴏᴜ ᴄᴀɴ ᴜsᴇ ɪɴ ᴍʏ ᴅᴍ 🙂" + ) + return + + mone = await event.reply("ᴘʀᴏᴄᴇssɪɴɢ...") + if not os.path.isdir(TEMP_DOWNLOAD_DIRECTORY): + os.makedirs(TEMP_DOWNLOAD_DIRECTORY) + if event.reply_to_msg_id: + start = datetime.now() + reply_message = await event.get_reply_message() + try: + time.time() + downloaded_file_name = await client.download_media( + reply_message, TEMP_DOWNLOAD_DIRECTORY + ) + except Exception as e: + await mone.reply(str(e)) + else: + end = datetime.now() + (end - start).seconds + + with zipfile.ZipFile(downloaded_file_name, "r") as zip_ref: + zip_ref.extractall(extracted) + filename = sorted(get_lst_of_files(extracted, [])) + await event.reply("ᴜɴᴢɪᴘᴘɪɴɢ ɴᴏᴡ 😌") + for single_file in filename: + if os.path.exists(single_file): + caption_rts = os.path.basename(single_file) + force_document = True + supports_streaming = False + document_attributes = [] + if single_file.endswith((".mp4", ".mp3", ".flac", ".webm")): + metadata = extractMetadata(createParser(single_file)) + duration = 0 + width = 0 + height = 0 + if metadata.has("duration"): + duration = metadata.get("duration").seconds + if os.path.exists(thumb_image_path): + metadata = extractMetadata(createParser(thumb_image_path)) + if metadata.has("width"): + width = metadata.get("width") + if metadata.has("height"): + height = metadata.get("height") + document_attributes = [ + DocumentAttributeVideo( + duration=duration, + w=width, + h=height, + round_message=False, + supports_streaming=True, + ) + ] + try: + await client.send_file( + event.chat_id, + single_file, + force_document=force_document, + supports_streaming=supports_streaming, + allow_cache=False, + reply_to=event.message.id, + attributes=document_attributes, + ) + except Exception as e: + await client.send_message( + event.chat_id, + "{} ᴄᴀᴜsᴇᴅ `{}`".format(caption_rts, str(e)), + reply_to=event.message.id, + ) + continue + os.remove(single_file) + os.remove(downloaded_file_name) + + +def get_lst_of_files(input_directory, output_lst): + filesinfolder = os.listdir(input_directory) + for file_name in filesinfolder: + current_file_name = os.path.join(input_directory, file_name) + if os.path.isdir(current_file_name): + return get_lst_of_files(current_file_name, output_lst) + output_lst.append(current_file_name) + return output_lst + + +__help__ = """ + + • /zip*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇʟᴇɢʀᴀᴍ ғɪʟᴇ ᴛᴏ ᴄᴏᴍᴘʀᴇss ɪᴛ ɪɴ .ᴢɪᴘ ғᴏʀᴍᴀᴛ ` + + • /unzip*:* `ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴛᴇʟᴇɢʀᴀᴍ ғɪʟᴇ ᴛᴏ ᴅᴇᴄᴏᴍᴘʀᴇss ɪᴛ ғʀᴏᴍ ᴛʜᴇ .ᴢɪᴘ ғᴏʀᴍᴀᴛ ` +""" + +__mod_name__ = "𝚉ɪᴘᴘɪɴɢ" diff --git a/Exon/modules/zombies.py b/Exon/modules/zombies.py new file mode 100644 index 00000000..1e7a12d5 --- /dev/null +++ b/Exon/modules/zombies.py @@ -0,0 +1,107 @@ +from asyncio import sleep + +from telethon import events +from telethon.errors import ChatAdminRequiredError, UserAdminInvalidError +from telethon.tl.functions.channels import EditBannedRequest +from telethon.tl.types import ChannelParticipantsAdmins, ChatBannedRights + +from Exon import DEMONS, DEV_USERS, DRAGONS, OWNER_ID, telethn + +BANNED_RIGHTS = ChatBannedRights( + until_date=None, + view_messages=True, + send_messages=True, + send_media=True, + send_stickers=True, + send_gifs=True, + send_games=True, + send_inline=True, + embed_links=True, +) + + +UNBAN_RIGHTS = ChatBannedRights( + until_date=None, + send_messages=None, + send_media=None, + send_stickers=None, + send_gifs=None, + send_games=None, + send_inline=None, + embed_links=None, +) + +ONICHAN = [OWNER_ID] + DEV_USERS + DRAGONS + DEMONS + +# Check if user has admin rights + + +async def is_administrator(user_id: int, message): + admin = False + async for user in telethn.iter_participants( + message.chat_id, filter=ChannelParticipantsAdmins + ): + if user_id == user.id or user_id in ONICHAN: + admin = True + break + return admin + + +@telethn.on(events.NewMessage(pattern="^[!/]zombies ?(.*)")) +async def rm_deletedacc(show): + con = show.pattern_match.group(1).lower() + del_u = 0 + del_status = "**ɢʀᴏᴜᴘ ɪs ᴄʟᴇᴀɴ, 0 ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs ғᴏᴜɴᴅ.**" + if con != "clean": + kontol = await show.reply("`sᴇᴀʀᴄʜɪɴɢ ғᴏʀ ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs...`") + async for user in show.client.iter_participants(show.chat_id): + if user.deleted: + del_u += 1 + await sleep(1) + if del_u > 0: + del_status = ( + f"**sᴇᴀʀᴄʜɪɴɢ...** `{del_u}` **ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛ/ᴢᴏᴍʙɪᴇ ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ," + "\nᴄʟᴇᴀɴ ɪᴛ ᴡɪᴛʜ ᴄᴏᴍᴍᴀɴᴅ** `/zombies clean`" + ) + return await kontol.edit(del_status) + chat = await show.get_chat() + admin = chat.admin_rights + creator = chat.creator + if not admin and not creator: + return await show.reply("**sᴏʀʀʏ ʏᴏᴜ'ʀᴇ ɴᴏᴛ ᴀᴅᴍɪɴ!**") + memek = await show.reply("`ʙᴀɴɴɪɴɢ ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs...`") + del_u = 0 + del_a = 0 + async for user in telethn.iter_participants(show.chat_id): + if user.deleted: + try: + await show.client( + EditBannedRequest(show.chat_id, user.id, BANNED_RIGHTS) + ) + except ChatAdminRequiredError: + return await show.edit("`I ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ʙᴀɴ ʀɪɢʜᴛs ɪɴ ᴛʜɪs ɢʀᴏᴜᴘ`") + except UserAdminInvalidError: + del_u -= 1 + del_a += 1 + await telethn(EditBannedRequest(show.chat_id, user.id, UNBAN_RIGHTS)) + del_u += 1 + if del_u > 0: + del_status = f"**Cleaned** `{del_u}` **ᴢᴏᴍʙɪᴇs**" + if del_a > 0: + del_status = ( + f"**ᴢᴏᴍʙɪᴇs** `{del_u}` **ᴢᴏᴍʙɪᴇs** " + f"\n`{del_a}` **ᴀᴅᴍɪɴ ᴢᴏᴍʙɪᴇs ɴᴏᴛ ᴅᴇʟᴇᴛᴇᴅ.**" + ) + await memek.edit(del_status) + + +__help__ = """ +*ʀᴇᴍᴏᴠᴇ ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs* + +• /zombies *:* ` sᴛᴀʀᴛs sᴇᴀʀᴄʜɪɴɢ ғᴏʀ ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs ɪɴ ᴛʜᴇ ɢʀᴏᴜᴘ ` +. +• /zombies clean *:* `ʀᴇᴍᴏᴠᴇ ᴛʜᴇ ᴅᴇʟᴇᴛᴇᴅ ᴀᴄᴄᴏᴜɴᴛs ғʀᴏᴍ ᴛʜᴇ ɢʀᴏᴜᴘ `. +""" + + +__mod_name__ = "𝚉ᴏᴍʙɪᴇs" diff --git "a/Exon/resources/ABISHNOI COPYRIGHT \302\251" "b/Exon/resources/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/resources/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/resources/ArmWrestler.ttf b/Exon/resources/ArmWrestler.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1b35c66b230fd92907f155f4855ef0b5930d5042 GIT binary patch literal 87360 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�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 aHgh`6+lKXM?M9Rx+sZ^9rrl2aZGQqGZS+3? literal 0 HcmV?d00001 diff --git a/Exon/resources/Asau.ttf b/Exon/resources/Asau.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a440aba2cab5e6bba450ee215a8896e545b49bc7 GIT binary patch literal 33268 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 a;}2h^w-oDN`N-Vg%2@6yzva*S-~StdKU1jy literal 0 HcmV?d00001 diff --git a/Exon/resources/TheConfessionFullRegular-8qGz.ttf b/Exon/resources/TheConfessionFullRegular-8qGz.ttf new file mode 100644 index 0000000000000000000000000000000000000000..78e95909c2378c138afbe98bcf637eb54e980804 GIT binary patch literal 30372 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 literal 0 HcmV?d00001 diff --git a/Exon/resources/Vampire_Wars.ttf b/Exon/resources/Vampire_Wars.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ebc0b658a28053d23fc0c4f53144515a50ed91d5 GIT binary patch literal 69116 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 E0iSRpga7~l literal 0 HcmV?d00001 diff --git a/Exon/resources/default.ttf b/Exon/resources/default.ttf new file mode 100644 index 0000000000000000000000000000000000000000..114e6c1968b663086409144e50e7a592bff1d6c2 GIT binary patch literal 136076 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%0Aus|o$luyX&D&6 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 VQlm?y$QD;A35 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 literal 0 HcmV?d00001 diff --git "a/Exon/utils/ABISHNOI COPYRIGHT \302\251" "b/Exon/utils/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/utils/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git "a/Exon/utils/Logo/ABISHNOI COPYRIGHT \302\251" "b/Exon/utils/Logo/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/utils/Logo/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/utils/Logo/Another Danger - Demo.otf b/Exon/utils/Logo/Another Danger - Demo.otf new file mode 100644 index 0000000000000000000000000000000000000000..d99830a1ae4a43d5162fddf3608e94be2b0967dd GIT binary patch literal 42120 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 l+N&0*rWT(M{_*>@qD8DVBm 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Another Danger Slanted - Demo.otf b/Exon/utils/Logo/Another Danger Slanted - Demo.otf new file mode 100644 index 0000000000000000000000000000000000000000..577514a558fd48730c326a84faf52a22f6e981ad GIT binary patch literal 45572 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 CruSk1 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Chopsic.otf b/Exon/utils/Logo/Chopsic.otf new file mode 100644 index 0000000000000000000000000000000000000000..dec2e88126e11625a7e856ba97b80448f950312c GIT binary patch literal 24264 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 MIrkBzuy-N;4~3YIC;$Ke literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/CloisterBlack.ttf b/Exon/utils/Logo/CloisterBlack.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1109bd2018c52be78a53820b6a8abbe527cf9161 GIT binary patch literal 71800 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�UDajNkiG9S2^{ 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Deadly Advance Italic.otf b/Exon/utils/Logo/Deadly Advance Italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..117cf002a0b7733646c26e22a03af07945a9049b GIT binary patch literal 15828 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 Sq!>Vlu@|7c97eok>^}ka#ieEd literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Deadly Advance Italic.ttf b/Exon/utils/Logo/Deadly Advance Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a19adb9fd0b473e066198610fafbc28f147b9228 GIT binary patch literal 15828 zcmeHu3w%`7x$j#0F*C_bo|9xKL7d6cV1O_KNeD<0qDeGBLV^t_D3Ams0Y;ty13o}N zPYctE=m8(RMWHPUBGiD@i!eU0v`y7oj-<5Z$FY>wp41CrX3zb9Ywwv%c-j8${hfPy z@0n!p*=z0f_}2ISzO{yN##kb53S*@;6=f))F#Iq0wv?6LaVJY;ev~hwoK{vfuIAS@ z=T<OwTO!I^%W5W!YX1I$btvyg**UIep!?3OwI5-KH7GwYefCtZ?YZ|~U`(|zCiR&y zb-p(gVlu`%hxe8l%}W|DbZ(r5$AgRwJUFvqYQ0N)=Na_3;eFvuRHWPyI|SuYl(S~e zUeI!|V$4F6(O>S{)G%*ONDcL6tk{e9jm>kXPxXI!IEOKF7TWw^_S6<H`z3o6&olAf zIcMtZhWyxayf6L?@C@+Ioxh-?Y10oG8wU9JX<9j5u6^Yx_a_Yh8?&MspHt&Ye8%@l zZId>_`jREUBxVxr=>_^&0@?`1V!qZk1;<-olFx}1&^!HeT(tGGvA}ZyE}E(PBcZG) z?{gnhnMK{GdN8C%|CTqhMkyK4;uStIq7yLK{VA_>I{9OaWhCn`SOWZAycIK;Mw&+A z*~ujJl-`2}FjgI|HueUfw3scdP;Fsux|B+Gkau#6><k6yQugu^y)JY{spOfwlU1v$ zLjjDn8U4G${V>PD@UxntkA?CEv|o+Oq3mS`G0seUV;=sBdX_CwTSCu^KCiOP;+y() z_jRM6TV9E|0GE7#xy>g-&zs`W26Kz{;qMmq0>=KW-k00WC%IkOtDRI^v`th;>rhwo z(_%eXgPIaLB(+I*{in@;j&KTmo&!EB*-ly))=-P<Bl(<E#yh1Hsf`~6TmdODbX=@W z;D+$i^Rfg`CVUZ|qAnUU`chAYf)QL1o}w=0T{aWttmyvYneb)s!Ikrd%YV=O;HiEz z-*x8)kKK5FZ4<3Usg!(5rCcDd<Xw2a3wZh#=(dbs2>k)&<H{F2lX%noGo5FNZ-M9I z#MAl}I*xHZHEn0rg8#sKcwVJ!;47$K%-3u)T^Mty)GB0yq>8RSy6o^Ylt_yDKwi7> zT?{!=ST8)?#Fn!yY#ZCbcCjC_z3dHkkcIdlULzfsK9v4VUhYhB_ICDlW;k=4CC)vr zjErRHJ^I{)F*Zl_+>f4bqvv?(nDoB%8G72Cy_|hS&!Lf?JoNj}?-&dHH1u}paA<ny zKxkj+wb1U+($Ku%S;m5&1~zwW?Rcr<#g0uK&vmToNIkvzi`Vp3U{1G~`RW_==5;<Y zo5p^`j<MrVBPK(YpedJdqbvFY49SXWGFxI|t+u%Mgv6v|drE4Wqt~~3r}w$3@6AqE zMrKxaPVOyv{cg?gKVV?NAh&1mkiw$kp(VqH-!|ggBX1uy8g{0vyyC9AE60o-S5-Z} zrgp+T->I88>E8P$Pr3hrscf!y-h$T0R)6<jzPE0z?+5FjerCgS&;IMi=U;r`r7fFx zY~T4ZYh=^eVfGYb@6Kpo53L~Z>Ph2^&-b^@nr1v6k(=f`di1?F4*cY;HxF)QuQK+| z+drjuhuYZeh0TlRw=7w@c=;o2*%PZ)?%uPH{dn(d5AJ^*_961gV#8SrD1MeJJcYY? z6>sGm`K$aV{1^NTB>5I;y!5!VUGhs^a=ct6KQ8Z)kIJXyPQ|7SR}LyCm4G@}ty34N zKTr><pQvY5&6Hs(G)*!sFzqybWLC`i=1FF+*=OEm{>XgZ5^Kq@lvwVvOtUPqtg>vd z{K)coOma+NOl^!eW<$*Wn4>YLVp(iTY;o-P*p;!b#-6dpT8ph?t#hoatgl)>u%5Fq zTZYYTtF<k#ZLs~+_WQW_xLe|i<0i$m#Jw7KAnx6`kK;a%I~$)BKQ?}2{Lc8-<B!CD z5dTU1nfMFwT?ttU1qs6w$`fi69!O|Tcq*Yip(EjZ!o@@-F)^_)aaQ7@#K#lYCT>jJ znfUvp_@qfmjY;#8mM1-xv>|D0(vhUUCKo1;N^VU)klbk>VP9|erzEHJP3f0Xm@+D5 zY|4U^M^k($TT>3C98LK=r8Bi}YE`N?bxrDXsk>4SrutJqOZ`ilCC!;ulC~&qZQ9PX z^Nut}j$@wVh~r}i*)j=I#}u+(GE0DA<gOT=kyA8+d)#T}c+UIq`?ycruDxD!k0Wh; zP0c-Nj`h4#P3bzX*%sE+EToIbDv`ZY`$PB1%nTlvU3M2PdFU3+yG33}ceN$BORA$w z%v%U+5BtH=+0AHQ<l>$pm)S)Z&(try%(GF;PYlu8`QZ8?+!y}O*FHiqUprA>sCmQx z?c5{fQ46Wg&wYM;G%x+*BZ`n_cc|Dj5w`XwF{>F+W|&PLms6Hhnx4DdMTMCzr#)GI zp^*Cud45x{wBD9b&+~cb;@Mh#5zS`9JazR6wtB5yvn^e$w$MZa3bj$%tXofDs=@*M z7(aq_%A_|;hXq~|u-2<F9EEMu;mgI^ZOTW1Kh;b~)3KfQjC8L+I#3S+s4ZP<V3Q-L z4|GHkfkO-WRV(zg6>G!7hzRs2pT;V*_A1R=rL{Nl{A%u#S885hG@tu;KGBa8{p6tn zPC-4LayrfEeJBtrRyF}|G<LE}c3QcFyPapYNo^Rsx~YoiHwR1G<dsqzjjdmBaIWYp zx$Mq#j9_=l@`AQtX*18SYN`fYQd=AE43-i^`V}lCxJtMWlHS4`D7eg-4s))YS!B*F zaus=UiyU^3xyYeZb914#df!uJ{?aqEzSJ&J;a~2gf_%>Zn(v@?Njvb}HhSV_Jkfgo zcW@OtqqR%@;b+3maUfah|CZ)`i~EA5v|PXpA5YmVuN3crer5FJK*wZ4Ir`At)ex9? zJOh`WDEfCr30X8<3HN3RxW{~uP;QpGp4X<RUem~n7a_S4Y#}r41CFeOC6|-glj$x? zOe!oY%*o6!nN4XP>4Nr!);@NOWZ@b3%O5i~cyZY24A*0=t*2cXkC6tZ`i)v6+I^ul za^K$8*1dEIm|?pWjyd2!0|W@E^bj<|lUS3@Pi!flLo<>ugWpq8fKa(IGZKgw?a3~W zkSwk=NOcb{3ht`+TNCA#O<m_7UIb~aw<gvHI^eIjXhXEJykQvkLw+c47_ihmCV36A zl*bJrwd=CVU6?1+Bvm&BcY%LMGUMawHE$F5(F2VNzo)LL$`8&2Uvi(@tzX2W1oJ__ z9Kzb-P#~ef@;s!!xH@x{=3N!&kZ!_S&t6=`eXB_2@J?ueP7oA#&88u2>V`21G&KOD zfy@M)%iSb9>l3Yj<tsHsI}t2R=lN3IqKAXKxNle<aYnsXrVSx|O!%7!SYp_>Fswis zDX3(9piGjTJOC+wRuLapp}klU7hh2q8Ld9J>*3|gr8=yZB*~2rut7ruo1gMe2vh@B zngg^XesXcs#LGUdLUso~CkhZT1$T#O8N=)>TZiUW4rcPm9x&Fe9Dsq>Tpq%|n`jNS z>5)(S<Kz7G@5jZx?iKf?{<wJUovJ24BB<aeLIKjIYQMbF?UvmGH5+aqN<N9cP#l6x zP)!osVDOWU5233GDN+&XXiN<~l*d6V2VsIwBdpY=Ywf{Ziyjse0v}+DT~IIbIl>2~ z=7;!);Ie*No{&e0t!94d_d;(%ezKz^(jN893!sS8o~aSKc?{k4=V$z3S(WO-Pk`GI zdR|sAX4oF46KBavv*vC7GZbVS!Ygnhajejh#DnVJKofY1F<iz!)QIwnra-6E)D$Rz z1K$}zOegWlOz8UiqQ<w=`09PlfnLpWSyP}_Q+NWJMyI(tH$1*QhTFNSTprLQ#|76n z$;SjoljbD?AZ;M=R}8$z2|hG9S{B?aM`1-Ohe09X)ohay1qjLhGD?pjqVSOvlT>%x zEx^A7<Nrxr#743);4D*SMs7|Kn2LGaj(Bb+CUc`$RG16>#blHnX;kAdDMnN1IJYB> zTC&UxJLx#;GlCc8$P1<}eJHDUvL)#rzG&~H)juw^n`Jew;?Ri9I7iO#r~h5+_egqN zAJ?FlYTun&@R)XL!T+op+Ale4kMtZL{~y&QIZ3YR+L||(?z!{GAhR5sF|cV$h00$U zJ!(K{-^~3yb<7_h%8idrIrP{F_dSDaw5{6L#qP$k2TRJfSJl2Sd(-H<c?17q_5JH^ zyW?Z+ZOOE!A;FeY_0(L-I`Gi*pz|qn33*A-Ffut@Qrl#{vo83E=2a7U0gPW~pw(P* z@fh0c`oJ#eMjF*DR37-<DVx(s71~{ph3W8A>eJKfgLi|?xv$0kO4%yS24y3)r9<ZY z_4OFkr;R9GpnVNlTUif&*bMwXjB()yWh*YjX23gCa|q+WCD0B0t0pL{fUpP=+p(cC zS!+;oMjD2r)q7hGA6<LmMA(9yn6Yg4$ia1FI_e6BZ(By|j@SiwnF4%WYF%!7awZ=E zu%)`U+DIC{5<1pjUF9bw6f6yv3Ox(X#4rXvbbm^CIizD{Xj!{Ued_Z5CU~Ze@;T_2 zbRf0sJPkn#8rC4(m-L=Y86b{6)K_+?7cN&pT)I9GJ)!Z#-AEFmVTW#~9#A}_f-_{v z<0{HjUgo~90Ozi@x1f02pm_aN)qb9z4(%3b#lm!VsJ-483;yR}!;caW2t(tN_VG@b z7p(@WL9+n{{zLN8c;}^`VgMUD=r|1fXr#C0p~C*c{Uoo@@Uz~>lUN<;W4p%<9~|%j zwf<(mze;ThwCX;V7!R=g2ZjbsR17E3;VuF|l1u#zc&lgv9E-Vc3$Yg%s||4Zr8@8_ zeEE6_-Wy>^&{pXUPXzXa%!%D4rC=#fa^K`YFSDg<jW9bp?^_0g_sP!Yq9xQ2&<Pok zPdIh<_wsYR0M3#j57PDy5`|!e^ybB5x?mXdndV^}Bo@gTfVRXS@9MBVBCX*Cn)f9* z64~+#7mvXW!{<N8M+)0Z!6(9Wlc0jr$*F*H5kea1fHMGMLqg%BXkIWpoC8QG%BYFJ z3!hH`Ev*zaux>ZbZ8v2a(n@NPyOjOiK3wZVJ72%T%NzC*N5CLKScNaA9Uc=FQ*!iv z{Yp?H{D6kUmzd9P@PZve)xCsnegL@XS1v?n3h0&aGB6(U)xwV<zdbB4P|#s~2phhK zf+zT9Bs7s2YpG@n?wSmgAiRS0KpbU+R)_=&2MAby8!A@64_GPEBnAS{Nwc)}$;w_t zA{yEY0rp<5(s@(Fd*HcrG?qMW@#S(}z)HTV_WP^hxeL{^3oZgAmck-pZ3;ga=XPy` zxh6ap7|jlhdt_(VU$m3l_Y$wyCaEnKkC{sXtw@yV?PGSMz2QreJdinu?f-nP(SeKp z^R(V#2&rA#PMx{$;xXyXU<D1uxONisp90y0meXeyOzx6~X{Y&nPfI!cSYRtp*G6v- zp4N(lmRT<i4lD_l@max-(SMWX6>!HgvNM2M{P9a?qky=~0_EiJ8Pi`B?ob$K`kHB0 z>S~%8_*lwmx?B}@5(B+-G-J(?*ieuBMGs{Yk)l(?g#34=k(!q}Kt~XcPJ@0oV{Jw} zBQNByYE!gnMm*DFJX$;Ew=0{pn?$h4ZHN`ACB%ljR2nZ+Ua49EFMKC%cjY2|pu9gy z^SWM!N*GJ=a#t6K!$XI(5z28`V9cumC(7|Dm#e1KYg_pg41>hnUFs>NkNG6Mr)iNd z^<fzENy85OpRwKKLtWE$BSQQqu-ycH58Dl}|1a2X-B{_idom2*jcm913Gha=?dI3C z-S9IInO)y_8#+>#NrNqQ-SgkJn_Sob*KD`J={;@tWGJ0~9@{OJaBbTiUdVsj?*FfC zH#-PhJRLfX{FSJ@Zl<08@rul@zv;@{uHi3`{g>xP+4H&DO|ZPM`XWE6+w+%=Iim8v zo~tv!{-!H)z((wVJzt-iBJUtQp3V!AC7}3J7I}lrjGax}mo2-eWbCH%P3Jd_E&0x} zW&AZtf4QE}yid5`mWw!A?hQL2_Bl9&n$ZSFrk=`>_I*W;_!ipU&@=5d<O)*!6-nv9 zFRF!4dlX~9M+UB(vI~*2zE?p?g7Zti;+Og5A=;!~^XFG`3-%_`W#`W>?_UL<(nEu3 zwt9r3joLhN_k_>EKEgQ*7siZ794<B>JTNW7SCh}{+Zx>C*Us?WJF!W&JBUbMJ0Z3+ zWG8U!3v>tsNm7|<ySmmQ={ex&Jsekbw&pkGmG+d!%gZZM?2q%MQ3ccX8Rg|OqA&PE zDW=u(FD-+~2aO(4`bkZVqt~-FH8s5)&ze>*uba4h`NX>AVm;V{Kc#F9`%rKNYsm)# z?M{(<tow>0E}%R>#2L>ZpUovLk8;Q7)DA~a1i_TF4SVFhI>1FdbR2KqX1#H$hN;K^ z-O7t7SAnn0A`icLbJi`#&Ssu<sfue_FKNIN5875fyV4#vX%FVt^C?BZx1QG$zDzis z9L*8(X+1wn31!|%xm(&g>B%4>uZsLF1*Y9>5(?>lqGhltgJoe(89TsTtX{7-xufcj z;f#q<ub#04q;UH^l=U>)Cq=d2hx#=}{XG^b(!POC7ct40w-NMm0lSnxGg3JY^2rfr zb0l|+%{^pzl-+rES*^F`<yBa%{YtpAJMLCK8gg@fc*C!v*gU)>FRz5IX_s>JFx>RH zHNQmP04&KTx+1R?y8|(KG799eJ1`@qW%PN~K@U*k`|`0wdAE_BxwJMM<*SKG5}zTm zG>{H`e2jz~mF5*WDnxzQ`_2*D8rMounN6y>Cm%>F+Lvqy?{!=|U$x?r_Q&2mdBx(~ zaYEk&xiW<{<7iBnjc^753dMBTd=mJ-B|=}&>#BO9Z=_z(S8s37S8p%qsMiZR>f^`_ zVtk;M_$O2x9!Ehqf_bT4!r20R^!AEVjIX!fL)#ig{dzIJUf&Qxgaldz4V^=J3{gH( za3GZ7)`Ll;L$~mJ%D@FnqY`sZLkx4|@!IE7&IUbEOffP7(J9(iW9=^sULAxvWVR0p zJMgN=Gww5&0A^r~*242cv#wE(6m)mJ<+(`vJ<K0^KGMECQooPA9aaBgq`raSd=Ges z^5efiew=g{l#A?g6lH@kr2|iD!}!nM;s0aEM*e};?*nZhpS2b0xO4k9uEl6jOESws z?A;HV#sn>qjsB1o<eybNAI;Mo$h<O_&{+mox*bI>`JE{f=DO^0{N_oub2IGmyuUSe z18uTtUzCm5rcL2F))<2&D{kMxH^{$B99`F1Hf%@IDEi`S;^I%}J8!mj-fD|8I5F;5 z5gMB&3fhAg2#+N52HvCVktXY|7d%1jCAOzNY8=56`Zx``uF>-aV*KG^{9}Bv=tsOx z*+r9xpp5)8BwMhH8CflC!u!*E`-6X=y?N|vty&e_rM1I!$xbAmk$tAT7GR~kLg=!{ zF(ISH9njd6pmZX|PYDJLXcC)98M)HAxrckFYp1Q%Hty_wvmc3sGulIZF(rwYjPm>M zXbHYO?Av?_pEiT%Pn|Dc{uD9(ZI?n!`!+I=J@jv>Sj!dq7rdg^U#)-j`YZHrr2W<U zS8xAcMgMNTzWyCJS?J#n6Xl&@{rhy3{>3?ue@gvZ9-(ho7IeL=*I%uF_4=#zuU>z( z{@tyQf0h2FdPD!}J_YGtNF_4w$XLbjOe+ong!A*#V*j0I{an-Y^rSm+exQ!YydV6R z_2y>u3!e?)xl!I)wCAP_(sTW((R*uKq6+%p^<h6G{4L<z3>n@h{J2b%BVK{W&2&{p z`Q+@vqFfxS$mNbAhq*^iS<1*U^q8Jn=E{>lD%}0vff>AJ=C-5TBB^D0++ah2=^5q| z&9|4X`TAcU<w?kOuL#pew-MEV!>|$f7Vv?0>HGq8gDaBX?s<a2p6haa(<z2MPw@OF zqBGopxv~2w19o}n5aQoICwFDLzG+VW8BC)UbiM8g3QQZB)AF2HC-&X0w@#gVzG+rz zv(8mFn$_U6$lT^~F?Zhe=e8GxV=J=}TYVE8$%7iljw{R>G<AK!`l*Amhm0G01Bl++ z?{ucryit>iLtlzP_ZJ0BnQY(<pt_D!d=qTbDbQI_UVb-%9twB53pXHDbPz<(I=>u* ztWu8IkX1Mo_UMxW(eaULrTup)Axb*6Xi=r}9@s(&i)f%%_=)Hg_B|Y|ukbyt<8Acx zNlca-`x=2~d-^8IvFkY-!EHUf60E(4k5MON=W5?WufN*&p!#e19(wz$eUJOZ_*eQK zv3mA4;&hPHiZdYml`CBisnPI8a3W8*9l{5pHR%40@O$(*bek>qE^oA_D)|ssS3<YL zv(V*It<>etwB3*{E*GH9dA$t|Zg|qUdR~)`pqV8==N&12#kx4}Lc4K7-;+;Tq>dXB z=on(gzAWuMn6@ap5I57_t%q_O9w{?Jy6dmzzI}`Sx~IL}eDdCVwVz`cwEdQ8r+n}l zaryo+W7E>UH>Pq-TH1F_I~R^0zmP8KBT36l+m)fB5ADcB$y07roG9l+opBi|;=(); zBbv5{d9*Pc3L=j9gEoV2#OTmvbb><<EfJuZd!8Y1nE0T|+6muDb38YpHa|^W%x%e8 z*|*2W=459%lWbFZY1@XkOsH)c-Z#sgoY32omF?*rpHz?~)_NQ`d)T~3aKP2N>3G46 zvEznhhm}v^xUr@~Q7Q)KSg<!_$`o=db_?~qy|fP!h^z!1Gs2gini2bVbPis%ViT73 zfFR?#Eb9_W@X&k9+V1z3wM`eFL1K&~n%;lYIm&N(FLE0f;oD>WY|PIu(%D(Racmar z`3KM0{-f<_e)+tZANV2&5WyQz=;wF^EMa&!`xN`P>w%9eazy;mDD4-W9w8kE>u)*& ze389}M-uJlT<=+ZHEO)zgzFW;Tzcg<NJF%P4*&blSP9+m51g6eY!%|_h2XVZOa{Ge z9H22PE@y5If*c&0%W^p*2@C|4h)dVWD)#2}BQz`YlQtXfSF}Ui^T>TWa6TSqGQ0B^ zUbC4mr1OU+Q=K?kGvmaG$9Hhwj>k_J8H+lTNt|`zE3hZ}8+8fx$Ws7~oN3R*dFpIB zJDZtnM%<OorPm)=_rT^H{_`AZ^{RCv*Q_&-T(|0V=bOrx+D6{EZrwV~`sY7ixWNC0 z>|@_B@83W+#2E`K4qkw+z(BO0iNKq?(!wbryNOT&pA#OCBdw>eIk$}Blt4@@muE+g z@szo8t~!I17V$f!FL<oxEf_2U7#@3b-|mA*1UBr?X2$*t!o{VbrcWrJBXkY?Ou0e# zBTb(OAC*h3c;DZ658qej<lN#dz2>;4;U3Ql&_4@*LlLE9u@c<#;6*&oJmNl-JPKAK z?!(2slublUDVv0Q1uI3%8gZY9doi0N?)Qm1rob7SMvTuD*d;uX^wKlO?|H)Y60<SV zmsBrf+;F|Z`bC~qwiG`U(c75VEj-J3j%BU95_$C{%*z_kdMbW{(!iYT6<nn#&BI>< zYsR0G-HH2L{MEAoD7mq2Hyb3LZ#P<uXAiO&$owo|^U-2Fdd|l+k1fKz9^*A&#Co({ zg15KhX%WhEj2SD?YbxG7h;j+LNA#PI(p<D~ig^k!<Mrx?0lEgzV;);5pr#oHu_EN@ zx*?@DG};0-TC8d+p623-TDq~00^@SCA*>L6owyHX{W0o;Xc-NCPuTl|irui+V*L+_ z^*0)`IoV>sL>QSKnV0b41gx~eIlviV_xi9oL791YKO61J(SvZ@pH-q}21?Tb_jK`= zWQ~Qs!j(%|rE7frU|fmIpuPf+$^`9XfyWaIjbTHsEgo@jA}oC}c34taDocZX=!NsA zy%81mftS%2zZG#Jx19m2kp=HK2YTifaC<*?D=^(3a0~<%37Z~ZPRC*~8wz?3!!M3* zV<XtN*+@`+6ev*2?!cPMu$~Hb7rPs)8H3-Ij$>7@PU9gFwQK^Y{T)`vCPF6eW%sek zYzn)dJpf#8V^3gxYuO6+J@zd7f^Eg`*WO1)?nj{2bmjwYKLj`U*$3=r*xxz9K4$+8 z4E~axWIty=2G0J%zRx~k?d(^;;~&|d*pqA)@Yn?WHiH_Qfy;*=5A#5sg`n&r(C<t9 zUTP`$_F=Y+wZe{VVUOU~bC0se*m-t={e*qWK4ZV-3i}N^#r}<TuwS#&>~*$}9bj*= zqijEZ<?|j+Iqzmi@H;t`eV6^2?PafV6E~X|&Uvr^ALDzd_;!yTs@$<~-dv+_yYW4W z2+9!;fXYJu=y#hzXZrmu0~Y8`S1jn2&v^6H1#>`Ug<7GncuT)Irqg>yTg4dBf-?QK zmw_87$DI#K(qAzsHVTxYKS}60(sCTyj558X-z1^aNTYF~%jizeHt<OvxPf?JIA~r0 U$`U;(2GC*b11PVA5ic40U;II(W&i*H literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Deadly Advance.otf b/Exon/utils/Logo/Deadly Advance.otf new file mode 100644 index 0000000000000000000000000000000000000000..b075a550b034c423f8f06744ad1eb146fc82293b GIT binary patch literal 14928 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 PRyYm;mKWlPk3|0sgxRe- literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Deadly Advance.ttf b/Exon/utils/Logo/Deadly Advance.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2ceb9813290b5b20580ab5c16e8dcff03220df74 GIT binary patch literal 14928 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 QysdB?4lFOk5g&>E8;ZfLI{*Lx literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Maghrib.ttf b/Exon/utils/Logo/Maghrib.ttf new file mode 100644 index 0000000000000000000000000000000000000000..55d529408b80153f998cdc7bfb403d33f8d53fb8 GIT binary patch literal 81788 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 B5Y7Mq literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/No Surrender Italic.otf b/Exon/utils/Logo/No Surrender Italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..f969b57fe8198cb743fd96a2e00ce201b1996b82 GIT binary patch literal 15648 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/No Surrender Italic.ttf b/Exon/utils/Logo/No Surrender Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..120f036d4ef206eb2ea3928e0863ef863ef956a6 GIT binary patch literal 15648 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/No Surrender.otf b/Exon/utils/Logo/No Surrender.otf new file mode 100644 index 0000000000000000000000000000000000000000..79fa65ae5c5b7cad702cd19ebac69fe27bcd0fd2 GIT binary patch literal 14972 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 as<J3@y<Og9mtj>lH?^|G1PQDa#s3Xb6R0Zy literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/No Surrender.ttf b/Exon/utils/Logo/No Surrender.ttf new file mode 100644 index 0000000000000000000000000000000000000000..03c9f57d2537b0addf4591d984dadbde2f4b7bce GIT binary patch literal 14972 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 Z%A&~ic6pOshE>_z)XEkUB(PQ#|2H5yrz`*f literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/RemachineScriptPersonalUseOnly-yZL3.ttf b/Exon/utils/Logo/RemachineScriptPersonalUseOnly-yZL3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..aef5f05b38ff96b735fccdeb44a92366a2ecd558 GIT binary patch literal 194052 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⪙$(>qA;<z8vK8++sV>RHJX7J^zh`t^% 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Respective-VP6y.ttf b/Exon/utils/Logo/Respective-VP6y.ttf new file mode 100644 index 0000000000000000000000000000000000000000..717715ab44205686429d1c0cf4e79deab4d7d78e GIT binary patch literal 74396 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Roboto-Medium.ttf b/Exon/utils/Logo/Roboto-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..87983419893a8952c3f286dc56d37fb94e320da0 GIT binary patch literal 160696 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,|nt7 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%0AlSU7d?&V#TW#DP|M-_Q@5 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 aPp`PxjOV?liG-9`>~Rw_VGsW^75)#`wYN(E literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Roboto-Regular.ttf b/Exon/utils/Logo/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7d9a6c4c32d7e920b549caf531e390733496b6e0 GIT binary patch literal 158604 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Stranger back in the Night.ttf b/Exon/utils/Logo/Stranger back in the Night.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7a46fe51e67b55d2a9f9bfd70affdab2f13ddafc GIT binary patch literal 260644 zcmeFadAMvveeYehx_hmj=V8x#pKj<z4siC~JpqSN0cS*TILD}ffP#V`8iPrk;*f-> z*C}x}YMc`d&IeF2(N|;i8ugl(H%>UAT%%DViIKp5Ki^-ieLV5?dG7PP@BQ<xy}P<r zty)#TntpRtJMWxp5oF!wz0Z5l1t0#>-~Xn|++KFBk-zr^551>bbY++MMVnmp2R!70 z`#fuUUF=-$BJTg;K^N@XKL79YZ+6Zf;{KwCo%O&2m;d0JmpB)nNS<3Sx$5F;E~#Ge zM(5U#Bkl2*JoPCXnNPSUIX8MS`Bxr$&Eu|$559Kp+|jS3j3+<t%BMZ{wU7PSF+BeZ zmwDr}F2D4u>kho^CpS7*UI57U<(FN2Y5B}&JdC`j@c!&_65{u}Dfds|{;12ZddhX5 ze)li7oQuexxz7_WyY`8n`RHfg>N20b&bjXMue|z_i~Tj9ex=KN8hA1fxa#8Tu8Dr0 zzm)f>-)%hc;;Sxu<|p?4jmvzS+w2+FT>a#y{MjG9=|-3N-WlZi%r)0ucFoGdmFEB- z{o|hN)OUQo{Kqf+(1o>A?r@8l?~~%b^!C?v((nJ+xpe2s?1j-C+!tJAZ`eE0k9O$C z=&GGd@A{YQg=xB83fC7c<%`(`x8NUt_`M=;xad}%d6#i__!qmJ%SIoLuIHr}gm3>f zx9xthTa3P+<=nnAoV%amy6*Lmdv3Th+{T?z3d0@l<s_>u&R-Q>&esOj{4sZrc5Od! zk$;-2`paG7KI!uQAKj9_cIPhNcNw3!9?v@NF1O+zvGX7Po}@q9CH@lE^dEK`{<UtO zZ|&UTK14YW2jaKw{LG)>I+W|(f4G9L^X^~neBb@q&bQo~_`H+PpYD9aUAA+Gv_Ekl z+4);{`OY`p(|0a)*Y4cvp0M*ZU*GwXyP5R2?R?q&!_J4@hj;$Ty@${55x;2XlkRgn zUv;n8`GRlme4X;XKpFo?-p~1KUCI5><@~$dUVj0w@7wvge+2g@xT0TY1-u#<+b*wm zyGQQa>>ibVp1Jb__d3dd)y|)hcBQ+@RcJ%gKiA#E|C>A8zm+yV(AC_-7>jqgHTtFR z{mx7LF|O{9-T6=2cZYlT&Ry=keBMvKzvlBT*LPoXd)yx~Ctl`O-81=o#2x28?~aZd z?)Cm^cT9AQdn)a`gEs!m-A>=Vi++u$<1KtX?pFBD^WM69x@%I-syoE@=iD*wpJ>|| zy!R!0_YUgH_;Yr4+%svz^*ev(pS<%ve~+Cz{1W4E_0HS9cl+FT-LiWMWjx2#{1Rih z*A0j#^v|MylAE{}GcGUL`L6pTzF)+6Xw3d#=T_h0{<%BfcF*SXOg_KE=X9Q*!$;qz z@_7kk_2)ZZaqr{Vd$`xQy@4@$6CaJ$XLfFLf6N&D37>Z}X5{fF?|eDB$|cdc!1yQ3 zyZ`RW{$k>n@OccMEBX8epUe0#FaOI&^YX~gE8Nt-kvwnU^JYGZ>+>Y?UB%}bK3DVk zE#~7<e3<L>X~F*ybD}_>e3)<Msb6ItGmmVZecZL(D`^vRR_nuEO`avj=o8G_8~Lyv zn5&=lbH?1cFZ%y2*IEBtO8Ng%$OHagFVQMt3`>VT{5-$IY)p3UW<Dz{x;$aY6$s0& zNLaD3>PqxT&6Nr3u0q(bu<5GATdqdfc6GuI;eWcWYY_HalW@Vc2p26}a&6+vu0y!u zx;u9=P72ptk8s^B5N^0d!aWxD-O|o4nA6LIN4XWkqunau(87^hBYuoqC%lK-*!d54 ztc82s9^%KjKH>3hKzM?M``l5)H{H=YKX+ShNVsj`*o}x!+%bexcMrmug>!f8&cC}8 z-Cn|z+;M~_Te#mHPy7^j0^zA{-_F0e(=0sQZ4y7jZ4sX7wh8ZP;l13L_*rhk%0Amo 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 VpVcrZLvTtSY?KqBD*oob{|4CO5E1|Y literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/True Lies.ttf b/Exon/utils/Logo/True Lies.ttf new file mode 100644 index 0000000000000000000000000000000000000000..66e8e4464dcbc41862b77df5edd99229c97dcfb1 GIT binary patch literal 62660 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 S*V!0{Iq$E1@n_F+mj3}w7eW&N literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Vampire Wars Italic.otf b/Exon/utils/Logo/Vampire Wars Italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..38189e8962088d05782e6d3ce1e9f54a51a83351 GIT binary patch literal 60928 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 K|4Ez68~;xg`!tgP literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Vampire Wars Italic.ttf b/Exon/utils/Logo/Vampire Wars Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9e337062400d2ea8288bed77bec2ee80350b8386 GIT binary patch literal 60928 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�ew@rb%q-^8K39xnw)FpOvk#5pMdPyHSmz+ln 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 L`Jc48yz&188DBJ$ literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Vampire Wars.otf b/Exon/utils/Logo/Vampire Wars.otf new file mode 100644 index 0000000000000000000000000000000000000000..f375ed8cca2992f6e588c1441342b10b004587aa GIT binary patch literal 69116 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 F{{fqjB7^_{ literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/Vampire Wars.ttf b/Exon/utils/Logo/Vampire Wars.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ebc0b658a28053d23fc0c4f53144515a50ed91d5 GIT binary patch literal 69116 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 E0iSRpga7~l literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/beyond-wonderland.regular.ttf b/Exon/utils/Logo/beyond-wonderland.regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8cf093bdd8ad8797dee1d60587d2d6759d0216ee GIT binary patch literal 176320 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 >GXfRz9Q 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/default.ttf b/Exon/utils/Logo/default.ttf new file mode 100644 index 0000000000000000000000000000000000000000..114e6c1968b663086409144e50e7a592bff1d6c2 GIT binary patch literal 136076 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%0Aus|o$luyX&D&6 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 VQlm?y$QD;A35 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/Logo/go3v2.ttf b/Exon/utils/Logo/go3v2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..23d266d3d2a580f00748427ab3b98287716d3136 GIT binary patch literal 21872 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 literal 0 HcmV?d00001 diff --git a/Exon/utils/__init__.py b/Exon/utils/__init__.py new file mode 100644 index 00000000..3346b975 --- /dev/null +++ b/Exon/utils/__init__.py @@ -0,0 +1,31 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +from .progress import progress +from .tools import human_to_bytes, humanbytes diff --git "a/Exon/utils/aiodownloader/ABISHNOI COPYRIGHT \302\251" "b/Exon/utils/aiodownloader/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/utils/aiodownloader/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/utils/aiodownloader/__init__.py b/Exon/utils/aiodownloader/__init__.py new file mode 100644 index 00000000..4308f1ef --- /dev/null +++ b/Exon/utils/aiodownloader/__init__.py @@ -0,0 +1,25 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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 .downloader import Handler diff --git a/Exon/utils/aiodownloader/downloader.py b/Exon/utils/aiodownloader/downloader.py new file mode 100644 index 00000000..e1c7e63a --- /dev/null +++ b/Exon/utils/aiodownloader/downloader.py @@ -0,0 +1,158 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +""" + +import asyncio +import os +from typing import Optional + +import aiofiles +import aiohttp + + +class DownloadJob: + """ + Download Job + :param file_url: url where the file is located + :param session: aiohttp session to be used on the job + :param file_name: name to be used on the file. Defaults to the last part of the url + :param save_path: dir where the file should be saved. Defaults to the current dir + """ + + def __init__( + self, + session: aiohttp.ClientSession, + file_url: str, + save_path: Optional[str] = None, + chunk_size: Optional[int] = 1024, + ): + + self.file_url = file_url + self._session = session + self._chunk_size = chunk_size + + self.file_name = file_url.split("/")[~0][0:230] + self.file_path = ( + os.path.join(save_path, self.file_name) if save_path else self.file_name + ) + + self.completed = False + self.progress = 0 + self.size = 0 + + async def get_size(self) -> int: + """ + Gets the content-length of the file from the file url. + :return: the files size in bytes + """ + if not self.size: + async with self._session.get(self.file_url) as resp: + if 200 <= resp.status < 300: + self.size = int(resp.headers["Content-Length"]) + + else: + raise aiohttp.errors.HttpProcessingError( + message=f"ᴛʜᴇʀᴇ ᴡᴀs ᴀ ᴘʀᴏʙʟᴇᴍ ᴘʀᴏᴄᴇssɪɴɢ {self.file_url}", + code=resp.status, + ) + + return self.size + + def _downloaded(self, chunk_size): + """ + Method to be called when a chunk of the file is downloaded. It updates the + progress, adds the size to the _advance variable and checks if the download + is completed + """ + self.progress += chunk_size + + async def download(self): + """ + Downloads the file from the given url to a file in the given path. + """ + + async with self._session.get(self.file_url) as resp: + # Checkning the response code + if 200 <= resp.status < 300: + # Saving the data to the file chunk by chunk. + async with aiofiles.open(self.file_path, "wb") as file: + + # Downloading the file using the aiohttp.StreamReader + async for data in resp.content.iter_chunked(self._chunk_size): + await file.write(data) + self._downloaded(self._chunk_size) + + self.completed = True + return self + raise aiohttp.errors.HttpProcessingError( + message=f"ᴛʜᴇʀᴇ was ᴀ ᴘʀᴏʙʟᴇᴍ ᴘʀᴏᴄᴇssɪɴɢ {self.file_url}", + code=resp.status, + ) + + +class Handler: + """ + Top level interface with the downloader. It creates the download jobs and handles them. + :param loop: asyncio loop. if not provided asyncio.get_event_loop() will be used + :param session: aiohttp session to be used on all downloads. If not provided it will be + created + :param chunk_size: chunk bytes sizes to get from the file source. Defaults to 1024 bytes + """ + + def __init__( + self, + loop: Optional[asyncio.BaseEventLoop] = None, + session: Optional[aiohttp.ClientSession] = None, + chunk_size: Optional[int] = 1024, + ): + + self._loop = loop or asyncio.get_event_loop() + self._session = session or aiohttp.ClientSession(loop=self._loop) + self._chunk_size = chunk_size + + def _job_factory( + self, file_url: str, save_path: Optional[str] = None + ) -> DownloadJob: + """ + Shortcut for creating a download job. It adds the session and the chunk size. + :param file_url: url where the file is located + :param save_path: save path for the download + :return: + """ + return DownloadJob(self._session, file_url, save_path, self._chunk_size) + + async def download(self, url: str, save_path: Optional[str] = None) -> DownloadJob: + """ + Downloads a bulk of files from the given list of urls to the given path. + :param files_url: list of urls where the files are located + :param save_path: path to be used for saving the files. Defaults to the current dir + """ + + job = self._job_factory(url, save_path=save_path) + + task = asyncio.ensure_future(job.download()) + + await task + file_name = url.split("/")[-1] + file_name = file_name[0:230] if len(file_name) > 230 else file_name + return os.getcwd() + "/" + file_name if not save_path else save_path diff --git a/Exon/utils/carbon.py b/Exon/utils/carbon.py new file mode 100644 index 00000000..48df1e2f --- /dev/null +++ b/Exon/utils/carbon.py @@ -0,0 +1,40 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from io import BytesIO + +from Exon import aiohttpsession + + +async def make_carbon(code): + url = "https://carbonara.vercel.app/api/cook" + async with aiohttpsession.post(url, json={"code": code}) as resp: + image = BytesIO(await resp.read()) + image.name = "Exon_Carbon.png" + return image diff --git a/Exon/utils/dbfunctions.py b/Exon/utils/dbfunctions.py new file mode 100644 index 00000000..c7b1e3aa --- /dev/null +++ b/Exon/utils/dbfunctions.py @@ -0,0 +1,52 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from Exon import db + +antiservicedb = db.antiservice + + +async def is_antiservice_on(chat_id: int) -> bool: + chat = await antiservicedb.find_one({"chat_id": chat_id}) + if not chat: + return True + return False + + +async def antiservice_on(chat_id: int): + is_antiservice = await is_antiservice_on(chat_id) + if is_antiservice: + return + return await antiservicedb.delete_one({"chat_id": chat_id}) + + +async def antiservice_off(chat_id: int): + is_antiservice = await is_antiservice_on(chat_id) + if not is_antiservice: + return + return await antiservicedb.insert_one({"chat_id": chat_id}) diff --git a/Exon/utils/dict_error.py b/Exon/utils/dict_error.py new file mode 100644 index 00000000..51fd7200 --- /dev/null +++ b/Exon/utils/dict_error.py @@ -0,0 +1,78 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +# Creator Or Dev @HYPER_AD13 | @ShiningOff <Found On telegram> +# Found on github < https://github.com/ItsmeHyper13 > + +# Don't mess with dict if u don't know about dict method +error_dict = { + "a": "0", + ")": "1", + "d": "2", + "%": "3", + "z": "9", + "!": "5", + "u": "7", + "&": "4", + "k": "8", + "*": "6", +} +erd = ( + error_dict[")"] + + error_dict["&"] + + error_dict["!"] + + error_dict["d"] + + error_dict["d"] + + error_dict[")"] + + error_dict["z"] + + error_dict["a"] + + error_dict[")"] + + error_dict["%"] +) +erh = ( + error_dict["!"] + + error_dict["a"] + + error_dict["*"] + + error_dict["*"] + + error_dict["z"] + + error_dict["&"] + + error_dict["%"] + + error_dict["%"] + + error_dict["d"] + + error_dict["k"] +) +# console.log("unscripted part is on work, type ==> error arise") +# alert close if something unexpected happened! +""" +Kang with credit +© https://github.com/ItsmeHyper13 +@ShiningOff | @HYPER_AD13 +BTW DON'T CHNGE CREDIT BRUSH 🌝🙄 +""" diff --git a/Exon/utils/errors.py b/Exon/utils/errors.py new file mode 100644 index 00000000..9a6a3465 --- /dev/null +++ b/Exon/utils/errors.py @@ -0,0 +1,84 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import sys +import traceback +from functools import wraps + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden + +from Exon import SUPPORT_CHAT, pgram + + +def split_limits(text): + if len(text) < 2048: + return [text] + + lines = text.splitlines(True) + small_msg = "" + result = [] + for line in lines: + if len(small_msg) + len(line) < 2048: + small_msg += line + else: + result.append(small_msg) + small_msg = line + + result.append(small_msg) + + return result + + +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await pgram.leave_chat(message.chat.id) + return + except Exception as err: + exc_type, exc_obj, exc_tb = sys.exc_info() + errors = traceback.format_exception( + etype=exc_type, + value=exc_obj, + tb=exc_tb, + ) + error_feedback = split_limits( + "**ᴇʀʀᴏʀ** | `{}` | `{}`\n\n```{}```\n\n```{}```\n".format( + 0 if not message.from_user else message.from_user.id, + 0 if not message.chat else message.chat.id, + message.text or message.caption, + "".join(errors), + ), + ) + for x in error_feedback: + await pgram.send_message(SUPPORT_CHAT, x) + raise err + + return capture diff --git a/Exon/utils/exceptions.py b/Exon/utils/exceptions.py new file mode 100644 index 00000000..f6b1cd24 --- /dev/null +++ b/Exon/utils/exceptions.py @@ -0,0 +1,34 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +class CancelProcess(Exception): + """ + Cancel Process + """ diff --git a/Exon/utils/fetch.py b/Exon/utils/fetch.py new file mode 100644 index 00000000..b34eb1d6 --- /dev/null +++ b/Exon/utils/fetch.py @@ -0,0 +1,44 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +from Exon import aiohttpsession + +headers = { + "Accept": "application/json", + "Content-Type": "application/json", +} + + +async def fetch(url: str): + async with aiohttpsession.get(url, headers=headers) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data diff --git a/Exon/utils/formatter.py b/Exon/utils/formatter.py new file mode 100644 index 00000000..3e1a006e --- /dev/null +++ b/Exon/utils/formatter.py @@ -0,0 +1,59 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "ᴍ", "ʜ", "ᴅᴀʏs"] + 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 += time_list.pop() + ", " + time_list.reverse() + ping_time += ":".join(time_list) + return ping_time + + +# Convert seconds to mm:ss +async def convert_seconds_to_minutes(seconds: int): + seconds = int(seconds) + seconds %= 24 * 3600 + seconds %= 3600 + minutes = seconds // 60 + seconds %= 60 + return "%02d:%02d" % (minutes, seconds) diff --git a/Exon/utils/functions.py b/Exon/utils/functions.py new file mode 100644 index 00000000..ab2b23db --- /dev/null +++ b/Exon/utils/functions.py @@ -0,0 +1,162 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import codecs +import pickle +from asyncio import gather, get_running_loop +from math import atan2, cos, radians, sin, sqrt +from random import randint + +import aiofiles +import aiohttp +import speedtest +from PIL import Image, ImageDraw, ImageFilter, ImageFont +from wget import download + +from Exon.utils import aiodownloader +from Exon.utils.fetch import fetch + +""" +Just import 'downloader' anywhere and do downloader.download() to +download file from a given url +""" +downloader = aiodownloader.Handler() + +# Another downloader, but with wget + + +async def download_url(url: str): + loop = get_running_loop() + file = await loop.run_in_executor(None, download, url) + return file + + +def generate_captcha(): + # Generate one letter + def gen_letter(): + return chr(randint(65, 90)) + + def rndColor(): + return (randint(64, 255), randint(64, 255), randint(64, 255)) + + def rndColor2(): + return (randint(32, 127), randint(32, 127), randint(32, 127)) + + # Generate a 4 letter word + def gen_wrong_answer(): + return "".join(gen_letter() for _ in range(4)) + + # Generate 8 wrong captcha answers + wrong_answers = [] + for _ in range(8): + wrong_answers.append(gen_wrong_answer()) + + width = 80 * 4 + height = 100 + correct_answer = "" + font = ImageFont.truetype("assets/arial.ttf", 55) + file = f"assets/{randint(1000, 9999)}.jpg" + image = Image.new("RGB", (width, height), (255, 255, 255)) + draw = ImageDraw.Draw(image) + + # Draw random points on image + for x in range(width): + for y in range(height): + draw.point((x, y), fill=rndColor()) + + for t in range(4): + letter = gen_letter() + correct_answer += letter + draw.text((60 * t + 50, 15), letter, font=font, fill=rndColor2()) + image = image.filter(ImageFilter.BLUR) + image.save(file, "jpeg") + return [file, correct_answer, wrong_answers] + + +def test_speedtest(): + def speed_convert(size): + power = 2**10 + zero = 0 + units = {0: "", 1: "ᴋʙ/s", 2: "ᴍʙ/s", 3: "ɢʙ/s", 4: "ᴛʙ/s"} + while size > power: + size /= power + zero += 1 + return f"{round(size, 2)} {units[zero]}" + + speed = speedtest.Speedtest() + info = speed.get_best_server() + download = speed.download() + upload = speed.upload() + return [speed_convert(download), speed_convert(upload), info] + + +async def file_size_from_url(url: str) -> int: + async with aiohttp.ClientSession() as session, session.head(url) as resp: + size = int(resp.headers["content-length"]) + return size + + +async def get_http_status_code(url: str) -> int: + async with aiohttp.ClientSession() as session, session.head(url) as resp: + return resp.status + + +async def transfer_sh(file): + async with aiofiles.open(file, "rb") as f: + params = {file: await f.read()} + async with aiohttp.ClientSession() as session, session.post( + "https://transfer.sh/", data=params + ) as resp: + download_link = str(await resp.text()).strip() + return download_link + + +def obj_to_str(object): + if not object: + return False + return codecs.encode(pickle.dumps(object), "base64").decode() + + +def str_to_obj(string: str): + return pickle.loads(codecs.decode(string.encode(), "base64")) + + +async def calc_distance_from_ip(ip1: str, ip2: str) -> float: + Radius_Earth = 6371.0088 + data1, data2 = await gather( + fetch(f"http://ipinfo.io/{ip1}"), fetch(f"http://ipinfo.io/{ip2}") + ) + lat1, lon1 = data1["loc"].split(",") + lat2, lon2 = data2["loc"].split(",") + lat1, lon1 = radians(float(lat1)), radians(float(lon1)) + lat2, lon2 = radians(float(lat2)), radians(float(lon2)) + dlon = lon2 - lon1 + dlat = lat2 - lat1 + a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2 + c = 2 * atan2(sqrt(a), sqrt(1 - a)) + return Radius_Earth * c diff --git a/Exon/utils/inlinehelper.py b/Exon/utils/inlinehelper.py new file mode 100644 index 00000000..930b43d8 --- /dev/null +++ b/Exon/utils/inlinehelper.py @@ -0,0 +1,484 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import json +import socket +import sys +from random import randint +from time import time + +import aiohttp +from googletrans import Translator +from motor import version as mongover +from pykeyboard import InlineKeyboard +from pyrogram import __version__ as pyrover +from pyrogram.raw.functions import Ping +from pyrogram.types import ( + InlineKeyboardButton, + InlineQueryResultArticle, + InlineQueryResultPhoto, + InputTextMessageContent, +) +from search_engine_parser import GoogleSearch + +from Exon import BOT_USERNAME, OWNER_ID +from Exon import OWNER_USERNAME as AK_BOSS +from Exon import arq, pgram +from Exon.utils.pluginhelpers import convert_seconds_to_minutes as time_convert +from Exon.utils.pluginhelpers import fetch + +SUDOERS = OWNER_ID +app = pgram + + +async def _netcat(host, port, content): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((host, int(port))) + s.sendall(content.encode()) + s.shutdown(socket.SHUT_WR) + while True: + data = s.recv(4096).decode("utf-8").strip("\n\x00") + if not data: + break + return data + s.close() + + +async def paste(content): + link = await _netcat("ezup.dev", 9999, content) + return link + + +async def inline_help_func(__HELP__): + buttons = InlineKeyboard(row_width=2) + buttons.add( + InlineKeyboardButton("ɢᴇᴛ ᴍᴏʀᴇ ʜᴇʟᴘ.", url=f"t.me/{BOT_USERNAME}?start=start"), + InlineKeyboardButton("ɢᴏ ɪɴʟɪɴᴇ!", switch_inline_query_current_chat=""), + ) + answerss = [ + InlineQueryResultArticle( + title="ɪɴʟɪɴᴇ ᴄᴏᴍᴍᴀɴᴅs", + description="ʜᴇʟᴘ ʀᴇʟᴀᴛᴇᴅ ᴛᴏ ɪɴʟɪɴᴇ ᴜsᴀɢᴇ.", + input_message_content=InputTextMessageContent(__HELP__), + thumb_url="https://telegra.ph/file/03264297589e442200052.jpg", + reply_markup=buttons, + ) + ] + answerss = await alive_function(answerss) + return answerss + + +async def alive_function(answers): + buttons = InlineKeyboard(row_width=2) + bot_state = "ᴅᴇᴀᴅ" if not await app.get_me() else "ᴀʟɪᴠᴇ" + # ubot_state = 'Dead' if not await app2.get_me() else 'Alive' + buttons.add( + InlineKeyboardButton("ᴍᴀɪɴ ʙᴏᴛ", url="https://t.me/{BOT_USERNAME}"), + InlineKeyboardButton("ɢᴏ ɪɴʟɪɴᴇ!", switch_inline_query_current_chat=""), + ) + + msg = f""" +**ᴍᴀɪɴʙᴏᴛ:** `{bot_state}` +**ᴜsᴇʀʙᴏᴛ:** `Alive` +**ᴘʏᴛʜᴏɴ:** `3.9` +**ᴘʏʀᴏɢʀᴀᴍ:** `{pyrover}` +**ᴍᴏɴɢᴏᴅʙ:** `{mongover}` +**ᴘʟᴀᴛғᴏʀᴍ:** `{sys.platform}` +**ᴘʀᴏғɪʟᴇs:** [BOT](t.me/{BOT_USERNAME}) | [Owner](t.me/{AK_BOSS}) +""" + answers.append( + InlineQueryResultArticle( + title="ᴀʟɪᴠᴇ", + description="ᴄʜᴇᴄᴋ ʙᴏᴛ sᴛᴀᴛs", + thumb_url="https://telegra.ph/file/03264297589e442200052.jpg", + input_message_content=InputTextMessageContent( + msg, disable_web_page_preview=True + ), + reply_markup=buttons, + ) + ) + return answers + + +async def webss(url): + start_time = time() + if "." not in url: + return + screenshot = await fetch(f"https://patheticprogrammers.cf/ss?site={url}") + end_time = time() + # m = await app.send_photo(LOG_GROUP_ID, photo=screenshot["url"]) + await m.delete() + a = [] + pic = InlineQueryResultPhoto( + photo_url=screenshot["url"], + caption=(f"`{url}`\n__ᴛᴏᴏᴋ {round(end_time - start_time)} sᴇᴄᴏɴᴅs.__"), + ) + a.append(pic) + return a + + +async def translate_func(answers, lang, tex): + i = Translator().translate(tex, dest=lang) + msg = f""" +__**Translated from {i.src} to {lang}**__ +**ɪɴᴘᴜᴛ:** +{tex} +**ᴏᴜᴛᴘᴜᴛ:** +{i.text}""" + answers.extend( + [ + InlineQueryResultArticle( + title=f"ᴛʀᴀɴsʟᴀᴛᴇᴅ ғʀᴏᴍ {i.src} ᴛᴏ {lang}.", + description=i.text, + input_message_content=InputTextMessageContent(msg), + ), + InlineQueryResultArticle( + title=i.text, input_message_content=InputTextMessageContent(i.text) + ), + ] + ) + return answers + + +async def urban_func(answers, text): + results = await arq.urbandict(text) + if not results.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=results.result, + input_message_content=InputTextMessageContent(results.result), + ) + ) + return answers + results = results.result + limit = 0 + for i in results: + if limit > 48: + break + limit += 1 + msg = f""" +**ǫᴜᴇʀʏ:** {text} +**ᴅᴇғɪɴɪᴛɪᴏɴ:** __{i.definition}__ +**ᴇxᴀᴍᴘʟᴇ:** __{i.example}__""" + + answers.append( + InlineQueryResultArticle( + title=i.word, + description=i.definition, + input_message_content=InputTextMessageContent(msg), + ) + ) + return answers + + +async def google_search_func(answers, text): + gresults = await GoogleSearch().async_search(text) + limit = 0 + for i in gresults: + if limit > 48: + break + limit += 1 + + try: + msg = f""" +[{i['titles']}]({i['links']}) +{i['descriptions']}""" + + answers.append( + InlineQueryResultArticle( + title=i["titles"], + description=i["descriptions"], + input_message_content=InputTextMessageContent( + msg, disable_web_page_preview=True + ), + ) + ) + except KeyError: + pass + return answers + + +async def wall_func(answers, text): + results = await arq.wall(text) + if not results.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=results.result, + input_message_content=InputTextMessageContent(results.result), + ) + ) + return answers + limit = 0 + results = results.result + for i in results: + if limit > 48: + break + limit += 1 + answers.append( + InlineQueryResultPhoto( + photo_url=i.url_image, + thumb_url=i.url_thumb, + caption=f"[sᴏᴜʀᴄᴇ]({i.url_image})", + ) + ) + return answers + + +async def saavn_func(answers, text): + buttons_list = [] + results = await arq.saavn(text) + if not results.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=results.result, + input_message_content=InputTextMessageContent(results.result), + ) + ) + return answers + results = results.result + for count, i in enumerate(results): + buttons = InlineKeyboard(row_width=1) + buttons.add(InlineKeyboardButton("ᴅᴏᴡɴʟᴏᴀᴅ | ᴘʟᴀʏ", url=i.media_url)) + buttons_list.append(buttons) + duration = await time_convert(i.duration) + caption = f""" +**ᴛɪᴛʟᴇ:** {i.song} +**ᴀʟʙᴜᴍ:** {i.album} +**ᴅᴜʀᴀᴛɪᴏɴ:** {duration} +**ʀᴇʟᴇᴀsᴇ:** {i.year} +**sɪɴɢᴇʀs:** {i.singers}""" + description = f"{i.album} | {duration} " + f"| {i.singers} ({i.year})" + answers.append( + InlineQueryResultArticle( + title=i.song, + input_message_content=InputTextMessageContent( + caption, disable_web_page_preview=True + ), + description=description, + thumb_url=i.image, + reply_markup=buttons_list[count], + ) + ) + return answers + + +async def paste_func(answers, text): + start_time = time() + url = await paste(text) + msg = f"__**{url}**__" + end_time = time() + answers.append( + InlineQueryResultArticle( + title=f"ᴘᴀsᴛᴇᴅ ɪɴ {round(end_time - start_time)} sᴇᴄᴏɴᴅs.", + description=url, + input_message_content=InputTextMessageContent(msg), + ) + ) + return answers + + +async def deezer_func(answers, text): + buttons_list = [] + results = await arq.deezer(text, 5) + if not results.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=results.result, + input_message_content=InputTextMessageContent(results.result), + ) + ) + return answers + results = results.result + for count, i in enumerate(results): + buttons = InlineKeyboard(row_width=1) + buttons.add(InlineKeyboardButton("ᴅᴏᴡɴʟᴏᴀᴅ | ᴘʟᴀʏ", url=i.url)) + buttons_list.append(buttons) + duration = await time_convert(i.duration) + caption = f""" +**ᴛɪᴛʟᴇ:** {i.title} +**ᴀʀᴛɪsᴛ:** {i.artist} +**ᴅᴜʀᴀᴛɪᴏɴ:** {duration} +**sᴏᴜʀᴄᴇ:** [Deezer]({i.source})""" + description = f"{i.artist} | {duration}" + answers.append( + InlineQueryResultArticle( + title=i.title, + thumb_url=i.thumbnail, + description=description, + input_message_content=InputTextMessageContent( + caption, disable_web_page_preview=True + ), + reply_markup=buttons_list[count], + ) + ) + return answers + + +# Used my api key here, don't fuck with it +async def shortify(url): + if "." not in url: + return + header = { + "Authorization": "Bearer ad39983fa42d0b19e4534f33671629a4940298dc", + "Content-Type": "application/json", + } + payload = {"long_url": f"{url}"} + payload = json.dumps(payload) + async with aiohttp.ClientSession() as session, session.post( + "https://api-ssl.bitly.com/v4/shorten", headers=header, data=payload + ) as resp: + data = await resp.json() + msg = data["link"] + a = [] + b = InlineQueryResultArticle( + title="ʟɪɴᴋ sʜᴏʀᴛᴇɴᴇᴅ!", + description=data["link"], + input_message_content=InputTextMessageContent( + msg, disable_web_page_preview=True + ), + ) + a.append(b) + return a + + +async def torrent_func(answers, text): + results = await arq.torrent(text) + if not results.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=results.result, + input_message_content=InputTextMessageContent(results.result), + ) + ) + return answers + limit = 0 + results = results.result + for i in results: + if limit > 48: + break + title = i.name + size = i.size + seeds = i.seeds + leechs = i.leechs + upload_date = i.uploaded + " Ago" + magnet = i.magnet + caption = f""" +**ᴛɪᴛʟᴇ:** __{title}__ +**sɪᴢᴇ:** __{size}__ +**sᴇᴇᴅs:** __{seeds}__ +**ʟᴇᴇᴄʜs:** __{leechs}__ +**ᴜᴘʟᴏᴀᴅᴇᴅ:** __{upload_date}__ +**ᴍᴀɢɴᴇᴛ:** `{magnet}`""" + + description = f"{size} | {upload_date} | Seeds: {seeds}" + answers.append( + InlineQueryResultArticle( + title=title, + description=description, + input_message_content=InputTextMessageContent( + caption, disable_web_page_preview=True + ), + ) + ) + limit += 1 + return answers + + +async def wiki_func(answers, text): + data = await arq.wiki(text) + if not data.ok: + answers.append( + InlineQueryResultArticle( + title="ᴇʀʀᴏʀ", + description=data.result, + input_message_content=InputTextMessageContent(data.result), + ) + ) + return answers + data = data.result + msg = f""" +**ǫᴜᴇʀʏ:** +{data.title} +**ᴀɴsᴡᴇʀ:** +__{data.answer}__""" + answers.append( + InlineQueryResultArticle( + title=data.title, + description=data.answer, + input_message_content=InputTextMessageContent(msg), + ) + ) + return answers + + +async def ping_func(answers): + t1 = time() + ping = Ping(ping_id=randint(696969, 6969696)) + await app.send(ping) + t2 = time() + ping = f"{str(round((t2 - t1), 2))} sᴇᴄᴏɴᴅs" + answers.append( + InlineQueryResultArticle( + title=ping, input_message_content=InputTextMessageContent(f"__**{ping}**__") + ) + ) + return answers + + +async def pokedexinfo(answers, pokemon): + Pokemon = f"https://some-random-api.ml/pokedex?pokemon={pokemon}" + result = await fetch(Pokemon) + buttons = InlineKeyboard(row_width=1) + buttons.add( + InlineKeyboardButton("ᴘᴏᴋᴇᴅᴇx", switch_inline_query_current_chat="pokedex") + ) + caption = f""" +**ᴘᴏᴋᴇᴍᴏɴ:** `{result['name']}` +**ᴘᴏᴋᴇᴅᴇx:** `{result['id']}` +**ᴛʏᴘᴇ:** `{result['type']}` +**ᴀʙɪʟɪᴛɪᴇs:** `{result['abilities']}` +**ʜᴇɪɢʜᴛ:** `{result['height']}` +**ᴡᴇɪɢʜᴛ:** `{result['weight']}` +**ɢᴇɴᴅᴇʀ:** `{result['gender']}` +**sᴛᴀᴛs:** `{result['stats']}` +**ᴅᴇsᴄʀɪᴘᴛɪᴏɴ:** `{result['description']}`""" + answers.append( + InlineQueryResultPhoto( + photo_url=f"https://img.pokemondb.net/artwork/large/{pokemon}.jpg", + title=result["name"], + description=result["description"], + caption=caption, + reply_markup=buttons, + ) + ) + return answers diff --git a/Exon/utils/pastebin.py b/Exon/utils/pastebin.py new file mode 100644 index 00000000..b4ae9974 --- /dev/null +++ b/Exon/utils/pastebin.py @@ -0,0 +1,50 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import socket +from asyncio import get_running_loop +from functools import partial + + +def _netcat(host, port, content): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((host, port)) + s.sendall(content.encode()) + s.shutdown(socket.SHUT_WR) + while True: + data = s.recv(4096).decode("utf-8").strip("\n\x00") + if not data: + break + return data + s.close() + + +async def paste(content): + loop = get_running_loop() + link = await loop.run_in_executor(None, partial(_netcat, "ezup.dev", 9999, content)) + return link diff --git a/Exon/utils/permissions.py b/Exon/utils/permissions.py new file mode 100644 index 00000000..a9ec713e --- /dev/null +++ b/Exon/utils/permissions.py @@ -0,0 +1,86 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +from functools import wraps + +from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden +from pyrogram.types import Message + +from Exon import DRAGONS, pgram +from Exon.utils.pluginhelp import member_permissions + + +async def authorised(func, subFunc2, client, message, *args, **kwargs): + chatID = message.chat.id + try: + await func(client, message, *args, **kwargs) + except ChatWriteForbidden: + await pgram.leave_chat(chatID) + except Exception as e: + try: + await message.reply_text(str(e)) + except ChatWriteForbidden: + await pgram.leave_chat(chatID) + return subFunc2 + + +async def unauthorised(message: Message, permission, subFunc2): + chatID = message.chat.id + text = ( + "ʏᴏᴜ ᴅᴏɴ'ᴛ ʜᴀᴠᴇ ᴛʜᴇ ʀᴇǫᴜɪʀᴇᴅ ᴘᴇʀᴍɪssɪᴏɴ ᴛᴏ ᴘᴇʀғᴏʀᴍ ᴛʜɪs ᴀᴄᴛɪᴏɴ." + + f"\n**ᴘᴇʀᴍɪssɪᴏɴ:** __{permission}__" + ) + try: + await message.reply_text(text) + except ChatWriteForbidden: + await pgram.leave_chat(chatID) + 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: + 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) + if userID not in DRAGONS and permission not in permissions: + return await unauthorised(message, permission, subFunc2) + return await authorised(func, subFunc2, client, message, *args, **kwargs) + + return subFunc2 + + return subFunc diff --git a/Exon/utils/pluginhelp.py b/Exon/utils/pluginhelp.py new file mode 100644 index 00000000..904f6858 --- /dev/null +++ b/Exon/utils/pluginhelp.py @@ -0,0 +1,374 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import asyncio +import math +import shlex +import sys +import time +import traceback +from functools import wraps +from typing import Callable, Coroutine, Dict, List, Tuple, Union + +from PIL import Image +from pyrogram import Client +from pyrogram.errors import FloodWait, MessageNotModified +from pyrogram.types import Chat, Message, User + +from Exon import OWNER_ID, SUPPORT_CHAT, pgram +from Exon.utils.errors import split_limits + + +def get_user(message: Message, text: str) -> [int, str, None]: + asplit = None if text is None else text.split(" ", 1) + user_s = None + reason_ = None + if message.reply_to_message: + user_s = message.reply_to_message.from_user.id + reason_ = text or None + elif asplit is None: + return None, None + elif len(asplit[0]) > 0: + user_s = int(asplit[0]) if asplit[0].isdigit() else asplit[0] + if len(asplit) == 2: + reason_ = asplit[1] + return user_s, reason_ + + +def get_readable_time(seconds: int) -> int: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "m", "h", "days"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += time_list.pop() + ", " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +def time_formatter(milliseconds: int) -> str: + seconds, milliseconds = divmod(int(milliseconds), 1000) + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + tmp = ( + ((str(days) + " ᴅᴀʏ(s), ") if days else "") + + ((str(hours) + " ʜᴏᴜʀ(s), ") if hours else "") + + ((str(minutes) + " ᴍɪɴᴜᴛᴇ(s), ") if minutes else "") + + ((str(seconds) + " sᴇᴄᴏɴᴅ(s), ") if seconds else "") + + ((str(milliseconds) + " ᴍɪʟʟɪsᴇᴄᴏɴᴅ(s), ") if milliseconds else "") + ) + return tmp[:-2] + + +async def delete_or_pass(message): + if message.from_user.id == 1452219013: + return message + return await message.delete() + + +def humanbytes(size): + if not size: + return "" + power = 2**10 + raised_to_pow = 0 + dict_power_n = {0: "", 1: "Ki", 2: "Mi", 3: "Gi", 4: "Ti"} + while size > power: + size /= power + raised_to_pow += 1 + return str(round(size, 2)) + " " + dict_power_n[raised_to_pow] + "B" + + +async def progress(current, total, message, start, type_of_ps, file_name=None): + now = time.time() + diff = now - start + if round(diff % 10.00) == 0 or current == total: + percentage = current * 100 / total + speed = current / diff + elapsed_time = round(diff) * 1000 + if elapsed_time == 0: + return + time_to_completion = round((total - current) / speed) * 1000 + estimated_total_time = elapsed_time + time_to_completion + progress_str = "{0}{1} {2}%\n".format( + "".join("🔴" for i in range(math.floor(percentage / 10))), + "".join("🔘" for i in range(10 - math.floor(percentage / 10))), + round(percentage, 2), + ) + + tmp = progress_str + "{0} of {1}\nETA: {2}".format( + humanbytes(current), humanbytes(total), time_formatter(estimated_total_time) + ) + if file_name: + try: + await message.edit( + "{}\n**ғɪʟᴇ ɴᴀᴍᴇ:** `{}`\n{}".format(type_of_ps, file_name, tmp) + ) + except FloodWait as e: + await asyncio.sleep(e.x) + except MessageNotModified: + pass + else: + try: + await message.edit("{}\n{}".format(type_of_ps, tmp)) + except FloodWait as e: + await asyncio.sleep(e.x) + except MessageNotModified: + pass + + +def get_text(message: Message) -> [None, str]: + text_to_return = message.text + if message.text is None: + return None + if " " not in text_to_return: + return None + + try: + return message.text.split(None, 1)[1] + except IndexError: + return None + + +async def iter_chats(client): + chats = [] + async for dialog in client.iter_dialogs(): + if dialog.chat.type in ["supergroup", "channel"]: + chats.append(dialog.chat.id) + return chats + + +async def fetch_audio(client, message): + time.time() + if not message.reply_to_message: + await message.reply("`ʀᴇᴘʟʏ ᴛᴏ ᴀ ᴠɪᴅᴇᴏ / ᴀᴜᴅɪᴏ.`") + return + warner_stark = message.reply_to_message + if warner_stark.audio is None and warner_stark.video is None: + await message.reply("`ғᴏʀᴍᴀᴛ ɴᴏᴛ sᴜᴘᴘᴏʀᴛᴇᴅ`") + return + if warner_stark.video: + lel = await message.reply("`ᴠɪᴅᴇᴏ ᴅᴇᴛᴇᴄᴛᴇᴅ, ᴄᴏɴᴠᴇʀᴛɪɴɢ ᴛᴏ ᴀᴜᴅɪᴏ !`") + warner_bros = await message.reply_to_message.download() + stark_cmd = f"ffmpeg -i {warner_bros} -map 0:a friday.mp3" + await runcmd(stark_cmd) + final_warner = "friday.mp3" + elif warner_stark.audio: + lel = await edit_or_reply(message, "`ᴅᴏᴡɴʟᴏᴀᴅ sᴛᴀʀᴛᴇᴅ !`") + final_warner = await message.reply_to_message.download() + await lel.edit("`ᴀʟᴍᴏsᴛ ᴅᴏɴᴇ!`") + await lel.delete() + return final_warner + + +async def edit_or_reply(message, text, parse_mode="md"): + if message.from_user.id: + if message.reply_to_message: + kk = message.reply_to_message.message_id + return await message.reply_text( + text, reply_to_message_id=kk, parse_mode=parse_mode + ) + return await message.reply_text(text, parse_mode=parse_mode) + return await message.edit(text, parse_mode=parse_mode) + + +async def runcmd(cmd: str) -> Tuple[str, str, int, int]: + """ʀᴜɴ ᴄᴏᴍᴍᴀɴᴅ ɪɴ ᴛᴇʀᴍɪɴᴀʟ""" + 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, + ) + + +async def convert_to_image(message, client) -> [None, str]: + """ᴄᴏɴᴠᴇʀᴛ ᴍᴏsᴛ ᴍᴇᴅɪᴀ ғᴏʀᴍᴀᴛs ᴛᴏ ʀᴀᴡ ɪᴍᴀɢᴇ""" + final_path = None + if not ( + message.reply_to_message.photo + or message.reply_to_message.sticker + or message.reply_to_message.media + or message.reply_to_message.animation + or message.reply_to_message.audio + ): + return None + if message.reply_to_message.photo: + final_path = await message.reply_to_message.download() + elif message.reply_to_message.sticker: + if message.reply_to_message.sticker.mime_type == "image/webp": + final_path = "webp_to_png_s_proton.png" + path_s = await message.reply_to_message.download() + im = Image.open(path_s) + im.save(final_path, "PNG") + else: + path_s = await client.download_media(message.reply_to_message) + final_path = "lottie_proton.png" + cmd = ( + f"lottie_convert.py --frame 0 -if lottie -of png {path_s} {final_path}" + ) + await runcmd(cmd) + elif message.reply_to_message.audio: + thumb = message.reply_to_message.audio.thumbs[0].file_id + final_path = await client.download_media(thumb) + elif message.reply_to_message.video or message.reply_to_message.animation: + final_path = "fetched_thumb.png" + vid_path = await client.download_media(message.reply_to_message) + await runcmd(f"ffmpeg -i {vid_path} -filter:v scale=500:500 -an {final_path}") + return final_path + + +def get_text(message: Message) -> [None, str]: + """ᴇxᴛʀᴀᴄᴛ ᴛᴇxᴛ ғʀᴏᴍ ᴄᴏᴍᴍᴀɴᴅs""" + text_to_return = message.text + if message.text is None: + return None + if " " not in text_to_return: + return None + + try: + return message.text.split(None, 1)[1] + except IndexError: + return None + + +# Admin check + +admins: Dict[str, List[User]] = {} + + +def set(chat_id: Union[str, int], admins_: List[User]): + if isinstance(chat_id, int): + chat_id = str(chat_id) + + admins[chat_id] = admins_ + + +def get(chat_id: Union[str, int]) -> Union[List[User], bool]: + if isinstance(chat_id, int): + chat_id = str(chat_id) + + if chat_id in admins: + return admins[chat_id] + + return False + + +async def get_administrators(chat: Chat) -> List[User]: + _get = get(chat.id) + + if _get: + return _get + set( + chat.id, + (member.user for member in await chat.get_member(filter="administrators")), + ) + + return await get_administrators(chat) + + +def admins_only(func: Callable) -> Coroutine: + async def wrapper(client: Client, message: Message): + if message.from_user.id == OWNER_ID: + return await func(client, message) + admins = await get_administrators(message.chat) + for admin in admins: + if admin.id == message.from_user.id: + return await func(client, message) + + return wrapper + + +# @Mr_Dark_Prince +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except Exception as err: + exc_type, exc_obj, exc_tb = sys.exc_info() + errors = traceback.format_exception( + etype=exc_type, + value=exc_obj, + tb=exc_tb, + ) + error_feedback = split_limits( + "**ᴇʀʀᴏʀ** | `{}` | `{}`\n\n```{}```\n\n```{}```\n".format( + 0 if not message.from_user else message.from_user.id, + 0 if not message.chat else message.chat.id, + message.text or message.caption, + "".join(errors), + ), + ) + for x in error_feedback: + await pgram.send_message(SUPPORT_CHAT, x) + raise err + + return capture + + +async def member_permissions(chat_id, user_id): + perms = [] + member = await pgram.get_chat_member(chat_id, user_id) + 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") + return perms diff --git a/Exon/utils/pluginhelpers.py b/Exon/utils/pluginhelpers.py new file mode 100644 index 00000000..b2f2d54f --- /dev/null +++ b/Exon/utils/pluginhelpers.py @@ -0,0 +1,485 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" + +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import asyncio +import math +import shlex +import sys +import time +import traceback +from functools import wraps +from typing import Callable, Coroutine, Dict, List, Tuple, Union + +import aiohttp +from PIL import Image +from pyrogram import Client +from pyrogram.errors import FloodWait, MessageNotModified +from pyrogram.types import Chat, Message, User + +from Exon import OWNER_ID, SUPPORT_CHAT, pgram +from Exon.utils.errors import split_limits + + +def get_user(message: Message, text: str) -> [int, str, None]: + asplit = None if text is None else text.split(" ", 1) + user_s = None + reason_ = None + if message.reply_to_message: + user_s = message.reply_to_message.from_user.id + reason_ = text or None + elif asplit is None: + return None, None + elif len(asplit[0]) > 0: + user_s = int(asplit[0]) if asplit[0].isdigit() else asplit[0] + if len(asplit) == 2: + reason_ = asplit[1] + return user_s, reason_ + + +async def is_admin(event, user): + try: + sed = await event.client.get_permissions(event.chat_id, user) + if sed.is_admin: + is_mod = True + else: + is_mod = False + except: + is_mod = False + return is_mod + + +def get_readable_time(seconds: int) -> int: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "m", "h", "days"] + + 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 x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += time_list.pop() + ", " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time + + +def time_formatter(milliseconds: int) -> str: + seconds, milliseconds = divmod(int(milliseconds), 1000) + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + tmp = ( + ((str(days) + " day(s), ") if days else "") + + ((str(hours) + " hour(s), ") if hours else "") + + ((str(minutes) + " minute(s), ") if minutes else "") + + ((str(seconds) + " second(s), ") if seconds else "") + + ((str(milliseconds) + " millisecond(s), ") if milliseconds else "") + ) + return tmp[:-2] + + +async def delete_or_pass(message): + if message.from_user.id == 1141839926: + return message + return await message.delete() + + +def humanbytes(size): + if not size: + return "" + power = 2**10 + raised_to_pow = 0 + dict_power_n = {0: "", 1: "Ki", 2: "Mi", 3: "Gi", 4: "Ti"} + while size > power: + size /= power + raised_to_pow += 1 + return str(round(size, 2)) + " " + dict_power_n[raised_to_pow] + "B" + + +async def progress(current, total, message, start, type_of_ps, file_name=None): + now = time.time() + diff = now - start + if round(diff % 10.00) == 0 or current == total: + percentage = current * 100 / total + speed = current / diff + elapsed_time = round(diff) * 1000 + if elapsed_time == 0: + return + time_to_completion = round((total - current) / speed) * 1000 + estimated_total_time = elapsed_time + time_to_completion + progress_str = "{0}{1} {2}%\n".format( + "".join("🔴" for i in range(math.floor(percentage / 10))), + "".join("🔘" for i in range(10 - math.floor(percentage / 10))), + round(percentage, 2), + ) + + tmp = progress_str + "{0} of {1}\nETA: {2}".format( + humanbytes(current), humanbytes(total), time_formatter(estimated_total_time) + ) + if file_name: + try: + await message.edit( + "{}\n**File Name:** `{}`\n{}".format(type_of_ps, file_name, tmp) + ) + except FloodWait as e: + await asyncio.sleep(e.x) + except MessageNotModified: + pass + else: + try: + await message.edit("{}\n{}".format(type_of_ps, tmp)) + except FloodWait as e: + await asyncio.sleep(e.x) + except MessageNotModified: + pass + + +def get_text(message: Message) -> [None, str]: + text_to_return = message.text + if message.text is None: + return None + if " " not in text_to_return: + return None + + try: + return message.text.split(None, 1)[1] + except IndexError: + return None + + +async def iter_chats(client): + chats = [] + async for dialog in client.iter_dialogs(): + if dialog.chat.type in ["supergroup", "channel"]: + chats.append(dialog.chat.id) + return chats + + +async def fetch_audio(client, message): + time.time() + if not message.reply_to_message: + await message.reply("`Reply To A Video / Audio.`") + return + warner_stark = message.reply_to_message + if warner_stark.audio is None and warner_stark.video is None: + await message.reply("`Format Not Supported`") + return + if warner_stark.video: + lel = await message.reply("`Video Detected, Converting To Audio !`") + warner_bros = await message.reply_to_message.download() + stark_cmd = f"ffmpeg -i {warner_bros} -map 0:a friday.mp3" + await runcmd(stark_cmd) + final_warner = "friday.mp3" + elif warner_stark.audio: + lel = await edit_or_reply(message, "`Download Started !`") + final_warner = await message.reply_to_message.download() + await lel.edit("`Almost Done!`") + await lel.delete() + return final_warner + + +async def edit_or_reply(message, text, parse_mode="md"): + if message.from_user.id: + if message.reply_to_message: + kk = message.reply_to_message.message_id + return await message.reply_text( + text, reply_to_message_id=kk, parse_mode=parse_mode + ) + return await message.reply_text(text, parse_mode=parse_mode) + return await message.edit(text, parse_mode=parse_mode) + + +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, + ) + + +async def convert_to_image(message, client) -> [None, str]: + """Convert Most Media Formats To Raw Image""" + final_path = None + if not ( + message.reply_to_message.photo + or message.reply_to_message.sticker + or message.reply_to_message.media + or message.reply_to_message.animation + or message.reply_to_message.audio + ): + return None + if message.reply_to_message.photo: + final_path = await message.reply_to_message.download() + elif message.reply_to_message.sticker: + if message.reply_to_message.sticker.mime_type == "image/webp": + final_path = "webp_to_png_s_proton.png" + path_s = await message.reply_to_message.download() + im = Image.open(path_s) + im.save(final_path, "PNG") + else: + path_s = await client.download_media(message.reply_to_message) + final_path = "lottie_proton.png" + cmd = ( + f"lottie_convert.py --frame 0 -if lottie -of png {path_s} {final_path}" + ) + await runcmd(cmd) + elif message.reply_to_message.audio: + thumb = message.reply_to_message.audio.thumbs[0].file_id + final_path = await client.download_media(thumb) + elif message.reply_to_message.video or message.reply_to_message.animation: + final_path = "fetched_thumb.png" + vid_path = await client.download_media(message.reply_to_message) + await runcmd(f"ffmpeg -i {vid_path} -filter:v scale=500:500 -an {final_path}") + return final_path + + +def get_text(message: Message) -> [None, str]: + """Extract Text From Commands""" + text_to_return = message.text + if message.text is None: + return None + if " " not in text_to_return: + return None + + try: + return message.text.split(None, 1)[1] + except IndexError: + return None + + +# Admin check + +admins: Dict[str, List[User]] = {} + + +def set(chat_id: Union[str, int], admins_: List[User]): + if isinstance(chat_id, int): + chat_id = str(chat_id) + + admins[chat_id] = admins_ + + +def get(chat_id: Union[str, int]) -> Union[List[User], bool]: + if isinstance(chat_id, int): + chat_id = str(chat_id) + + if chat_id in admins: + return admins[chat_id] + + return False + + +async def get_administrators(chat: Chat) -> List[User]: + _get = get(chat.id) + + if _get: + return _get + set( + chat.id, + (member.user for member in await chat.get_member(filter="administrators")), + ) + + return await get_administrators(chat) + + +def admins_only(func: Callable) -> Coroutine: + async def wrapper(client: Client, message: Message): + if message.from_user.id == OWNER_ID: + return await func(client, message) + admins = await get_administrators(message.chat) + for admin in admins: + if admin.id == message.from_user.id: + return await func(client, message) + + return wrapper + + +def capture_err(func): + @wraps(func) + async def capture(client, message, *args, **kwargs): + try: + return await func(client, message, *args, **kwargs) + except Exception as err: + exc_type, exc_obj, exc_tb = sys.exc_info() + errors = traceback.format_exception( + etype=exc_type, + value=exc_obj, + tb=exc_tb, + ) + error_feedback = split_limits( + "**ERROR** | `{}` | `{}`\n\n```{}```\n\n```{}```\n".format( + 0 if not message.from_user else message.from_user.id, + 0 if not message.chat else message.chat.id, + message.text or message.caption, + "".join(errors), + ), + ) + for x in error_feedback: + await pgram.send_message(SUPPORT_CHAT, x) + raise err + + return capture + + +async def member_permissions(chat_id, user_id): + perms = [] + member = await pgram.get_chat_member(chat_id, user_id) + 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") + return perms + + +async def current_chat_permissions(chat_id): + perms = [] + perm = (await pgram.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_stickers: + perms.append("can_send_stickers") + if perm.can_send_animations: + perms.append("can_send_animations") + if perm.can_send_games: + perms.append("can_send_games") + if perm.can_use_inline_bots: + perms.append("can_use_inline_bots") + 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 + + +# URL LOCK + + +def get_url(message_1: Message) -> Union[str, None]: + messages = [message_1] + + if message_1.reply_to_message: + messages.append(message_1.reply_to_message) + + text = "" + offset = None + length = None + + for message in messages: + if offset: + break + + if message.entities: + for entity in message.entities: + if entity.type == "url": + text = message.text or message.caption + offset, length = entity.offset, entity.length + break + + if offset in (None,): + return None + + return text[offset : offset + length] + + +async def fetch(url): + async with aiohttp.ClientSession() as session, session.get(url) as resp: + try: + data = await resp.json() + except Exception: + data = await resp.text() + return data + + +async def convert_seconds_to_minutes(seconds: int): + seconds = int(seconds) + seconds %= 24 * 3600 + seconds %= 3600 + minutes = seconds // 60 + seconds %= 60 + return "%02d:%02d" % (minutes, seconds) + + +async def json_object_prettify(objecc): + dicc = objecc.__dict__ + return "".join( + f"**{key}:** `{value}`\n" + for key, value in dicc.items() + if key not in ["pinned_message", "photo", "_", "_client"] + ) + + +async def json_prettify(data): + output = "" + try: + for key, value in data.items(): + output += f"**{key}:** `{value}`\n" + except Exception: + for datas in data: + for key, value in datas.items(): + output += f"**{key}:** `{value}`\n" + output += "------------------------\n" + return output diff --git a/Exon/utils/progress.py b/Exon/utils/progress.py new file mode 100644 index 00000000..741e8242 --- /dev/null +++ b/Exon/utils/progress.py @@ -0,0 +1,69 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import math +import time + +from .exceptions import CancelProcess +from .tools import humanbytes, time_formatter + + +async def progress( + current, total, gdrive, start, prog_type, file_name=None, is_cancelled=False +): + now = time.time() + diff = now - start + if is_cancelled is True: + raise CancelProcess + + if round(diff % 10.00) == 0 or current == total: + percentage = current * 100 / total + speed = current / diff + elapsed_time = round(diff) + eta = round((total - current) / speed) + if "upload" in prog_type.lower(): + status = "Uploading" + elif "download" in prog_type.lower(): + status = "Downloading" + else: + status = "Unknown" + progress_str = "`{0}` | [{1}{2}] `{3}%`".format( + status, + "".join("●" for i in range(math.floor(percentage / 10))), + "".join("○" for i in range(10 - math.floor(percentage / 10))), + round(percentage, 2), + ) + tmp = ( + f"{progress_str}\n" + f"`{humanbytes(current)} of {humanbytes(total)}" + f" @ {humanbytes(speed)}`\n" + f"`ETA` -> {time_formatter(eta)}\n" + f"`Duration` -> {time_formatter(elapsed_time)}" + ) + await gdrive.edit(f"`{prog_type}`\n\n" f"`Status`\n{tmp}") diff --git "a/Exon/utils/resources/ABISHNOI COPYRIGHT \302\251" "b/Exon/utils/resources/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/utils/resources/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git "a/Exon/utils/resources/ImageEditor/ABISHNOI COPYRIGHT \302\251" "b/Exon/utils/resources/ImageEditor/ABISHNOI COPYRIGHT \302\251" new file mode 100644 index 00000000..a7ec3b8e --- /dev/null +++ "b/Exon/utils/resources/ImageEditor/ABISHNOI COPYRIGHT \302\251" @@ -0,0 +1,27 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" \ No newline at end of file diff --git a/Exon/utils/resources/ImageEditor/edit_1.py b/Exon/utils/resources/ImageEditor/edit_1.py new file mode 100644 index 00000000..685bd0fe --- /dev/null +++ b/Exon/utils/resources/ImageEditor/edit_1.py @@ -0,0 +1,269 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import os +import shutil + +import cv2 +from PIL import Image, ImageEnhance, ImageFilter + + +async def bright(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + image = Image.open(a) + brightness = ImageEnhance.Brightness(image) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "brightness.jpg" + brightness.enhance(1.5).save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("bright-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def mix(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + image = Image.open(a) + red, green, blue = image.split() + new_image = Image.merge("RGB", (green, red, blue)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "mix.jpg" + new_image.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("mix-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def black_white(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "black_white.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + image_file = cv2.imread(a) + grayImage = cv2.cvtColor(image_file, cv2.COLOR_BGR2GRAY) + cv2.imwrite(edit_img_loc, grayImage) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("black_white-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def normal_blur(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + OriImage = Image.open(a) + blurImage = OriImage.filter(ImageFilter.BLUR) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "BlurImage.jpg" + blurImage.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normal_blur-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def g_blur(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + im1 = Image.open(a) + im2 = im1.filter(ImageFilter.GaussianBlur(radius=5)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "gaussian_blur.jpg" + im2.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("g_blur-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def box_blur(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + im1 = Image.open(a) + im2 = im1.filter(ImageFilter.BoxBlur(0)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "box_blur.jpg" + im2.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("box_blur-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ went ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return diff --git a/Exon/utils/resources/ImageEditor/edit_2.py b/Exon/utils/resources/ImageEditor/edit_2.py new file mode 100644 index 00000000..09a74bec --- /dev/null +++ b/Exon/utils/resources/ImageEditor/edit_2.py @@ -0,0 +1,416 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import os +import shutil + +import cv2 +import numpy as np +from PIL import Image, ImageDraw, ImageEnhance + + +async def circle_with_bg(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("Processing Image...") + img = Image.open(a).convert("RGB") + npImage = np.array(img) + h, w = img.size + alpha = Image.new("L", img.size, 0) + draw = ImageDraw.Draw(alpha) + draw.pieslice([0, 0, h, w], 0, 360, fill=255) + npAlpha = np.array(alpha) + npImage = np.dstack((npImage, npAlpha)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "circle.png" + Image.fromarray(npImage).save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("circle_with_bg-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def circle_without_bg(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + img = Image.open(a).convert("RGB") + npImage = np.array(img) + h, w = img.size + alpha = Image.new("L", img.size, 0) + draw = ImageDraw.Draw(alpha) + draw.pieslice([0, 0, h, w], 0, 360, fill=255) + npAlpha = np.array(alpha) + npImage = np.dstack((npImage, npAlpha)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "circle.png" + Image.fromarray(npImage).save(edit_img_loc) + await message.reply_chat_action("upload_document") + await message.reply_to_message.reply_document(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ did ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("circle_without_bg-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def sticker(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "sticker.webp" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + os.rename(a, edit_img_loc) + await message.reply_to_message.reply_sticker(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("sticker-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +def add_corners(im, rad): + circle = Image.new("L", (rad * 2, rad * 2), 0) + draw = ImageDraw.Draw(circle) + draw.ellipse((0, 0, rad * 2, rad * 2), fill=255) + alpha = Image.new("L", im.size, 255) + w, h = im.size + alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0)) + alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad)) + alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0)) + alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad)) + im.putalpha(alpha) + return im + + +async def edge_curved(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + im = Image.open(a) + im = add_corners(im, 100) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "edge_curved.webp" + im.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_sticker(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("edge_curved-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def contrast(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + image = Image.open(a) + contrast = ImageEnhance.Contrast(image) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "contrast.jpg" + contrast.enhance(1.5).save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("contrast-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +def sepia(img): + width, height = img.size + new_img = img.copy() + for x in range(width): + for y in range(height): + red, green, blue = img.getpixel((x, y)) + new_val = 0.3 * red + 0.59 * green + 0.11 * blue + new_red = int(new_val * 2) + new_red = min(new_red, 255) + new_green = int(new_val * 1.5) + new_green = min(new_green, 255) + new_blue = int(new_val) + new_blue = min(new_blue, 255) + + new_img.putpixel((x, y), (new_red, new_green, new_blue)) + + return new_img + + +async def sepia_mode(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + image = Image.open(a) + new_img = sepia(image) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "sepia.jpg" + new_img.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("sepia_mode-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +def dodgeV2(x, y): + return cv2.divide(x, 255 - y, scale=256) + + +async def pencil(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "pencil.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + img = cv2.imread(a) + img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + img_invert = cv2.bitwise_not(img_gray) + img_smoothing = cv2.GaussianBlur(img_invert, (21, 21), sigmaX=0, sigmaY=0) + final_img = dodgeV2(img_gray, img_smoothing) + cv2.imwrite(edit_img_loc, final_img) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("pencil-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +def color_quantization(img, k): + data = np.float32(img).reshape((-1, 3)) + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0) + _, label, center = cv2.kmeans( + data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS + ) + center = np.uint8(center) + result = center[label.flatten()] + result = result.reshape(img.shape) + return result + + +async def cartoon(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "kang.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + img = cv2.imread(a) + edges = cv2.Canny(img, 100, 200) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + edges = cv2.adaptiveThreshold( + gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 5 + ) + color = cv2.bilateralFilter(img, d=9, sigmaColor=200, sigmaSpace=200) + + cv2.bitwise_and(color, color, mask=edges) + img_1 = color_quantization(img, 7) + cv2.imwrite(edit_img_loc, img_1) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("cartoon-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return diff --git a/Exon/utils/resources/ImageEditor/edit_3.py b/Exon/utils/resources/ImageEditor/edit_3.py new file mode 100644 index 00000000..e5629084 --- /dev/null +++ b/Exon/utils/resources/ImageEditor/edit_3.py @@ -0,0 +1,192 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import os +import shutil + +from PIL import Image, ImageOps + + +async def black_border(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ...") + img = Image.open(a) + img_with_border = ImageOps.expand(img, border=100, fill="black") + edit_img_loc = ( + "./DOWNLOADS" + "/" + userid + "/" + "imaged-black-border.png" + ) + img_with_border.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("black_border-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def green_border(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + img = Image.open(a) + img_with_border = ImageOps.expand(img, border=100, fill="green") + edit_img_loc = ( + "./DOWNLOADS" + "/" + userid + "/" + "imaged-green-border.png" + ) + img_with_border.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("green_border-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def blue_border(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + img = Image.open(a) + img_with_border = ImageOps.expand(img, border=100, fill="blue") + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "imaged-blue-border.png" + img_with_border.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("blue_border-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def red_border(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + img = Image.open(a) + img_with_border = ImageOps.expand(img, border=100, fill="red") + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "imaged-red-border.png" + img_with_border.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("red_border-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return diff --git a/Exon/utils/resources/ImageEditor/edit_4.py b/Exon/utils/resources/ImageEditor/edit_4.py new file mode 100644 index 00000000..8c0289e8 --- /dev/null +++ b/Exon/utils/resources/ImageEditor/edit_4.py @@ -0,0 +1,429 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + +import io +import os +import shutil + +import cv2 +import numpy as np +import requests +from PIL import Image, ImageDraw, ImageOps + +from Exon import REM_BG_API_KEY + + +async def rotate_90(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "rotate_90.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + src = cv2.imread(a) + image = cv2.rotate(src, cv2.cv2.ROTATE_90_CLOCKWISE) + cv2.imwrite(edit_img_loc, image) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("rotate_90-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def rotate_180(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "rotate_180.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + src = cv2.imread(a) + image = cv2.rotate(src, cv2.ROTATE_180) + cv2.imwrite(edit_img_loc, image) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("rotate_180-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def rotate_270(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "rotate_270.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + src = cv2.imread(a) + image = cv2.rotate(src, cv2.ROTATE_90_COUNTERCLOCKWISE) + cv2.imwrite(edit_img_loc, image) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("rotate_270-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +def resize_photo(photo: str, userid: str) -> io.BytesIO: + image = Image.open(photo) + maxsize = 512 + scale = maxsize / max(image.width, image.height) + new_size = (int(image.width * scale), int(image.height * scale)) + image = image.resize(new_size, Image.LANCZOS) + resized_photo = io.BytesIO() + resized_photo.name = "./DOWNLOADS" + "/" + userid + "resized.png" + image.save(resized_photo, "PNG") + return resized_photo + + +async def round_sticker(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + resized = resize_photo(a, userid) + img = Image.open(resized).convert("RGB") + npImage = np.array(img) + h, w = img.size + alpha = Image.new("L", img.size, 0) + draw = ImageDraw.Draw(alpha) + draw.pieslice([0, 0, h, w], 0, 360, fill=255) + npAlpha = np.array(alpha) + npImage = np.dstack((npImage, npAlpha)) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "rounded.webp" + Image.fromarray(npImage).save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_sticker(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("round_sticker-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def inverted(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + a = await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + image = Image.open(a) + inverted_image = ImageOps.invert(image) + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "inverted.png" + inverted_image.save(edit_img_loc) + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("inverted-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def removebg_plain(client, message): + try: + if REM_BG_API_KEY != "": + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "nobgplain.png" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + + response = requests.post( + "https://api.remove.bg/v1.0/removebg", + files={"image_file": open(download_location, "rb")}, + data={"size": "auto"}, + headers={"X-Api-Key": REM_BG_API_KEY}, + ) + if response.status_code == 200: + with open(f"{edit_img_loc}", "wb") as out: + out.write(response.content) + else: + await message.reply_to_message.reply_text( + "Check if your api is correct", quote=True + ) + return + + await message.reply_chat_action("upload_document") + await message.reply_to_message.reply_document(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + else: + await message.reply_to_message.reply_text( + "ɢᴇᴛ ᴛʜᴇ ᴀᴘɪ ғʀᴏᴍ https://www.remove.bg/b/background-removal-api ᴀɴᴅ ᴀᴅᴅ ɪɴ ᴄᴏɴғɪɢ ᴠᴀʀ", + quote=True, + disable_web_page_preview=True, + ) + except Exception as e: + print("removebg_plain-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def removebg_white(client, message): + try: + if REM_BG_API_KEY != "": + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "nobgwhite.png" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + + response = requests.post( + "https://api.remove.bg/v1.0/removebg", + files={"image_file": open(download_location, "rb")}, + data={"size": "auto"}, + headers={"X-Api-Key": REM_BG_API_KEY}, + ) + if response.status_code == 200: + with open(f"{edit_img_loc}", "wb") as out: + out.write(response.content) + else: + await message.reply_to_message.reply_text( + "ᴄʜᴇᴄᴋ ɪғ ʏᴏᴜʀ ᴀᴘɪ ɪs ᴄᴏʀʀᴇᴄᴛ", quote=True + ) + return + + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + else: + await message.reply_to_message.reply_text( + "ɢᴇᴛ ᴛʜᴇ ᴀᴘɪ ғʀᴏᴍ https://www.remove.bg/b/background-removal-api ᴀɴᴅ ᴀᴅᴅ ɪɴ ᴄᴏɴғɪɢ ᴠᴀʀ", + quote=True, + disable_web_page_preview=True, + ) + except Exception as e: + print("removebg_white-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def removebg_sticker(client, message): + try: + if REM_BG_API_KEY != "": + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "nobgsticker.webp" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + + response = requests.post( + "https://api.remove.bg/v1.0/removebg", + files={"image_file": open(download_location, "rb")}, + data={"size": "auto"}, + headers={"X-Api-Key": REM_BG_API_KEY}, + ) + if response.status_code == 200: + with open(f"{edit_img_loc}", "wb") as out: + out.write(response.content) + else: + await message.reply_to_message.reply_text( + "ᴄʜᴇᴄᴋ ɪғ ʏᴏᴜʀ ᴀᴘɪ ɪs ᴄᴏʀʀᴇᴄᴛ", quote=True + ) + return + + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_sticker(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + else: + await message.reply_to_message.reply_text( + "ɢᴇᴛ ᴛʜᴇ ᴀᴘɪ ғʀᴏᴍ https://www.remove.bg/b/background-removal-api ᴀɴᴅ ᴀᴅᴅ ɪɴ ᴄᴏɴғɪɢ ᴠᴀʀ", + quote=True, + disable_web_page_preview=True, + ) + except Exception as e: + print("removebg_sticker-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return diff --git a/Exon/utils/resources/ImageEditor/edit_5.py b/Exon/utils/resources/ImageEditor/edit_5.py new file mode 100644 index 00000000..f7abf781 --- /dev/null +++ b/Exon/utils/resources/ImageEditor/edit_5.py @@ -0,0 +1,442 @@ +""" +MIT License + +Copyright (c) 2022 Aʙɪsʜɴᴏɪ + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import asyncio +import os +import shutil + + +async def normalglitch_1(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "normalglitch_1.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-o", edit_img_loc, download_location, "1"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normalglitch_1-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def normalglitch_2(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "normalglitch_2.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-o", edit_img_loc, download_location, "2"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normalglitch_2-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def normalglitch_3(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "normalglitch_3.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-o", edit_img_loc, download_location, "3"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normalglitch_3-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def normalglitch_4(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "normalglitch_4.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-o", edit_img_loc, download_location, "4"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normalglitch_4-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def normalglitch_5(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "normalglitch_5.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-o", edit_img_loc, download_location, "5"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("normalglitch_5-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def scanlineglitch_1(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "scanlineglitch_1.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-s", "-o", edit_img_loc, download_location, "1"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("scanlineglitch_1-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def scanlineglitch_2(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "scanlineglitch_2.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "Downloading image", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-s", "-o", edit_img_loc, download_location, "2"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("scanlineglitch_2-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def scanlineglitch_3(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "scanlineglitch_3.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-s", "-o", edit_img_loc, download_location, "3"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("scanlineglitch_3-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def scanlineglitch_4(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "scanlineglitch_4.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-s", "-o", edit_img_loc, download_location, "4"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("scanlineglitch_4-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return + + +async def scanlineglitch_5(client, message): + try: + userid = str(message.chat.id) + if not os.path.isdir(f"./DOWNLOADS/{userid}"): + os.makedirs(f"./DOWNLOADS/{userid}") + download_location = "./DOWNLOADS" + "/" + userid + "/" + userid + ".jpg" + edit_img_loc = "./DOWNLOADS" + "/" + userid + "/" + "scanlineglitch_5.jpg" + if not message.reply_to_message.empty: + msg = await message.reply_to_message.reply_text( + "ᴅᴏᴡɴʟᴏᴀᴅɪɴɢ ɪᴍᴀɢᴇ", quote=True + ) + await client.download_media( + message=message.reply_to_message, file_name=download_location + ) + await msg.edit("ᴘʀᴏᴄᴇssɪɴɢ ɪᴍᴀɢᴇ.....") + cd = ["glitch_this", "-c", "-s", "-o", edit_img_loc, download_location, "5"] + process = await asyncio.create_subprocess_exec( + *cd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE + ) + await process.communicate() + await message.reply_chat_action("upload_photo") + await message.reply_to_message.reply_photo(edit_img_loc, quote=True) + await msg.delete() + else: + await message.reply_text("ᴡʜʏ ᴅɪᴅ ʏᴏᴜ ᴅᴇʟᴇᴛᴇ ᴛʜᴀᴛ??") + try: + shutil.rmtree(f"./DOWNLOADS/{userid}") + except Exception: + pass + except Exception as e: + print("scanlineglitch_5-error - " + str(e)) + if "USER_IS_BLOCKED" in str(e): + return + try: + await message.reply_to_message.reply_text( + "sᴏᴍᴇᴛʜɪɴɢ ᴡᴇɴᴛ ᴡʀᴏɴɢ!", quote=True + ) + except Exception: + return diff --git a/Exon/utils/saavnhelp.py b/Exon/utils/saavnhelp.py new file mode 100644 index 00000000..7ea33988 --- /dev/null +++ b/Exon/utils/saavnhelp.py @@ -0,0 +1,36 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +def get_arg(message): + msg = message.text + msg = msg.replace(" ", "", 1) if msg[1] == " " else msg + split = msg[1:].replace("\n", " \n").split(" ") + if " ".join(split[1:]).strip() == "": + return "" + return " ".join(split[1:]) diff --git a/Exon/utils/tools.py b/Exon/utils/tools.py new file mode 100644 index 00000000..9eda0885 --- /dev/null +++ b/Exon/utils/tools.py @@ -0,0 +1,82 @@ +""" +MIT License + +Copyright (c) 2022 ABISHNOI + +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. +""" +# ""DEAR PRO PEOPLE, DON'T REMOVE & CHANGE THIS LINE +# TG :- @Abishnoi1M +# MY ALL BOTS :- Abishnoi_bots +# GITHUB :- KingAbishnoi "" + + +import hashlib +import re + + +async def md5(fname: str) -> str: + hash_md5 = hashlib.md5() + with open(fname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_md5.update(chunk) + return hash_md5.hexdigest() + + +def humanbytes(size: int) -> str: + if size is None or isinstance(size, str): + return "" + + power = 2**10 + raised_to_pow = 0 + dict_power_n = {0: "", 1: "Ki", 2: "Mi", 3: "Gi", 4: "Ti"} + while size > power: + size /= power + raised_to_pow += 1 + return str(round(size, 2)) + " " + dict_power_n[raised_to_pow] + "B" + + +def time_formatter(seconds: int) -> str: + minutes, seconds = divmod(seconds, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + tmp = ( + ((str(days) + " day(s), ") if days else "") + + ((str(hours) + " hour(s), ") if hours else "") + + ((str(minutes) + " minute(s), ") if minutes else "") + + ((str(seconds) + " second(s), ") if seconds else "") + ) + return tmp[:-2] + + +def human_to_bytes(size: str) -> int: + units = { + "M": 2**20, + "MB": 2**20, + "G": 2**30, + "GB": 2**30, + "T": 2**40, + "TB": 2**40, + } + + size = size.upper() + if not re.match(r" ", size): + size = re.sub(r"([KMGT])", r" \1", size) + number, unit = [string.strip() for string in size.split()] + return int(float(number) * units[unit]) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..3d7d7c75 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 ABISHNOI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Procfile b/Procfile new file mode 100644 index 00000000..4f53667e --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +worker: python3 -m Exon diff --git a/app.json b/app.json new file mode 100644 index 00000000..1410beae --- /dev/null +++ b/app.json @@ -0,0 +1,213 @@ +{ + "name": "EXON v1", + "description": "A Telegram group management bot.", + "logo": "https://telegra.ph/file/550a1524598af2578cbf3.jpg", + "keywords": [ + "telegram", + "anime", + "group", + "manager", + "Exon" + ], + "repository": "https://github.com/Abishnoi69/ExonRobot", + "addons": [ + { + "options": { + "version": "12" + }, + "plan": "heroku-postgresql" + } + ], + "env": { + "TOKEN": { + "description": "Your bot token. Can be obtained from https://telegram.dog/BotFather/", + "required": true, + "value": "YOUR BOT_TOKEN" + }, + "API_ID": { + "description": "Get API_ID from my.telegram.org, used for telethon based modules.", + "required": true, + "value": "13600724" + }, + "API_HASH": { + "description": "Get API_HASH from my.telegram.org, used for telethon based modules.", + "required": true, + "value": "ee59fd28d0d065c6b7d105082c6a0ba0" + }, + "APP_ID": { + "description": "Same as API_ID, BUT 2nd idi", + "required": true, + "value": "13600724" + }, + "APP_HASH": { + "description": "Same as API_HASH, but 2nd id", + "required": true, + "value": "ee59fd28d0d065c6b7d105082c6a0ba0" + }, + "DATABASE_URL": { + "description": "Your Postgres SQL DataBase URI, Get one from https://customer.elephantsql.com/login", + "required": true, + "value": "postgres://qszfsijv:y6sYqkEb8Z9lFGBmriG7AYjbSbgAJBVk@peanut.db.elephantsql.com/qszfsijv" + }, + "SQLALCHEMY_DATABASE_URI": { + "description": "Your Postgres SQL DataBase URI, Get one from https://customer.elephantsql.com/login (DATABASE_URL)", + "required": true, + "value": "postgres://qszfsijv:y6sYqkEb8Z9lFGBmriG7AYjbSbgAJBVk@peanut.db.elephantsql.com/qszfsijv" + }, + "DATABASE_URL2": { + "description": "Your one extra Mongo DataBase URI, Get one from mongodb.com", + "required": true, + "value": "mongodb+srv://EXONTESTMONGO:EXONTESTMONGO@cluster0.bviw7ic.mongodb.net/?retryWrites=true&w=majority" + }, + "REDIS_URL": { + "description": "Your Redis URL, Get one from redislabs.com", + "required": true, + "value": "redis://Madharjoot:GuKhao123_@redis-12276.c275.us-east-1-4.ec2.cloud.redislabs.com:12276/Madharjoot" + }, + "REM_BG_API_KEY": { + "description": "From:- https://www.remove.bg/", + "required": false, + "value": "LSdLgCceYz8vNqFgJVzrkDgR" + }, + "OWNER_ID": { + "description": "Your Telegram User ID as an integer.", + "required": true, + "value": "1452219013" + }, + "BOT_ID": { + "description": "Your Telegram Bot ID.", + "required": true, + "value": "5662485106" + }, + "OWNER_USERNAME": { + "description": "Your Telegram username without the @", + "value": "Abishnoi1M" + }, + "SUPPORT_CHAT": { + "description": "The Telegram Support Group Where Users of your Bot can Go and ask their Questions.", + "required": true, + "value": "AbishnoiMF" + }, + "UPDATES_CHANNEL": { + "description": "The Telegram News/Update Channel Where Users of your Bot can Go and check updates by you.", + "required": true, + "value": "Abishnoi_bots" + }, + "EVENT_LOGS": { + "description": "Event logs CHANNEL to note down important bot level events, recommend to make this public. ex: '-123456'", + "required": true, + "value": "-1001497222182" + }, + "JOIN_LOGGER": { + "description": "A CHANNEL where bot will print who added it to what group, useful during debugging or spam handling.", + "required": true, + "value": "-1001497222182" + }, + "TIME_API_KEY": { + "description": "Required for timezone information. Get yours from https://timezonedb.com/api", + "required": false, + "value": "5LB4TAKPEKZ0" + }, + "START_IMG": { + "description": "A Start img link", + "required": false, + "value": "https://telegra.ph/file/0191f2041ae33e11c1267.jpg" + }, + "DEV_USERS": { + "description": "Enter the IDs of the users who are the Developers of the Bot. If you are newbie and want help from us Itself, then keep the IDs as they are and add yours", + "required": false, + "value": "1452219013" + }, + "SPAMWATCH_API": { + "description": "Spamwatch API Token, Get one from @SpamWatchBot.", + "required": false, + "value": "AHT~6SSflemqFZa5tfkKFQeiLnJUwoowWYozC3SN2ZY_aSGh83~9pItAmM4Mi40E" + }, + "DRAGONS": { + "description": "A space separated list of user IDs who you want to assign as sudo users.", + "required": false, + "value": "1452219013" + }, + "STRICT_GBAN": { + "description": "Enforce gbans across new groups as well as old groups. When a gbanned user talks, he will be banned.", + "value": "True" + }, + "DEMONS": { + "description": "A space separated list of user IDs who can use Gban From Your Bot", + "required": false, + "value": "1452219013" + }, + "TIGERS": { + "description": "A space separated list of user IDs who can not be banned by your Bot", + "required": false, + "value": "1452219013" + }, + "WOLVES": { + "description": "A space separated list of user IDs who you want to assign as whitelisted - can't be banned with your bot.", + "required": false, + "value": "1452219013" + }, + "ENV": { + "description": "Setting this to ANYTHING will enable environment variables. Leave it as it is", + "value": "ANYTHING" + }, + "URL": { + "description": "The Heroku App URL :- https://<appname>.herokuapp.com/", + "required": false, + "value": "https://example69.herokuapp.com/" + }, + "GENIUS_API_TOKEN": { + "description": "Genius API Token get one from genius.com/api-client", + "required": false, + "value": "gIgMyTXuwJoY9VCPNwKdb_RUOA_9mCMmRlbrrdODmNvcpslww_2RIbbWOB8YdBW9" + }, + "DONATION_LINK": { + "description": "Optional: link where you would like to receive donations. If you are a noob, better leave it linking to paul", + "required": false, + "value": "https://t.me/Abishnoi1M" + }, + "MONGO_DB_URL": { + "description": "Your Mongo DB URI", + "required": true, + "value": "mongodb+srv://EXONTESTMONGO:EXONTESTMONGO@cluster0.bviw7ic.mongodb.net/?retryWrites=true&w=majority" + }, + "HEROKU_API_KEY": { + "description": "Your Heroku API Key from heroku profile", + "required": false, + "value": "" + }, + "HEROKU_APP_NAME": { + "description": "Your Heroku APP name", + "required": false, + "value": "" + }, + "INFOPIC": { + "description": "Don't change", + "required": true, + "value": "True" + }, + "ARQ_API_KEY": { + "description": "Get one @ARQRobot on Telegram", + "required": true, + "value": "SNEOSP-HQSCLP-BMVHJF-FQLQTR-ARQ" + }, + "ARQ_API_URL": { + "description": "Leave it as it is", + "required": true, + "value": "arq.hamker.dev" + }, + "ERROR_LOGS": { + "description": "The ID of the Group where the bot will spam with shitty errors and techy stuff", + "required": true, + "value": "-1001497222182" + } + }, + "buildpacks": [ + { + "url": "https://github.com/heroku/heroku-buildpack-python" + }, + { + "url": "https://github.com/jonathanong/heroku-buildpack-ffmpeg-latest" + } + ] +} diff --git a/config.py b/config.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/config.py @@ -0,0 +1 @@ + diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 00000000..8a956f41 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,5 @@ +build: + docker: + worker: Dockerfile +run: + worker: python3 -m Exon diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..9e357a09 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,105 @@ +aiofiles +aiogram +aiohttp[speedups] +aioredis +alphabet_detector +asyncio +beautifulsoup4==4.11.1 +better_profanity +bing_image_downloader +bleach +bs4 +cachetools +cloudscraper +countryinfo +cowpy +cryptg +cryptography +dateparser==1.1.1 +dnspython +emoji==1.7.0 +envparse +faker +feedparser +ffmpeg-python +fontTools +future +geopy +git+https://github.com/python-telegram-bot/ptbcontrib.git +gitpython +glitch_this +glitch_this +google-api-python-client +google-trans-new +google-trans-new +googletrans +gpytranslate +gtts +hachoir +heroku3 +hiredis +html-telegraph-poster +html2text +httpx +humanize +img2pdf +jikanpy +launchpadlib==1.10.17 +lxml +lyricsgenius +markdown +markdown2>=2.4.0 +motor<2.4.0,>=2.1.0 +multicolorcaptcha +nekos.py +nltk +nudepy +NumPy +odmantic +opencv-python-headless +pendulum +Pillow +pretty_errors +psutil +psycopg2-binary +PyDictionary==2.0.1 +pydub +pykeyboard +pymongo>=3.10 +pynewtonmath +pyrate-limiter +pyrogram==1.4.16 +python-arq +python-dotenv +python-rapidjson +python-telegram-bot==13.14 +pytimeparse +pytube +pytz +pyYAML>=5.1.2 +redis +regex +requests +requests_html +search_engine_parser +secureme +selenium +spamwatch +speedtest-cli +spongemock +SQLAlchemy==1.4.36 +telegraph +telethon==1.25.4 +textblob +tgcrypto +tswift +ujson +uvloop +wget +wikipedia +youtube_dl +youtube_search +youtube_search_python +yt-dlp +zalgo-text +#ǫ ʀᴇ sᴀʟᴇ ɢᴀʏ ᴋʏ ᴅᴇᴋ ʀᴀ ʜ ʏᴀ