# Moon-Userbot - telegram userbot # Copyright (C) 2020-present Moon Userbot Organization # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . from contextlib import suppress from pyrogram import Client, ContinuePropagation, filters from pyrogram.enums import ChatType from pyrogram.errors import ( ChatAdminRequired, RPCError, UserAdminInvalid, ) from pyrogram.raw import functions from pyrogram.types import ChatPermissions, Message from utils.db import db from utils.handlers import ( AntiChannelsHandler, AntiRaidHandler, BanHandler, DeleteHistoryHandler, DemoteHandler, KickDeletedAccountsHandler, KickHandler, MuteHandler, PromoteHandler, TimeMuteHandler, TimeMuteUsersHandler, TimeUnmuteHandler, UnbanHandler, UnmuteHandler, ) from utils.misc import modules_help, prefix from utils.scripts import format_exc, with_reply db_cache: dict = db.get_collection('core.ats') def update_cache(): db_cache.clear() db_cache.update(db.get_collection('core.ats')) @Client.on_message(filters.group & ~filters.me) async def admintool_handler(_, message: Message): if message.sender_chat and ( message.sender_chat.type == 'supergroup' or message.sender_chat.id == db_cache.get(f'linked{message.chat.id}', 0) ): raise ContinuePropagation if message.sender_chat and db_cache.get(f'antich{message.chat.id}', False): with suppress(RPCError): await message.delete() await message.chat.ban_member(message.sender_chat.id) tmuted_users = db_cache.get(f'c{message.chat.id}', []) if ( message.from_user and message.from_user.id in tmuted_users or message.sender_chat and message.sender_chat.id in tmuted_users ): with suppress(RPCError): await message.delete() if db_cache.get(f'antiraid{message.chat.id}', False): with suppress(RPCError): await message.delete() if message.from_user: await message.chat.ban_member(message.from_user.id) elif message.sender_chat: await message.chat.ban_member(message.sender_chat.id) if message.new_chat_members and db_cache.get(f'welcome_enabled{message.chat.id}', False): await message.reply( db_cache.get(f'welcome_text{message.chat.id}'), disable_web_page_preview=True, ) raise ContinuePropagation async def get_user_and_name(message): if message.reply_to_message.from_user: return ( message.reply_to_message.from_user.id, message.reply_to_message.from_user.first_name, ) if message.reply_to_message.sender_chat: return ( message.reply_to_message.sender_chat.id, message.reply_to_message.sender_chat.title, ) @Client.on_message(filters.command(['ban'], prefix) & filters.me) async def ban_command(client: Client, message: Message): handler = BanHandler(client, message) await handler.handle_ban() @Client.on_message(filters.command(['unban'], prefix) & filters.me) async def unban_command(client: Client, message: Message): handler = UnbanHandler(client, message) await handler.handle_unban() @Client.on_message(filters.command(['kick'], prefix) & filters.me) async def kick_command(client: Client, message: Message): handler = KickHandler(client, message) await handler.handle_kick() @Client.on_message(filters.command(['kickdel'], prefix) & filters.me) async def kickdel_cmd(client: Client, message: Message): handler = KickDeletedAccountsHandler(client, message) await handler.kick_deleted_accounts() @Client.on_message(filters.command(['tmute'], prefix) & filters.me) async def tmute_command(client: Client, message: Message): handler = TimeMuteHandler(client, message) await handler.handle_tmute() update_cache() @Client.on_message(filters.command(['tunmute'], prefix) & filters.me) async def tunmute_command(client: Client, message: Message): handler = TimeUnmuteHandler(client, message) await handler.handle_tunmute() update_cache() @Client.on_message(filters.command(['tmute_users'], prefix) & filters.me) async def tunmute_users_command(client: Client, message: Message): handler = TimeMuteUsersHandler(client, message) await handler.list_tmuted_users() @Client.on_message(filters.command(['unmute'], prefix) & filters.me) async def unmute_command(client: Client, message: Message): handler = UnmuteHandler(client, message) await handler.handle_unmute() @Client.on_message(filters.command(['mute'], prefix) & filters.me) async def mute_command(client: Client, message: Message): handler = MuteHandler(client, message) await handler.handle_mute() @Client.on_message(filters.command(['demote'], prefix) & filters.me) async def demote_command(client: Client, message: Message): handler = DemoteHandler(client, message) await handler.handle_demote() @Client.on_message(filters.command(['promote'], prefix) & filters.me) async def promote_command(client: Client, message: Message): handler = PromoteHandler(client, message) await handler.handle_promote() @Client.on_message(filters.command(['antich'], prefix)) async def anti_channels(client: Client, message: Message): handler = AntiChannelsHandler(client, message) await handler.handle_anti_channels() update_cache() @Client.on_message(filters.command(['delete_history', 'dh'], prefix)) async def delete_history(client: Client, message: Message): handler = DeleteHistoryHandler(client, message) await handler.handle_delete_history() @Client.on_message(filters.command(['report_spam', 'rs'], prefix)) @with_reply async def report_spam(client: Client, message: Message): try: channel = await client.resolve_peer(message.chat.id) user_id, name = await get_user_and_name(message) peer = await client.resolve_peer(user_id) await client.invoke( functions.channels.ReportSpam( channel=channel, participant=peer, id=[message.reply_to_message.id], ) ) except Exception as e: await message.edit(format_exc(e)) else: await message.edit(f'Message from {name} was reported') @Client.on_message(filters.command('pin', prefix) & filters.me) @with_reply async def pin(_, message: Message): try: await message.reply_to_message.pin() await message.edit('Pinned!') except Exception as e: await message.edit(format_exc(e)) @Client.on_message(filters.command('unpin', prefix) & filters.me) @with_reply async def unpin(_, message: Message): try: await message.reply_to_message.unpin() await message.edit('Unpinned!') except Exception as e: await message.edit(format_exc(e)) @Client.on_message(filters.command('ro', prefix) & filters.me) async def ro(client: Client, message: Message): if message.chat.type not in [ChatType.GROUP, ChatType.SUPERGROUP]: await message.edit('Invalid chat type') return try: perms = message.chat.permissions perms_list = [ perms.can_send_messages, perms.can_send_media_messages, perms.can_send_polls, perms.can_add_web_page_previews, perms.can_change_info, perms.can_invite_users, perms.can_pin_messages, ] db.set('core.ats', f'ro{message.chat.id}', perms_list) try: await client.set_chat_permissions(message.chat.id, ChatPermissions()) except (UserAdminInvalid, ChatAdminRequired): await message.edit('No rights') else: await message.edit(f'Read-only mode activated!\nTurn off with:{prefix}unro') except Exception as e: await message.edit(format_exc(e)) @Client.on_message(filters.command('unro', prefix) & filters.me) async def unro(client: Client, message: Message): if message.chat.type not in [ChatType.GROUP, ChatType.SUPERGROUP]: await message.edit('Invalid chat type') return try: perms_list = db.get( 'core.ats', f'ro{message.chat.id}', [True, True, False, False, False, False, False], ) common_perms = { 'can_send_messages': perms_list[0], 'can_send_media_messages': perms_list[1], 'can_send_polls': perms_list[2], 'can_add_web_page_previews': perms_list[3], 'can_change_info': perms_list[4], 'can_invite_users': perms_list[5], 'can_pin_messages': perms_list[6], } perms = ChatPermissions(**common_perms) try: await client.set_chat_permissions(message.chat.id, perms) except (UserAdminInvalid, ChatAdminRequired): await message.edit('No rights') else: await message.edit('Read-only mode disabled!') except Exception as e: await message.edit(format_exc(e)) @Client.on_message(filters.command('antiraid', prefix) & filters.me) async def antiraid(client: Client, message: Message): handler = AntiRaidHandler(client, message) await handler.handle_antiraid() update_cache() @Client.on_message(filters.command(['welcome', 'wc'], prefix) & filters.me) async def welcome(_, message: Message): if message.chat.type not in [ChatType.GROUP, ChatType.SUPERGROUP]: return await message.edit('Unsupported chat type') if len(message.command) > 1: text = message.text.split(maxsplit=1)[1] db.set('core.ats', f'welcome_enabled{message.chat.id}', True) db.set('core.ats', f'welcome_text{message.chat.id}', text) await message.edit(f'Welcome enabled in this chat\nText: {text}') else: db.set('core.ats', f'welcome_enabled{message.chat.id}', False) await message.edit('Welcome disabled in this chat') update_cache() modules_help['admintool'] = { 'ban [reply]/[username/id]* [reason] [report_spam] [delete_history]': 'ban user in chat', 'unban [reply]/[username/id]* [reason]': 'unban user in chat', 'kick [reply]/[userid]* [reason] [report_spam] [delete_history]': 'kick user out of chat', 'mute [reply]/[userid]* [reason] [1m]/[1h]/[1d]/[1w]': 'mute user in chat', 'unmute [reply]/[userid]* [reason]': 'unmute user in chat', 'promote [reply]/[userid]* [prefix]': 'promote user in chat', 'demote [reply]/[userid]* [reason]': 'demote user in chat', 'tmute [reply]/[username/id]* [reason]': 'delete all new messages from user in chat', 'tunmute [reply]/[username/id]* [reason]': 'stop deleting all messages from user in chat', 'tmute_users': 'list of tmuted (.tmute) users', 'antich [enable/disable]': 'turn on/off blocking channels in this chat', 'delete_history [reply]/[username/id]* [reason]': 'delete history from member in chat', 'report_spam [reply]*': 'report spam message in chat', 'pin [reply]*': 'Pin replied message', 'unpin [reply]*': 'Unpin replied message', 'ro': 'enable read-only mode', 'unro': 'disable read-only mode', 'antiraid [on|off]': 'when enabled, anyone who writes message will be blocked. Useful in raids. ' 'Running without arguments equals to toggling state', 'welcome [text]*': 'enable auto-welcome to new users in groups. Running without text equals to disable', 'kickdel': 'Kick all deleted accounts', }