async def mute(event): user, chat = await fetch_user(event, get_chat=True) if not user: return if not chat: await event.edit(msgRep.FAIL_CHAT) return if type(chat) is User: await event.edit(msgRep.NO_GROUP_ARGS) return if hasattr(chat, "broadcast") and chat.broadcast: await event.edit(msgRep.NOT_MUTE_SUB_CHAN) return if user.is_self: await event.edit(msgRep.CANNOT_MUTE_SELF) return remote = isRemoteCMD(event, chat.id) admin_perms = chat.admin_rights if hasattr(chat, "admin_rights") else None if admin_perms and not admin_perms.ban_users: await event.edit(msgRep.NO_BAN_PRIV) return try: mute_perms = ChatBannedRights(until_date=None, send_messages=True, change_info=True, invite_users=True, pin_messages=True) await event.client(EditBannedRequest(chat.id, user.id, mute_perms)) name = (f"[{user.first_name}](tg://user?id={user.id})" if user.first_name else msgRep.DELETED_ACCOUNT) if remote: await event.edit( msgRep.MUTE_SUCCESS_REMOTE.format(name, chat.title)) else: await event.edit(msgRep.MUTE_SUCCESS.format(name)) if LOGGING: await event_log( event, "MUTE", user_name=user.first_name, username=user.username, user_id=user.id, chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=format_chat_id(chat) if remote else event.chat_id) except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) except Exception as e: log.warning(e) await event.edit(msgRep.MUTE_FAILED) return
async def countmessages(event): user, chat = await fetch_user(event, get_chat=True) if not user: return if not chat: await event.edit(msgRep.FAIL_CHAT) return remote = isRemoteCMD(event, chat.id) try: msg_info = await event.client( SearchRequest( peer=chat.id, q="", # search for any message filter=InputMessagesFilterEmpty(), min_date=None, max_date=None, add_offset=0, offset_id=0, limit=0, max_id=0, min_id=0, hash=0, from_id=user.id)) except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) return except InputUserDeactivatedError: await event.edit(msgRep.CANNOT_COUNT_DEL) return except SearchQueryEmptyError as sqee: log.warning(sqee) await event.edit(msgRep.CANNOT_COUNT_FWD) return except Exception as e: log.warning(e) await event.edit(msgRep.FAIL_COUNT_MSG) return user_link = ("@" + user.username if user.username else f"[{user.first_name}](tg://user?id={user.id})") if hasattr(msg_info, "count"): if remote: await event.edit( msgRep.USER_HAS_SENT_REMOTE.format(user_link, msg_info.count, chat.title)) else: await event.edit( msgRep.USER_HAS_SENT.format(user_link, msg_info.count)) else: if remote: await event.edit(msgRep.CANNOT_COUNT_MSG_REMOTE.format(chat.title)) else: await event.edit(msgRep.CANNOT_COUNT_MSG) return
async def ban(event): user, chat = await fetch_user(event, get_chat=True) if not user: return if not chat: await event.edit(msgRep.FAIL_CHAT) return if type(chat) is User: await event.edit(msgRep.NO_GROUP_CHAN_ARGS) return if user.is_self: await event.edit(msgRep.CANNOT_BAN_SELF) return remote = isRemoteCMD(event, chat.id) admin_perms = chat.admin_rights if hasattr(chat, "admin_rights") else None if admin_perms and not admin_perms.ban_users: await event.edit(msgRep.NO_BAN_PRIV) return try: # if view_messages is True then all ban permissions will # be set to True too ban_perms = ChatBannedRights(until_date=None, view_messages=True) await event.client(EditBannedRequest(chat.id, user.id, ban_perms)) name = (f"[{user.first_name}](tg://user?id={user.id})" if user.first_name else msgRep.DELETED_ACCOUNT) if remote: await event.edit(msgRep.BAN_SUCCESS_REMOTE.format( name, chat.title)) else: await event.edit(msgRep.BAN_SUCCESS.format(name)) if LOGGING: await event_log( event, "BAN", user_name=user.first_name, username=user.username, user_id=user.id, chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=format_chat_id(chat) if remote else event.chat_id) except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) except UserAdminInvalidError: await event.edit(msgRep.CANNOT_BAN_ADMIN) except Exception as e: log.warning(e) await event.edit(msgRep.BAN_FAILED) return
async def kick(event): user, chat = await fetch_entity(event, get_chat=True) if not user: return if not chat: await event.edit(msgRep.FAIL_CHAT) return if isinstance(chat, User): await event.edit(msgRep.NO_GROUP_CHAN_ARGS) return remote = isRemoteCMD(event, chat.id) admin_perms = chat.admin_rights if hasattr(chat, "admin_rights") else None if admin_perms and not admin_perms.ban_users: await event.edit(msgRep.NO_BAN_PRIV) return if not isinstance(user, User): await event.edit(msgRep.KICK_PERSONS_ONLY) return if user.is_self: await event.edit(msgRep.CANNOT_KICK_SELF) return try: await event.client.kick_participant(chat.id, user.id) name = (f"[{user.first_name}](tg://user?id={user.id})" if user.first_name else msgRep.DELETED_ACCOUNT) if remote: await event.edit( msgRep.KICK_SUCCESS_REMOTE.format(name, chat.title)) else: await event.edit(msgRep.KICK_SUCCESS.format(name)) if LOGGING: await event_log( event, "KICK", user_name=user.first_name, username=user.username, user_id=user.id, chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=format_chat_id(chat) if remote else event.chat_id) except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) except Exception as e: log.warning(e) await event.edit(msgRep.KICK_FAILED) return
async def delaccs(event): arg_from_event = event.pattern_match.group(1) if arg_from_event: is_id = False try: arg_from_event = int(arg_from_event) is_id = True except: pass try: chat = await event.client.get_entity(arg_from_event) except: if is_id: await event.edit(msgRep.INVALID_ID) else: await event.edit(msgRep.INVALID_USERNAME) return else: chat = await event.get_chat() if type(chat) is User: await event.edit(msgRep.NO_GROUP_CHAN) return deleted_accounts, rem_del_accounts = (0, ) * 2 await event.edit(msgRep.TRY_DEL_ACCOUNTS) async for member in event.client.iter_participants(chat.id): if member.deleted: deleted_accounts += 1 if chat.creator or (chat.admin_rights and chat.admin_rights.ban_users): try: await event.client.kick_participant(chat.id, member.id) await sleep(0.2) rem_del_accounts += 1 except: pass remote = isRemoteCMD(event, chat.id) if deleted_accounts > 0 and not rem_del_accounts: if remote: await event.edit( msgRep.DEL_ACCS_COUNT_REMOTE.format(deleted_accounts, chat.title)) else: await event.edit(msgRep.DEL_ACCS_COUNT.format(deleted_accounts)) elif rem_del_accounts > 0 and rem_del_accounts <= deleted_accounts: if not (deleted_accounts - rem_del_accounts) == 0: if remote: rem_accs_text = msgRep.REM_DEL_ACCS_COUNT_REMOTE.format( rem_del_accounts, chat.title) else: rem_accs_text = msgRep.REM_DEL_ACCS_COUNT.format( rem_del_accounts) rem_accs_excp_text = msgRep.REM_DEL_ACCS_COUNT_EXCP.format( deleted_accounts - rem_del_accounts) await event.edit(f"{rem_accs_text}`. `{rem_accs_excp_text}") else: if remote: await event.edit( msgRep.REM_DEL_ACCS_COUNT_REMOTE.format( rem_del_accounts, chat.title)) else: await event.edit( msgRep.REM_DEL_ACCS_COUNT.format(rem_del_accounts)) if LOGGING: await event_log( event, "DELACCS", chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=format_chat_id(chat) if remote else event.chat_id) else: if remote: await event.edit(msgRep.NO_DEL_ACCOUNTS_REMOTE.format(chat.title)) else: await event.edit(msgRep.NO_DEL_ACCOUNTS) return
async def ban(event): entity, chat = await fetch_entity(event, full_obj=True, get_chat=True) if not entity: return if not chat: await event.edit(msgRep.FAIL_CHAT) return if isinstance(chat, User): await event.edit(msgRep.NO_GROUP_CHAN_ARGS) return remote = isRemoteCMD(event, chat.id) admin_perms = chat.admin_rights if hasattr(chat, "admin_rights") else None if admin_perms and not admin_perms.ban_users: await event.edit(msgRep.NO_BAN_PRIV) return if isinstance(entity, ChatFull): if entity.full_chat.linked_chat_id: if entity.full_chat.linked_chat_id == chat.id: await event.edit(msgRep.CANNOT_BAN_LINKED.format(chat.title)) return entity_id = entity.full_chat.id chatinfo = None for c in entity.chats: if c.id == entity_id: chatinfo = c break if chatinfo.creator: # careful, you can expose yourself ;) await event.edit(msgRep.CANNOT_BAN_CHANNEL_SELF) return if entity_id == chat.id: await event.edit(msgRep.CANNOT_BAN_CHANNEL_ITSELF) return name = (f"[{chatinfo.title}](https://t.me/{chatinfo.username})" if chatinfo.username else chatinfo.title) entity_id = f"-100{entity_id}" entity_id = int(entity_id) elif isinstance(entity, UserFull): if entity.user.is_self: await event.edit(msgRep.CANNOT_BAN_SELF) return entity_id = entity.user.id name = (f"[{entity.user.first_name}](tg://user?id={entity_id})" if entity.user.first_name else msgRep.DELETED_ACCOUNT) else: await event.edit(msgRep.UNKNOWN_THING) log.warning("Ban failed: target is not a channel or an user") return try: # if view_messages is True then all ban permissions will # be set to True too ban_perms = ChatBannedRights(until_date=None, view_messages=True) await event.client(EditBannedRequest(chat.id, entity_id, ban_perms)) if remote: await event.edit(msgRep.BAN_SUCCESS_REMOTE.format( name, chat.title)) else: await event.edit(msgRep.BAN_SUCCESS.format(name)) if LOGGING: if isinstance(entity, UserFull): entity_username = entity.user.username else: entity_username = chatinfo.username await event_log( event, "BAN", user_name=name, username=entity_username, user_id=entity_id, chat_title=chat.title, chat_link=chat.username if hasattr(chat, "username") else None, chat_id=format_chat_id(chat) if remote else event.chat_id) except ChatAdminRequiredError: await event.edit(msgRep.NO_ADMIN) except UserAdminInvalidError: await event.edit(msgRep.CANNOT_BAN_ADMIN) except Exception as e: log.warning(e) await event.edit(msgRep.BAN_FAILED) return