Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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