Exemple #1
0
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 == 'Chat not found':
                    pass
                else:
                    LOGGER.exception("Error extracting user ID")

    return None
Exemple #2
0
async def report(c: Alita, m: Message):
    me = await c.get_me()

    if m.chat and m.reply_to_message and db.chat_should_report(m.chat.id):
        reported_user = m.reply_to_message.from_user
        chat_name = m.chat.title or m.chat.username
        admin_list = await c.get_chat_members(m.chat.id,
                                              filter="administrators")

        if m.from_user.id == reported_user.id:
            await m.reply_text(
                "Uh yeah, Sure sure...you don't need to report yourself!")
            return

        if reported_user.id == me.id:
            await m.reply_text("Nice try.")
            return

        if reported_user.id in SUPPORT_STAFF:
            await m.reply_text("Uh? You reporting whitelisted users?")
            return

        if m.chat.username and m.chat.type == "supergroup":

            reported = f"{mention_html(m.from_user.first_name, m.from_user.id)} reported {mention_html(reported_user.first_name, reported_user.id)} to the admins!"

            msg = (
                f"<b>⚠️ Report: </b>{html.escape(m.chat.title)}\n"
                f"<b> • Report by:</b> {mention_html(m.from_user.first_name, m.from_user.id)}(<code>{m.from_user.id}</code>)\n"
                f"<b> • Reported user:</b> {mention_html(reported_user.first_name, reported_user.id)} (<code>{reported_user.id}</code>)\n"
            )
            link = f'<b> • Reported message:</b> <a href="https://t.me/{m.chat.username}/{m.reply_to_message.message_id}">click here</a>'
            should_forward = False
            keyboard = [
                [
                    InlineKeyboardButton(
                        "➡ Message",
                        url=
                        f"https://t.me/{m.chat.username}/{m.reply_to_message.message_id}",
                    )
                ],
                [
                    InlineKeyboardButton(
                        "⚠ Kick",
                        callback_data=
                        f"report_{m.chat.id}=kick={reported_user.id}={reported_user.first_name}",
                    ),
                    InlineKeyboardButton(
                        "⛔️ Ban",
                        callback_data=
                        f"report_{m.chat.id}=banned={reported_user.id}={reported_user.first_name}",
                    ),
                ],
                [
                    InlineKeyboardButton(
                        "❎ Delete Message",
                        callback_data=
                        f"report_{m.chat.id}=delete={reported_user.id}={m.reply_to_message.message_id}",
                    )
                ],
            ]
            reply_markup = InlineKeyboardMarkup(keyboard)
        else:
            reported = f"{mention_html(m.from_user.first_name, m.from_user.id)} reported {mention_html(reported_user.first_name, reported_user.id)} to the admins!"

            msg = f'{mention_html(m.from_user.first_name, m.from_user.id)} is calling for admins in "{html.escape(chat_name)}"!'
            link = ""
            should_forward = True

        for admin in admin_list:
            if admin.user.is_bot:  # can't message bots
                continue

            if db.user_should_report(admin.user.id):
                try:
                    if not m.chat.type == "supergroup":
                        await c.send_message(admin.user.id, msg + link)

                        if should_forward:
                            await m.reply_to_message.forward(admin.user.id)

                            if (
                                    len(m.text.split()) > 1
                            ):  # If user is giving a reason, send his message too
                                await m.reply_to_message.forward(admin.user.id)
                    if not m.chat.username:
                        await c.send_message(admin.user.id, msg + link)

                        if should_forward:
                            await m.reply_to_message.forward(admin.user.id)

                            if (
                                    len(m.text.split()) > 1
                            ):  # If user is giving a reason, send his message too
                                await m.forward(admin.user.id)

                    if m.chat.username and m.chat.type == "supergroup":
                        await c.send_message(admin.user.id,
                                             msg + link,
                                             reply_markup=reply_markup)

                        if should_forward:
                            await m.reply_to_message.forward(admin.user.id)

                            if (
                                    len(m.text.split()) > 1
                            ):  # If user is giving a reason, send his message too
                                await m.forward(admin.user.id)

                except Unauthorized:
                    pass
                except BadRequest:
                    LOGGER.exception("Exception while reporting user")

        await m.reply_to_message.reply_text(
            f"{mention_html(m.from_user.first_name, m.from_user.id)} reported the message to the admins."
        )
        return
    return
Exemple #3
0
def extract_user_and_text(message: Message,
                          args: List[str]) -> (Optional[int], Optional[str]):
    chat = message.chat
    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]))
    if len(entities) > 0:
        ent = entities[0]
    else:
        ent = 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(tld(chat.id, 'helpers_user_not_in_db'))
            return None, None

        else:
            user_id = user_id
            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"):
            message.reply_text(tld(chat.id, 'helpers_user_not_in_db'))
        else:
            LOGGER.exception("Exception %s on user %s", excp.message, user_id)

        return None, None

    return user_id, text