Esempio n. 1
0
def help_button(bot: Bot, update: Update):
    query = update.callback_query
    chat = update.effective_chat  # type: Optional[Chat]
    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)
    try:
        if mod_match:
            module = mod_match.group(1)
            mod_name = tld(chat.id, HELPABLE[module].__mod_name__)
            help_txt = tld_help(chat.id, HELPABLE[module].__mod_name__)

            if help_txt == False:
                help_txt = HELPABLE[module].__help__

            text = tld(chat.id,
                       "Here is the help for the *{}* module:\n{}").format(
                           mod_name, help_txt)
            query.message.reply_text(text=text,
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup([[
                                         InlineKeyboardButton(
                                             text=tld(chat.id, "Back"),
                                             callback_data="help_back")
                                     ]]))

        elif prev_match:
            curr_page = int(prev_match.group(1))
            query.message.reply_text(tld(chat.id, "send-help").format(
                dispatcher.bot.first_name, "" if not ALLOW_EXCL else tld(
                    chat.id,
                    "\nAll commands can either be used with `/` or `!`.\n")),
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(
                                             chat.id, curr_page - 1, HELPABLE,
                                             "help")))

        elif next_match:
            next_page = int(next_match.group(1))
            query.message.reply_text(tld(chat.id, "send-help").format(
                dispatcher.bot.first_name, "" if not ALLOW_EXCL else tld(
                    chat.id,
                    "\nAll commands can either be used with `/` or `!`.\n")),
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(
                                             chat.id, next_page + 1, HELPABLE,
                                             "help")))

        elif back_match:
            query.message.reply_text(text=tld(chat.id, "send-help").format(
                dispatcher.bot.first_name, "" if not ALLOW_EXCL else tld(
                    chat.id,
                    "\nAll commands can either be used with `/` or `!`.\n")),
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(
                                             chat.id, 0, HELPABLE, "help")))

        # ensure no spinny white circle
        bot.answer_callback_query(query.id)
        query.message.delete()
    except BadRequest as excp:
        if excp.message == "Message is not modified":
            pass
        elif excp.message == "Query_id_invalid":
            pass
        elif excp.message == "Message can't be deleted":
            pass
        else:
            LOGGER.exception("Exception in help buttons. %s", str(query.data))
Esempio n. 2
0
def import_data(bot: Bot, update):
    msg = update.effective_message  # type: Optional[Message]
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    # TODO: allow uploading doc with command, not just as reply
    # only work with a doc

    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":
            update.effective_message.reply_text(
                "This command can only be runned on group, not PM.")
            return ""

        chat = update.effective_chat
        chat_id = update.effective_chat.id
        chat_name = update.effective_message.chat.title

    if msg.reply_to_message and msg.reply_to_message.document:
        try:
            file_info = bot.get_file(msg.reply_to_message.document.file_id)
        except BadRequest:
            msg.reply_text(
                "Try downloading and uploading the file yourself again, This one seem broken!"
            )
            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(
                "There are more than one group in this file and the chat.id is not same! How am i supposed to import it?"
            )
            return

        # Check if backup is this chat
        try:
            if data.get(str(chat.id)) == None:
                if conn:
                    text = "Backup comes from another chat, I can't return another chat to chat *{}*".format(
                        chat_name)
                else:
                    text = "Backup comes from another chat, I can't return another chat to this chat"
                return msg.reply_text(text, parse_mode="markdown")
        except:
            return msg.reply_text(
                "There is problem while importing the data! Please ask in @HarukaAyaGroup about why this happened."
            )
        # Check if backup is from self
        try:
            if str(bot.id) != str(data[str(chat.id)]['bot']):
                return msg.reply_text(
                    "Backup from another bot that is not suggested might cause the problem, documents, photos, videos, audios, records might not work as it should be. However, You can still request a feature regarding this in @HarukaAyaGroup !"
                )
        except:
            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(
                "An error occurred while recovering your data. The process failed. If you experience a problem with this, please ask in @HarukaAyaGroup . My owner and community will be happy to help. Also, bugs report makes me even better!\nThank you!"
            )

            LOGGER.exception("Imprt for the chat %s with the name %s failed.",
                             str(chat.id), str(chat.title))
            return

        # TODO: some of that link logic
        # NOTE: consider default permissions stuff?
        if conn:

            text = "Backup fully restored on *{}*.".format(chat_name)
        else:
            text = "Backup fully restored"
        msg.reply_text(text, parse_mode="markdown")
Esempio n. 3
0
def error_callback(bot, update, error):
    try:
        raise error
    except Unauthorized:
        LOGGER.warning("NO NONO1")
        LOGGER.warning(error)
        # remove update.message.chat_id from conversation list
    except BadRequest:
        LOGGER.warning("NO NONO2")
        LOGGER.warning("BadRequest caught")
        LOGGER.warning(error)

        # handle malformed requests - read more below!
    except TimedOut:
        LOGGER.warning("NO NONO3")
        # handle slow connection problems
    except NetworkError:
        LOGGER.warning("NO NONO4")
        # handle other connection problems
    except ChatMigrated as err:
        LOGGER.warning("NO NONO5")
        LOGGER.warning(err)
        # the chat_id of a group has changed, use e.new_chat_id instead
    except TelegramError:
        LOGGER.warning(error)
Esempio n. 4
0
def reply_filter(bot: Bot, update: Update):
    chat = update.effective_chat
    message = update.effective_message

    if 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.is_sticker:
                message.reply_sticker(filt.reply)
            elif filt.is_document:
                try:
                    message.reply_document(filt.reply)
                except Exception:
                    print("L")
            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:
                try:
                    message.reply_video(filt.reply)
                except Exception:
                    print("Nut")
            elif filt.has_markdown:
                buttons = sql.get_buttons(chat.id, filt.keyword)
                keyb = build_keyboard(buttons)
                keyboard = InlineKeyboardMarkup(keyb)

                try:
                    message.reply_text(filt.reply,
                                       parse_mode=ParseMode.MARKDOWN,
                                       disable_web_page_preview=True,
                                       reply_markup=keyboard)
                except BadRequest as excp:
                    if excp.message == "Unsupported url protocol":
                        message.reply_text(
                            tld(chat.id, "cust_filters_err_protocol"))
                    elif excp.message == "Reply message not found":
                        bot.send_message(chat.id,
                                         filt.reply,
                                         parse_mode=ParseMode.MARKDOWN,
                                         disable_web_page_preview=True,
                                         reply_markup=keyboard)
                    else:
                        try:
                            message.reply_text(
                                tld(chat.id, "cust_filters_err_badformat"))
                            LOGGER.warning("Message %s could not be parsed",
                                           str(filt.reply))
                            LOGGER.exception(
                                "Could not parse filter %s in chat %s",
                                str(filt.keyword), str(chat.id))
                        except Exception:
                            print("Nut")

            else:
                # LEGACY - all new filters will have has_markdown set to True.
                message.reply_text(filt.reply)
            break
Esempio n. 5
0
def import_data(bot: Bot, update):
    msg = update.effective_message  # type: Optional[Message]
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    # TODO: allow uploading doc with command, not just as reply
    # only work with a doc
    spam = spamfilters(update.effective_message.text,
                       update.effective_message.from_user.id,
                       update.effective_chat.id, update.effective_message)
    if spam == True:
        return

    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,
                tld(update.effective_message,
                    "You can use this command in group and not in PM"))
            return ""
        chat = update.effective_chat
        chat_id = update.effective_chat.id
        chat_name = update.effective_message.chat.title

    if msg.reply_to_message and msg.reply_to_message.document:
        filetype = msg.reply_to_message.document.file_name
        if filetype.split('.')[-1] not in ("backup", "json", "txt"):
            send_message(update.effective_message,
                         tld(update.effective_message, "Invalid backup file!"))
            return
        try:
            file_info = bot.get_file(msg.reply_to_message.document.file_id)
        except BadRequest:
            send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "Try downloading and re-uploading the file as yourself before importing - this one seems broken!"
                ))
            return

        with BytesIO() as file:
            file_info.download(out=file)
            file.seek(0)
            data = json.load(file)

        try:
            # If backup is from Emilia
            if data.get('bot_base') == "Kanna":
                imp_antiflood = False
                imp_blacklist = False
                imp_blacklist_count = 0

                imp_disabled_count = 0
                imp_filters_count = 0

                imp_locks = False
                imp_notes = 0
                imp_report = False
                imp_rules = False

                NOT_IMPORTED = "This cannot be imported because from other bot."
                NOT_IMPORTED_INT = 0
                # If backup is from this bot, import all files
                if data.get('bot_id') == bot.id:
                    is_self = True
                else:
                    is_self = False
                # Import antiflood
                if data.get('antiflood'):
                    imp_antiflood = True
                    flood_limit = data['antiflood'].get('flood_limit')
                    flood_mode = data['antiflood'].get('flood_mode')
                    flood_duration = data['antiflood'].get('flood_duration')

                    # Add to db
                    antifloodsql.set_flood(chat_id, int(flood_limit))
                    antifloodsql.set_flood_strength(chat_id, flood_mode,
                                                    flood_duration)

                # Import blacklist
                if data.get('blacklists'):
                    imp_blacklist = True
                    blacklist_mode = data['blacklists'].get('blacklist_mode')
                    blacklist_duration = data['blacklists'].get(
                        'blacklist_duration')
                    blacklisted = data['blacklists'].get('blacklists')

                    # Add to db
                    blacklistsql.set_blacklist_strength(
                        chat_id, blacklist_mode, blacklist_duration)
                    if blacklisted:
                        for x in blacklisted:
                            blacklistsql.add_to_blacklist(chat_id, x.lower())
                            imp_blacklist_count += 1

                # Import blacklist sticker

                # Import disabled
                if data.get('disabled'):
                    candisable = disabledsql.get_disableable()
                    if data['disabled'].get('disabled'):
                        for listdisabled in data['disabled'].get('disabled'):
                            if listdisabled in candisable:
                                disabledsql.disable_command(
                                    chat_id, listdisabled)
                                imp_disabled_count += 1

                # Import filters
                if data.get('filters'):
                    NOT_IMPORTED += "\n\nFilters:\n"
                    for x in data['filters'].get('filters'):
                        # If from self, import all
                        if is_self:
                            is_sticker = False
                            is_document = False
                            is_image = False
                            is_audio = False
                            is_voice = False
                            is_video = False
                            has_markdown = False
                            universal = False
                            if x['type'] == 1:
                                is_sticker = True
                            elif x['type'] == 2:
                                is_document = True
                            elif x['type'] == 3:
                                is_image = True
                            elif x['type'] == 4:
                                is_audio = True
                            elif x['type'] == 5:
                                is_voice = True
                            elif x['type'] == 6:
                                is_video = True
                            elif x['type'] == 0:
                                has_markdown = True
                            note_data, buttons = button_markdown_parser(
                                x['reply'], entities=0)
                            filtersql.add_filter(chat_id, x['name'], note_data,
                                                 is_sticker, is_document,
                                                 is_image, is_audio, is_voice,
                                                 is_video, buttons)
                            imp_filters_count += 1
                        else:
                            if x['has_markdown']:
                                note_data, buttons = button_markdown_parser(
                                    x['reply'], entities=0)
                                filtersql.add_filter(chat_id, x['name'],
                                                     note_data, False, False,
                                                     False, False, False,
                                                     False, buttons)
                                imp_filters_count += 1
                            else:
                                NOT_IMPORTED += "- {}\n".format(x['name'])
                                NOT_IMPORTED_INT += 1

                # Import greetings

                # Import Locks
                if data.get('locks'):
                    if data['locks'].get('lock_warn'):
                        locksql.set_lockconf(chat_id, True)
                    else:
                        locksql.set_lockconf(chat_id, False)
                    if data['locks'].get('locks'):
                        for x in list(data['locks'].get('locks')):
                            if x in LOCK_TYPES:
                                is_locked = data['locks']['locks'].get('x')
                                locksql.update_lock(chat_id,
                                                    x,
                                                    locked=is_locked)
                                imp_locks = True
                            if x in RESTRICTION_TYPES:
                                is_locked = data['locks']['locks'].get('x')
                                locksql.update_restriction(chat_id,
                                                           x,
                                                           locked=is_locked)
                                imp_locks = True

                # Import notes
                if data.get('notes'):
                    allnotes = data['notes']
                    NOT_IMPORTED += "\n\nNotes:\n"
                    for x in allnotes:
                        # If from self, import all
                        if is_self:
                            note_data, buttons = button_markdown_parser(
                                x['note_data'], entities=0)
                            note_name = x['note_tag']
                            note_file = None
                            note_type = x['note_type']
                            if x['note_file']:
                                note_file = x['note_file']
                            if note_type == 0:
                                note_type = Types.TEXT
                            elif note_type == 1:
                                note_type = Types.BUTTON_TEXT
                            elif note_type == 2:
                                note_type = Types.STICKER
                            elif note_type == 3:
                                note_type = Types.DOCUMENT
                            elif note_type == 4:
                                note_type = Types.PHOTO
                            elif note_type == 5:
                                note_type = Types.AUDIO
                            elif note_type == 6:
                                note_type = Types.VOICE
                            elif note_type == 7:
                                note_type = Types.VIDEO
                            elif note_type == 8:
                                note_type = Types.VIDEO_NOTE
                            else:
                                note_type = None
                            if note_type <= 8:
                                notesql.add_note_to_db(chat_id, note_name,
                                                       note_data, note_type,
                                                       buttons, note_file)
                                imp_notes += 1
                        else:
                            # If this text
                            if x['note_type'] == 0:
                                note_data, buttons = button_markdown_parser(
                                    x['text'].replace("\\", ""), entities=0)
                                note_name = x['name']
                                notesql.add_note_to_db(chat_id, note_name,
                                                       note_data, Types.TEXT,
                                                       buttons, None)
                                imp_notes += 1
                            else:
                                NOT_IMPORTED += "- {}\n".format(x['name'])
                                NOT_IMPORTED_INT += 1

                # Import reports
                if data.get('report'):
                    reporting = data['report'].get('report')
                    reportsql.set_chat_setting(chat_id, bool(reporting))
                    imp_report = True

                # Import rules
                if data.get('rules'):
                    contrules = data['rules'].get('rules')
                    if contrules:
                        rulessql.set_rules(chat_id, contrules)
                        imp_rules = True

                # Import warn config

                if conn:
                    text = tld(
                        update.effective_message,
                        "The backup is fully restored at * {} *. Welcome back! 😀"
                    ).format(chat_name)
                else:
                    text = tld(
                        update.effective_message,
                        "The backup is fully restored. Congratulations welcome back! 😀"
                    ).format(chat_name)
                text += tld(update.effective_message, "\n\nWhat I return:\n")
                if imp_antiflood:
                    text += tld(update.effective_message,
                                "- Settings Antiflood\n")
                if imp_blacklist:
                    text += tld(update.effective_message,
                                "- Settings Blacklist\n")
                if imp_blacklist_count:
                    text += tld(
                        update.effective_message,
                        "- {} blacklists\n").format(imp_blacklist_count)
                if imp_disabled_count:
                    text += tld(
                        update.effective_message,
                        "- {} cmd disabled\n").format(imp_disabled_count)
                if imp_filters_count:
                    text += tld(update.effective_message,
                                "- {} filters\n").format(imp_filters_count)

                if imp_locks:
                    text += tld(update.effective_message, "- Lockup\n")
                if imp_notes:
                    text += tld(update.effective_message,
                                "- {} a note\n").format(imp_notes)
                if imp_report:
                    text += tld(update.effective_message,
                                "- Reporting arrangements\n")
                if imp_rules:
                    text += tld(update.effective_message,
                                "- Order regulations group\n")

                try:
                    send_message(update.effective_message,
                                 text,
                                 parse_mode="markdown")
                except BadRequest:
                    send_message(update.effective_message,
                                 text,
                                 parse_mode="markdown",
                                 quote=False)
                if NOT_IMPORTED_INT:
                    f = open("{}-notimported.txt".format(chat_id), "w")
                    f.write(str(NOT_IMPORTED))
                    f.close()
                    bot.sendDocument(
                        chat_id,
                        document=open('{}-notimported.txt'.format(chat_id),
                                      'rb'),
                        caption=tl(update.effective_message,
                                   "*Data yang tidak dapat di import*"),
                        timeout=360,
                        parse_mode=ParseMode.MARKDOWN)
                    os.remove("{}-notimported.txt".format(chat_id))
                return
        except Exception as err:
            send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "An error occured in importing backup.Report it in @LucySupportChat"
                ),
                parse_mode="markdown")
            LOGGER.exception("An error when importing from Haruka base!")
            return

        try:
            # If backup is from rose
            # doing manual lol
            if data.get('bot_id') == 609517172:
                imp_antiflood = False
                imp_blacklist = False
                imp_blacklist_count = 0
                imp_disabled_count = 0
                imp_filters_count = 0

                imp_notes = 0
                imp_report = False
                imp_rules = False

                NOT_IMPORTED = "This cannot be imported because from other bot."
                NOT_IMPORTED_INT = 0
                if data.get('data'):
                    # Import antiflood
                    if data['data'].get('antiflood'):
                        floodlimit = data['data']['antiflood'].get(
                            'flood_limit')
                        action = data['data']['antiflood'].get('action')
                        actionduration = data['data']['antiflood'].get(
                            'action_duration')
                        act_dur = make_time(int(actionduration))
                        antifloodsql.set_flood(chat_id, int(floodlimit))
                        if action == "ban":
                            antifloodsql.set_flood_strength(
                                chat_id, 1, str(act_dur))
                            imp_antiflood = True
                        elif action == "kick":
                            antifloodsql.set_flood_strength(
                                chat_id, 2, str(act_dur))
                            imp_antiflood = True
                        elif action == "mute":
                            antifloodsql.set_flood_strength(
                                chat_id, 3, str(act_dur))
                            imp_antiflood = True
                    # Import blacklist
                    if data['data'].get('blacklists'):
                        action = data['data']['blacklists'].get('action')
                        actionduration = data['data']['blacklists'].get(
                            'action_duration')
                        act_dur = make_time(int(actionduration))
                        strengthdone = False
                        if action == "del":
                            strengthdone = True
                            blacklistsql.set_blacklist_strength(
                                chat_id, 1, str(act_dur))
                            imp_blacklist = True
                        elif action == "warn":
                            strengthdone = True
                            blacklistsql.set_blacklist_strength(
                                chat_id, 2, str(act_dur))
                            imp_blacklist = True
                        elif action == "mute":
                            strengthdone = True
                            blacklistsql.set_blacklist_strength(
                                chat_id, 3, str(act_dur))
                            imp_blacklist = True
                        elif action == "kick":
                            strengthdone = True
                            blacklistsql.set_blacklist_strength(
                                chat_id, 4, str(act_dur))
                            imp_blacklist = True
                        elif action == "ban":
                            strengthdone = True
                            blacklistsql.set_blacklist_strength(
                                chat_id, 5, str(act_dur))
                            imp_blacklist = True
                        else:
                            if not strengthdone:
                                action = data['data']['blacklists'].get(
                                    'should_delete')
                                if action:
                                    blacklistsql.set_blacklist_strength(
                                        chat_id, 1, "0")
                                    imp_blacklist = True
                        blacklisted = data['data']['blacklists'].get('filters')
                        if blacklisted:
                            for x in blacklisted:
                                blacklistsql.add_to_blacklist(
                                    chat_id, x['name'].lower())
                                imp_blacklist_count += 1
                    # Import disabled
                    if data['data'].get('disabled'):
                        if data['data']['disabled'].get('disabled'):
                            candisable = disabledsql.get_disableable()
                            for listdisabled in data['data']['disabled'].get(
                                    'disabled'):
                                if listdisabled in candisable:
                                    disabledsql.disable_command(
                                        chat_id, listdisabled)
                                    imp_disabled_count += 1
                    # Import filters
                    if data['data'].get('filters'):
                        NOT_IMPORTED += "\n\nFilters:\n"
                        if data['data']['filters'].get('filters'):
                            for x in data['data']['filters'].get('filters'):
                                if x['type'] == 0:
                                    note_data, buttons = button_markdown_parser(
                                        x['text'].replace("\\", ""),
                                        entities=0)
                                    filtersql.add_filter(
                                        chat_id, x['name'], note_data, False,
                                        False, False, False, False, False,
                                        buttons)
                                    imp_filters_count += 1
                                else:
                                    NOT_IMPORTED += "- {}\n".format(x['name'])
                                    NOT_IMPORTED_INT += 1
                    # Import greetings

                    # Import notes
                    if data['data'].get('notes'):
                        NOT_IMPORTED += "\n\nNotes:\n"
                        allnotes = data['data']['notes']['notes']
                        for x in allnotes:
                            # If this text
                            if x['type'] == 0:
                                note_data, buttons = button_markdown_parser(
                                    x['text'].replace("\\", ""), entities=0)
                                note_name = x['name']
                                notesql.add_note_to_db(chat_id, note_name,
                                                       note_data, Types.TEXT,
                                                       buttons, None)
                                imp_notes += 1
                            else:
                                NOT_IMPORTED += "- {}\n".format(x['name'])
                                NOT_IMPORTED_INT += 1
                    # Import reports
                    if data['data'].get('reports'):
                        if data['data']['reports'].get('disable_reports'):
                            reporting = False
                        else:
                            reporting = True
                        reportsql.set_chat_setting(chat_id, reporting)
                        imp_report = True
                    # Import rules
                    if data['data'].get('rules'):
                        contrules = data['data']['rules'].get('content')
                        if contrules:
                            rulessql.set_rules(chat_id,
                                               contrules.replace("\\", ""))
                            imp_rules = True

                    # Import warn

                    if conn:
                        text = tld(
                            update.effective_message,
                            "Backup fully restored at *{}*. Congratulations welcome back! 😀"
                        ).format(chat_name)
                    else:
                        text = tld(
                            update.effective_message,
                            "Backup fully restored. Congratulations welcome back! 😀"
                        ).format(chat_name)
                    text += tld(update.effective_message, "\n\nI returned:\n")
                    if imp_antiflood:
                        text += tld(update.effective_message,
                                    "- Setting Antiflood\n")
                    if imp_blacklist:
                        text += tld(update.effective_message,
                                    "- Settings Blacklist\n")
                    if imp_blacklist_count:
                        text += tld(
                            update.effective_message,
                            "- {} blacklists\n").format(imp_blacklist_count)
                    if imp_disabled_count:
                        text += tld(
                            update.effective_message,
                            "- {} cmd disabled\n").format(imp_disabled_count)
                    if imp_filters_count:
                        text += tld(update.effective_message,
                                    "- {} filters\n").format(imp_filters_count)

                    if imp_notes:
                        text += tld(update.effective_message,
                                    "- {} a note\n").format(imp_notes)
                    if imp_report:
                        text += tld(update.effective_message,
                                    "- Reporting arrangements\n")
                    if imp_rules:
                        text += tld(update.effective_message,
                                    "- Order group rules\n")

                    try:
                        send_message(update.effective_message,
                                     text,
                                     parse_mode="markdown")
                    except BadRequest:
                        send_message(update.effective_message,
                                     text,
                                     parse_mode="markdown",
                                     quote=False)
                    if NOT_IMPORTED_INT:
                        f = open("{}-notimported.txt".format(chat_id), "w")
                        f.write(str(NOT_IMPORTED))
                        f.close()
                        bot.sendDocument(
                            chat_id,
                            document=open('{}-notimported.txt'.format(chat_id),
                                          'rb'),
                            caption=tld(update.effective_message,
                                        "*data cannot be imported*"),
                            timeout=360,
                            parse_mode=ParseMode.MARKDOWN)
                        os.remove("{}-notimported.txt".format(chat_id))
                    return
        except Exception as err:
            send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "An error occured while restoring backup report at @LucySupportChat"
                ),
                parse_mode="markdown")
            LOGGER.exception("An error when importing from Rose base!")
            return

        # only import one group
        if len(data) > 1 and str(chat_id) not in data:
            send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "There is more than one group in this file, and no one has the same chat id as"
                    "this group - how do you choose what to import?"))
            return

        # Check if backup is this chat
        try:
            if data.get(str(chat_id)) == None:
                if conn:
                    text = tld(
                        update.effective_message,
                        "Backup originates from another chat, I can't return another chat to chat *{}*"
                    ).format(chat_name)
                else:
                    text = tld(update.effective_message,
                               "Backup originates from another chat")
                return send_message(update.effective_message,
                                    text,
                                    parse_mode="markdown")
        except:
            return send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "An error has occurred in checking the data, please report it to my author at @ LucySupportChat! 🙂"
                ))
        # Check if backup is from self
        try:
            if str(bot.id) != str(data[str(chat_id)]['bot']):
                return send_message(
                    update.effective_message,
                    tld(update.effective_message,
                        "Backup comes from another bot🙂"))
        except:
            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:
            send_message(
                update.effective_message,
                tld(
                    update.effective_message,
                    "An error occurred while restoring your data. The process may not be complete🙂"
                ))
            LOGGER.exception("Impor untuk id chat %s dengan nama %s gagal.",
                             str(chat_id), str(chat.title))
            return

        # TODO: some of that link logic
        # NOTE: consider default permissions stuff?
        if conn:
            text = tld(
                update.effective_message,
                "Backup was restored successfully *{}*. Congratulations welcome back! 😀"
            ).format(chat_name)
        else:
            text = tld(
                update.effective_message,
                "Backup was restored successfully. Congratulations welcome back! 😀"
            ).format(chat_name)
        send_message(update.effective_message, text, parse_mode="markdown")
Esempio n. 6
0
        # Stop processing with any other handler.
        except DispatcherHandlerStop:
            self.logger.debug(
                'Stopping further handlers due to DispatcherHandlerStop')
            break

        # Dispatch any error.
        except TelegramError as te:
            self.logger.warning(
                'A TelegramError was raised while processing the Update')

            try:
                self.dispatch_error(update, te)
            except DispatcherHandlerStop:
                self.logger.debug('Error handler stopped further handlers')
                break
            except Exception:
                self.logger.exception(
                    'An uncaught error was raised while handling the error')

        # Errors should not stop the thread.
        except Exception:
            self.logger.exception(
                'An uncaught error was raised while processing the update')


if __name__ == '__main__':
    LOGGER.info("Successfully loaded modules: " + str(ALL_MODULES))
    LOGGER.info("Successfully loaded")
    main()
Esempio n. 7
0
def report(bot: Bot, update: Update) -> str:
    message = update.effective_message  # type: Optional[Message]
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]

    if chat and message.reply_to_message and sql.chat_should_report(chat.id):
        reported_user = message.reply_to_message.from_user  # type: Optional[User]
        chat_name = chat.title or chat.first or chat.username
        admin_list = chat.get_administrators()

        if int(reported_user.id) == int(user.id):
            return

        if chat.username and chat.type == Chat.SUPERGROUP:
            msg = "<b>{}:</b>" \
                  "\n<b>Reported user:</b> {} (<code>{}</code>)" \
                  "\n<b>Reported by:</b> {} (<code>{}</code>)".format(html.escape(chat.title),
                                                                      mention_html(
                                                                          reported_user.id,
                                                                          reported_user.first_name),
                                                                      reported_user.id,
                                                                      mention_html(user.id,
                                                                                   user.first_name),
                                                                      user.id)
            link = "\n<b>Link:</b> " \
                   "<a href=\"http://telegram.me/{}/{}\">click here</a>".format(chat.username, message.message_id)

            should_forward = True
            keyboard = [[
                InlineKeyboardButton(
                    u"➡ Message",
                    url="https://t.me/{}/{}".format(
                        chat.username,
                        str(message.reply_to_message.message_id)))
            ],
                        [
                            InlineKeyboardButton(
                                u"⚠ Kick",
                                callback_data="report_{}=kick={}={}".format(
                                    chat.id, reported_user.id,
                                    reported_user.first_name)),
                            InlineKeyboardButton(
                                u"⛔️ Ban",
                                callback_data="report_{}=banned={}={}".format(
                                    chat.id, reported_user.id,
                                    reported_user.first_name))
                        ],
                        [
                            InlineKeyboardButton(
                                u"❎ Delete Message",
                                callback_data="report_{}=delete={}={}".format(
                                    chat.id, reported_user.id,
                                    message.reply_to_message.message_id))
                        ]]
            reply_markup = InlineKeyboardMarkup(keyboard)

        else:
            msg = "{} is calling for admins in \"{}\"!".format(
                mention_html(user.id, user.first_name), 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 not chat.type == Chat.SUPERGROUP:
                        bot.send_message(admin.user.id,
                                         msg + link,
                                         parse_mode=ParseMode.HTML,
                                         disable_web_page_preview=True)

                        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,
                                         disable_web_page_preview=True)

                        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,
                                         disable_web_page_preview=True)

                        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(
                        f"Exception while reporting user : {excp}")

        message.reply_to_message.reply_text(tld(
            chat.id,
            "reports_success").format(mention_html(user.id, user.first_name)),
                                            parse_mode=ParseMode.HTML,
                                            disable_web_page_preview=True)
        return msg

    return ""
Esempio n. 8
0
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.HTML,
            reply_markup=keyboard,
            reply_to_message_id=reply,
            disable_web_page_preview=True)
    except IndexError:
        msg = update.effective_message.reply_text(
            markdown_parser(backup_message + "\nNote: the current message was "
                            "invalid due to markdown issues. Could be "
                            "due to the user's name."),
            parse_mode=ParseMode.MARKDOWN,
            reply_to_message_id=reply)
    except KeyError:
        msg = update.effective_message.reply_text(
            markdown_parser(backup_message + "\nNote: the current message is "
                            "invalid due to an issue with some misplaced "
                            "curly brackets. Please update"),
            parse_mode=ParseMode.MARKDOWN,
            reply_to_message_id=reply)
    except BadRequest as excp:
        if excp.message == "Button_url_invalid":
            msg = update.effective_message.reply_text(
                markdown_parser(
                    backup_message +
                    "\nNote: the current message has an invalid url "
                    "in one of its buttons. Please update."),
                parse_mode=ParseMode.MARKDOWN,
                reply_to_message_id=reply)
        elif excp.message == "Unsupported url protocol":
            msg = update.effective_message.reply_text(
                markdown_parser(
                    backup_message +
                    "\nNote: the current message has buttons which "
                    "use url protocols that are unsupported by "
                    "telegram. Please update."),
                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 +
                    "\nNote: the current message has some bad urls. "
                    "Please update."),
                parse_mode=ParseMode.MARKDOWN,
                reply_to_message_id=reply)
            LOGGER.warning(message)
            LOGGER.warning(keyboard)
            LOGGER.exception("Could not parse! got invalid url host errors")
        else:
            try:
                msg = update.effective_message.reply_text(
                    markdown_parser(
                        backup_message +
                        "\nNote: An error occured when sending the "
                        "custom message. Please update."),
                    reply_to_message_id=reply,
                    parse_mode=ParseMode.MARKDOWN)
            except BadRequest:
                return ""
    return msg
Esempio n. 9
0
def ban(bot: Bot, update: Update, args: List[str]) -> str:
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    message = update.effective_message  # type: Optional[Message]

    user_id, reason = extract_user_and_text(message, args)

    if not user_id:
        message.reply_text(
            tld(chat.id, "You don't seem to be referring to a user."))
        return ""

    try:
        member = chat.get_member(user_id)
    except BadRequest as excp:
        if excp.message == "User not found":
            message.reply_text(tld(chat.id, "I can't seem to find this user"))
            return ""
        else:
            raise

    if user_id == bot.id:
        message.reply_text(
            tld(chat.id, "I'm not gonna BAN myself, are you crazy?"))
        return ""

    if is_user_ban_protected(chat, user_id, member):
        message.reply_text(
            tld(
                chat.id,
                "Why would I ban an admin? That sounds like a pretty dumb idea."
            ))
        return ""

    log = "<b>{}:</b>" \
          "\n#BANNED" \
          "\n<b>• Admin:</b> {}" \
          "\n<b>• User:</b> {}" \
          "\n<b>• ID:</b> <code>{}</code>".format(html.escape(chat.title), mention_html(user.id, user.first_name),
                                                  mention_html(member.user.id, member.user.first_name), user_id)

    reply = "{} has been banned!".format(
        mention_html(member.user.id, member.user.first_name))

    if reason:
        log += "\n<b>Reason:</b> {}".format(reason)

    try:
        chat.kick_member(user_id)
        bot.send_sticker(chat.id, BAN_STICKER)
        message.reply_text(tld(chat.id, "Banned!"))
        return log

    except BadRequest as excp:
        if excp.message == "Reply message not found":
            # Do not reply
            bot.send_sticker(chat.id, BAN_STICKER)
            message.reply_text(tld(chat.id, "Banned!"), quote=False)
            return log
        else:
            LOGGER.warning(update)
            LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s",
                             user_id, chat.title, chat.id, excp.message)
            message.reply_text(
                tld(chat.id, "Well damn, I can't ban that user."))

    return ""
Esempio n. 10
0
def temp_nomedia(bot: Bot, update: Update, args: List[str]) -> str:
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    message = update.effective_message  # type: Optional[Message]

    conn = connected(bot, update, chat, user.id)
    if not conn == False:
        chatD = dispatcher.bot.getChat(conn)
    else:
        if chat.type == "private":
            exit(1)
        else:
            chatD = chat

    user_id, reason = extract_user_and_text(message, args)

    if not user_id:
        message.reply_text(
            tld(chat.id, "You don't seem to be referring to a user."))
        return ""

    try:
        member = chat.get_member(user_id)
    except BadRequest as excp:
        if excp.message == "User not found":
            message.reply_text(tld(chat.id, "I can't seem to find this user"))
            return ""
        else:
            raise

    if is_user_admin(chat, user_id, member):
        message.reply_text(
            tld(chat.id, "I really wish I could restrict admins..."))
        return ""

    if user_id == bot.id:
        message.reply_text(
            tld(chat.id, "I'm not gonna RESTRICT myself, are you crazy?"))
        return ""

    if not reason:
        message.reply_text(
            tld(chat.id,
                "You haven't specified a time to restrict this user for!"))
        return ""

    split_reason = reason.split(None, 1)

    time_val = split_reason[0].lower()
    if len(split_reason) > 1:
        reason = split_reason[1]
    else:
        reason = ""

    mutetime = extract_time(message, time_val)

    if not mutetime:
        return ""

    log = "<b>{}:</b>" \
          "\n#TEMP RESTRICTED" \
          "\n<b>• Admin:</b> {}" \
          "\n<b>• User:</b> {}" \
          "\n<b>• ID:</b> <code>{}</code>" \
          "\n<b>• Time:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name),
                                       mention_html(member.user.id, member.user.first_name), user_id, time_val)
    if reason:
        log += "\n<b>• Reason:</b> {}".format(reason)

    try:
        if member.can_send_messages is None or member.can_send_messages:
            bot.restrict_chat_member(chat.id,
                                     user_id,
                                     until_date=mutetime,
                                     can_send_messages=True,
                                     can_send_media_messages=False,
                                     can_send_other_messages=False,
                                     can_add_web_page_previews=False)
            message.reply_text(
                tld(chat.id,
                    "Restricted from sending media for {} in {}!").format(
                        time_val, chatD.title))
            return log
        else:
            message.reply_text(
                tld(chat.id, "This user is already restricted in {}.").format(
                    chatD.title))

    except BadRequest as excp:
        if excp.message == "Reply message not found":
            # Do not reply
            message.reply_text(tld(chat.id, "Restricted for {} in {}!").format(
                time_val, chatD.title),
                               quote=False)
            return log
        else:
            LOGGER.warning(update)
            LOGGER.exception("ERROR muting user %s in chat %s (%s) due to %s",
                             user_id, chat.title, chat.id, excp.message)
            message.reply_text(
                tld(chat.id, "Well damn, I can't restrict that user."))

    return ""
Esempio n. 11
0
from haruka import dispatcher, LOGGER
from haruka.__main__ import GDPR
from haruka.__main__ import STATS, USER_INFO
from haruka.modules.disable import DisableAbleCommandHandler
from haruka.modules.helper_funcs.extraction import extract_user
from haruka.modules.helper_funcs.filters import CustomFilters

from requests import get

# DO NOT DELETE THIS, PLEASE.
# Made by @RealAkito on GitHub and Telegram.
# This module was inspired by Android Helper Bot by Vachounet.
# None of the code is taken from the bot itself, to avoid any more confusion.

LOGGER.info("Original Android Modules by @kavinduaj on Telegram")


@run_async
def havoc(bot: Bot, update: Update):
    message = update.effective_message
    device = message.text[len('/havoc '):]
    fetch = get(
        f'https://raw.githubusercontent.com/Havoc-Devices/android_vendor_OTA/pie/{device}.json'
    )

    if device == '':
        reply_text = "Please type your device **codename** into it!\nFor example, `/havoc tissot`"
        message.reply_text(reply_text,
                           parse_mode=ParseMode.MARKDOWN,
                           disable_web_page_preview=True)
Esempio n. 12
0
def get(bot, update, notename, show_none=True, no_format=False):
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    conn = connected(bot, update, chat, user.id, need_admin=False)
    if conn:
        chat_id = conn
        send_id = user.id
    else:
        chat_id = update.effective_chat.id
        send_id = chat_id

    note = sql.get_note(chat_id, notename)
    message = update.effective_message  # type: Optional[Message]

    if note:
        # 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 MESSAGE_DUMP:
                try:
                    bot.forward_message(chat_id=chat_id,
                                        from_chat_id=MESSAGE_DUMP,
                                        message_id=note.value)
                except BadRequest as excp:
                    if excp.message == "Message to forward not found":
                        message.reply_text(
                            "This message seems to have been lost - I'll remove it "
                            "from your notes list.")
                        sql.rm_note(chat_id, notename)
                    else:
                        raise
            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 == "Message to forward not found":
                        message.reply_text(
                            "Looks like the original sender of this note has deleted "
                            "their message - sorry! Get your bot admin to start using a "
                            "message dump to avoid this. I'll remove this note from "
                            "your saved notes.")
                    sql.rm_note(chat_id, notename)

                else:
                    raise
        else:
            text = note.value
            keyb = []
            parseMode = ParseMode.MARKDOWN
            buttons = sql.get_buttons(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):
                    try:
                        bot.send_message(send_id,
                                         text,
                                         reply_to_message_id=reply_id,
                                         parse_mode=parseMode,
                                         disable_web_page_preview=True,
                                         reply_markup=keyboard)
                    except BadRequest as excp:
                        if excp.message == "Wrong http url":
                            failtext = "The URL on the button is invalid! Please update this note!"
                            failtext += "\n\n```\n{}```".format(
                                note.value + revert_buttons(buttons))
                            message.reply_text(failtext, parse_mode="markdown")
                        print("Gagal mengirim catatan: " + excp.message)
                        pass
                else:
                    ENUM_FUNC_MAP[note.msgtype](send_id,
                                                note.file,
                                                caption=text,
                                                reply_to_message_id=reply_id,
                                                parse_mode=parseMode,
                                                disable_web_page_preview=True,
                                                reply_markup=keyboard)

            except BadRequest as excp:
                if excp.message == "Entity_mention_user_invalid":
                    message.reply_text(
                        "Looks like you tried to mention someone I've never seen before. If you really "
                        "want to mention them, forward one of their messages to me, and I'll be able "
                        "to tag them!")

                elif FILE_MATCHER.match(note.value):
                    message.reply_text(
                        "This note was an incorrectly imported file from another bot - I can't use "
                        "it. If you really need it, you'll have to save it again. In "
                        "the meantime, I'll remove it from your notes list.")
                    sql.rm_note(chat_id, notename)
                else:
                    message.reply_text(
                        "This note could not be sent, as it is incorrectly formatted, Please ask in @HarukaAyaGroup if you can't figure out why!"
                    )
                    LOGGER.exception("Could not parse message #%s in chat %s",
                                     notename, str(chat_id))
                    LOGGER.warning("Message was: %s", str(note.value))

        return
    elif show_none:
        message.reply_text("This note doesn't exist")
Esempio n. 13
0
from haruka.modules.disable import DisableAbleCommandHandler
from haruka.modules.helper_funcs.extraction import extract_user
from haruka.modules.helper_funcs.filters import CustomFilters
from haruka.modules.translations.strings import tld

from requests import get

# Greeting all bot owners that is using this module,
# - RealAkito (used to be peaktogoo) [Module Maker]
# have spent so much time of their life into making this module better, stable, and well more supports.
# Please don't remove these comment, if you're still respecting me, the module maker.
#
# This module was inspired by Android Helper Bot by Vachounet.
# None of the code is taken from the bot itself, to avoid confusion.

LOGGER.info("android: Original Android Modules by @RealAkito on Telegram")


@run_async
def havoc(bot: Bot, update: Update):
    cmd_name = "havoc"
    message = update.effective_message
    chat = update.effective_chat  # type: Optional[Chat]
    device = message.text[len(f'/{cmd_name} '):]

    fetch = get(
        f'https://raw.githubusercontent.com/Havoc-Devices/android_vendor_OTA/pie/{device}.json'
    )

    if device == '':
        reply_text = tld(chat.id, "cmd_example").format(cmd_name)
Esempio n. 14
0
def reply_filter(bot: Bot, update: Update):
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user
    message = update.effective_message  # type: Optional[Message]
    to_match = extract_text(message)
    if not to_match:
        return

    if user.id == 777000:
        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.is_sticker:
                message.reply_sticker(filt.reply)
            elif filt.is_document:
                try:
                    message.reply_document(filt.reply)
                except:
                    print("L")
            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:
                try:
                    message.reply_video(filt.reply)
                except:
                    print("Nut")
            elif filt.has_markdown:
                buttons = sql.get_buttons(chat.id, filt.keyword)
                keyb = build_keyboard(buttons)
                keyboard = InlineKeyboardMarkup(keyb)

                try:
                    message.reply_text(filt.reply,
                                       parse_mode=ParseMode.MARKDOWN,
                                       disable_web_page_preview=True,
                                       reply_markup=keyboard)
                except BadRequest as excp:
                    if excp.message == "Unsupported url protocol":
                        message.reply_text(
                            "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, or ask in @HarukaAyaGroup for help.")
                    elif excp.message == "Reply message not found":
                        bot.send_message(chat.id,
                                         filt.reply,
                                         parse_mode=ParseMode.MARKDOWN,
                                         disable_web_page_preview=True,
                                         reply_markup=keyboard)
                    else:
                        try:
                            message.reply_text(
                                "This note could not be sent, as it is incorrectly formatted. Ask in @HarukaAyaGroup if you can't figure out why!"
                            )
                            LOGGER.warning("Message %s could not be parsed",
                                           str(filt.reply))
                            LOGGER.exception(
                                "Could not parse filter %s in chat %s",
                                str(filt.keyword), str(chat.id))
                        except:
                            print("Nut")

            else:
                # LEGACY - all new filters will have has_markdown set to True.
                message.reply_text(filt.reply)
            break
Esempio n. 15
0
def settings_button(bot: Bot, update: Update):
    query = update.callback_query
    user = update.effective_user
    chatP = update.effective_chat  # type: Optional[Chat]
    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.group(1)
            module = mod_match.group(2)
            chat = bot.get_chat(chat_id)
            text = "*{}* has the following settings for the *{}* module:\n\n".format(escape_markdown(chat.title),
                                                                                     CHAT_SETTINGS[
                                                                                         module].__mod_name__) + \
                   CHAT_SETTINGS[module].__chat_settings__(bot, update, chat, chatP, user)
            query.message.reply_text(
                text=text,
                parse_mode=ParseMode.MARKDOWN,
                reply_markup=InlineKeyboardMarkup([[
                    InlineKeyboardButton(
                        text="Back",
                        callback_data="stngs_back({})".format(chat_id))
                ]]))

        elif prev_match:
            chat_id = prev_match.group(1)
            curr_page = int(prev_match.group(2))
            chat = bot.get_chat(chat_id)
            query.message.reply_text(tld(
                user.id, "send-group-settings").format(chat.title),
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(curr_page - 1,
                                                          CHAT_SETTINGS,
                                                          "stngs",
                                                          chat=chat_id)))

        elif next_match:
            chat_id = next_match.group(1)
            next_page = int(next_match.group(2))
            chat = bot.get_chat(chat_id)
            query.message.reply_text(tld(
                user.id, "send-group-settings").format(chat.title),
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(next_page + 1,
                                                          CHAT_SETTINGS,
                                                          "stngs",
                                                          chat=chat_id)))

        elif back_match:
            chat_id = back_match.group(1)
            chat = bot.get_chat(chat_id)
            query.message.reply_text(text=tld(user.id,
                                              "send-group-settings").format(
                                                  escape_markdown(chat.title)),
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(user.id,
                                                          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 == "Message is not modified":
            pass
        elif excp.message == "Query_id_invalid":
            pass
        elif excp.message == "Message can't be deleted":
            pass
        else:
            LOGGER.exception("Exception in settings buttons. %s",
                             str(query.data))
Esempio n. 16
0
def temp_ban(bot: Bot, update: Update, args: List[str]) -> str:
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    message = update.effective_message  # type: Optional[Message]

    user_id, reason = extract_user_and_text(message, args)

    if not user_id:
        message.reply_text(
            tld(chat.id, "You don't seem to be referring to a user."))
        return ""

    try:
        member = chat.get_member(user_id)
    except BadRequest as excp:
        if excp.message == "User not found":
            message.reply_text(tld(chat.id, "I can't seem to find this user"))
            return ""
        else:
            raise

    if is_user_ban_protected(chat, user_id, member):
        message.reply_text(
            tld(
                chat.id,
                "This user is ban protected, meaning that you cannot ban this user!"
            ))
        return ""

    if user_id == bot.id:
        message.reply_text(
            tld(chat.id, "I'm not gonna BAN myself, are you crazy?"))
        return ""

    if not reason:
        message.reply_text(
            tld(chat.id, "You haven't specified a time to ban this user for!"))
        return ""

    split_reason = reason.split(None, 1)

    time_val = split_reason[0].lower()
    if len(split_reason) > 1:
        reason = split_reason[1]
    else:
        reason = ""

    bantime = extract_time(message, time_val)

    if not bantime:
        return ""

    log = "<b>{}:</b>" \
          "\n#TEMP BANNED" \
          "\n<b>Admin:</b> {}" \
          "\n<b>User:</b> {} (<code>{}</code>)" \
          "\n<b>Time:</b> {}".format(html.escape(chat.title),
                                     mention_html(user.id, user.first_name),
                                     mention_html(member.user.id, member.user.first_name),
                                     member.user.id,
                                     time_val)
    if reason:
        log += "\n<b>Reason:</b> {}".format(reason)

    try:
        chat.kick_member(user_id, until_date=bantime)
        #bot.send_sticker(chat.id, BAN_STICKER)  # banhammer marie sticker
        message.reply_text(
            "Banned! User will be banned for {}.".format(time_val))
        return log

    except BadRequest as excp:
        if excp.message == "Reply message not found":
            # Do not reply
            #bot.send_sticker(chat.id, BAN_STICKER)  # banhammer marie sticker
            message.reply_text(
                tld(chat.id,
                    "Banned! User will be banned for {}.").format(time_val),
                quote=False)
            return log
        else:
            LOGGER.warning(update)
            LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s",
                             user_id, chat.title, chat.id, excp.message)
            message.reply_text(
                tld(chat.id, "Well damn, I can't ban that user."))

    return ""
Esempio n. 17
0
def control_panel(bot, update):
    LOGGER.info("Control panel")
Esempio n. 18
0
from haruka.modules.disable import DisableAbleCommandHandler

import haruka.modules.sql.feds_sql as sql

from haruka.modules.translations.strings import tld

from haruka.modules.connection import connected

# Hello bot owner, I spended for feds many hours of my life, Please don't remove this if you still respect MrYacha and peaktogoo
# Federation by MrYacha 2018-2019
# Federation rework in process by Mizukito Akito 2019
# Time spended on feds = 10h by #MrYacha
# Time spended on reworking on the whole feds = 20+ hours by @peaktogoo

LOGGER.info(
    "Original federation module by MrYacha, reworked by Mizukito Akito (@peaktogoo) on Telegram."
)

FBAN_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 kick it from a basic group",
    "Chat_admin_required",
    "Only the creator of a basic group can kick group administrators",
    "Channel_private", "Not in the chat"
}

UNFBAN_ERRORS = {
    "User is an administrator of the chat",
    "Chat not found",
Esempio n. 19
0
def control_panel(bot, update):
    LOGGER.info("Control panel")
    chat = update.effective_chat
    user = update.effective_user

    # ONLY send help in PM
    if chat.type != chat.PRIVATE:

        update.effective_message.reply_text(
            "Contact me in PM to access the control panel.",
            reply_markup=InlineKeyboardMarkup([[
                InlineKeyboardButton(
                    text="Control Panel",
                    url=f"t.me/{bot.username}?start=controlpanel")
            ]]))
        return

    #Support to run from command handler
    query = update.callback_query
    if query:
        query.message.delete()

        M_match = re.match(r"cntrl_panel_M", query.data)
        U_match = re.match(r"cntrl_panel_U", query.data)
        G_match = re.match(r"cntrl_panel_G", query.data)
        back_match = re.match(r"help_back", query.data)

        LOGGER.info(query.data)
    else:
        M_match = "ThaNos is the best bot"  #LMAO, don't uncomment

    if M_match:
        text = "*Control panel* 🛠"

        keyboard = [[
            InlineKeyboardButton(text="👤 My settings",
                                 callback_data="cntrl_panel_U(1)")
        ]]

        #Show connected chat and add chat settings button
        conn = connected(bot, update, chat, user.id, need_admin=False)

        if conn:
            chatG = bot.getChat(conn)
            #admin_list = chatG.get_administrators() #Unused variable

            #If user admin
            member = chatG.get_member(user.id)
            if member.status in ('administrator', 'creator'):
                text += f"\nConnected chat - *{chatG.title}* (you {member.status})"
                keyboard += [[
                    InlineKeyboardButton(text="👥 Group settings",
                                         callback_data="cntrl_panel_G_back")
                ]]
            elif user.id in SUDO_USERS:
                text += f"\nConnected chat - *{chatG.title}* (you sudo)"
                keyboard += [[
                    InlineKeyboardButton(text="👥 Group settings (SUDO)",
                                         callback_data="cntrl_panel_G_back")
                ]]
            else:
                text += f"\nConnected chat - *{chatG.title}* (you aren't an admin!)"
        else:
            text += "\nNo chat connected!"

        keyboard += [[
            InlineKeyboardButton(text="Back", callback_data="bot_start")
        ]]

        update.effective_message.reply_text(
            text,
            reply_markup=InlineKeyboardMarkup(keyboard),
            parse_mode=ParseMode.MARKDOWN)

    elif U_match:

        mod_match = re.match(r"cntrl_panel_U_module\((.+?)\)", query.data)
        back_match = re.match(r"cntrl_panel_U\((.+?)\)", query.data)

        chatP = update.effective_chat  # type: Optional[Chat]
        if mod_match:
            module = mod_match.group(1)

            R = CHAT_SETTINGS[module].__user_settings__(bot, update, user)

            text = "You has the following settings for the *{}* module:\n\n".format(
                CHAT_SETTINGS[module].__mod_name__) + R[0]

            keyboard = R[1]
            keyboard += [[
                InlineKeyboardButton(text="Back",
                                     callback_data="cntrl_panel_U(1)")
            ]]

            query.message.reply_text(
                text=text,
                arse_mode=ParseMode.MARKDOWN,
                reply_markup=InlineKeyboardMarkup(keyboard))

        elif back_match:
            text = "*User control panel* 🛠"

            query.message.reply_text(text=text,
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(
                                             user.id, 0, USER_SETTINGS,
                                             "cntrl_panel_U")))

    elif G_match:
        mod_match = re.match(r"cntrl_panel_G_module\((.+?)\)", query.data)
        prev_match = re.match(r"cntrl_panel_G_prev\((.+?)\)", query.data)
        next_match = re.match(r"cntrl_panel_G_next\((.+?)\)", query.data)
        back_match = re.match(r"cntrl_panel_G_back", query.data)

        chatP = chat
        conn = connected(bot, update, chat, user.id)

        if not conn == False:
            chat = bot.getChat(conn)
        else:
            query.message.reply_text(text="Error with connection to chat")
            exit(1)

        if mod_match:
            module = mod_match.group(1)
            R = CHAT_SETTINGS[module].__chat_settings__(
                bot, update, chat, chatP, user)

            if type(R) is list:
                text = R[0]
                keyboard = R[1]
            else:
                text = R
                keyboard = []

            text = "*{}* has the following settings for the *{}* module:\n\n".format(
                escape_markdown(chat.title),
                CHAT_SETTINGS[module].__mod_name__) + text

            keyboard += [[
                InlineKeyboardButton(text="Back",
                                     callback_data="cntrl_panel_G_back")
            ]]

            query.message.reply_text(
                text=text,
                parse_mode=ParseMode.MARKDOWN,
                reply_markup=InlineKeyboardMarkup(keyboard))

        elif prev_match:
            chat_id = prev_match.group(1)
            curr_page = int(prev_match.group(2))
            chat = bot.get_chat(chat_id)
            query.message.reply_text(tld(
                user.id, "send-group-settings").format(chat.title),
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(curr_page - 1,
                                                          0,
                                                          CHAT_SETTINGS,
                                                          "cntrl_panel_G",
                                                          chat=chat_id)))

        elif next_match:
            chat_id = next_match.group(1)
            next_page = int(next_match.group(2))
            chat = bot.get_chat(chat_id)
            query.message.reply_text(tld(
                user.id, "send-group-settings").format(chat.title),
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(next_page + 1,
                                                          0,
                                                          CHAT_SETTINGS,
                                                          "cntrl_panel_G",
                                                          chat=chat_id)))

        elif back_match:
            text = "Test"
            query.message.reply_text(text=text,
                                     parse_mode=ParseMode.MARKDOWN,
                                     reply_markup=InlineKeyboardMarkup(
                                         paginate_modules(
                                             user.id, 0, CHAT_SETTINGS,
                                             "cntrl_panel_G")))
Esempio n. 20
0
def ban(bot: Bot, update: Update, args: List[str]) -> str:
    chat = update.effective_chat  # type: Optional[Chat]
    user = update.effective_user  # type: Optional[User]
    message = update.effective_message  # type: Optional[Message]

    user_id, reason = extract_user_and_text(message, args)

    if not user_id:
        message.reply_text(
            tld(chat.id, "You don't seem to be referring to a user."))
        return ""

    try:
        member = chat.get_member(user_id)
    except BadRequest as excp:
        if excp.message == "User not found":
            message.reply_text(tld(chat.id, "I can't seem to find this user"))
            return ""
        else:
            raise

    if user_id == bot.id:
        message.reply_text(
            tld(chat.id, "I'm not gonna BAN myself, are you crazy?"))
        return ""

    if user_id == 777000:
        message.reply_text(
            tld(
                chat.id,
                "Really u r going to ban telegram from telegram i think it is impossible keep trying maybe u can"
            ))
        return ""

    if is_user_ban_protected(chat, user_id, member):
        message.reply_text(
            tld(
                chat.id,
                "Why would I ban an admin? That sounds like a pretty dumb idea."
            ))
        return ""

    log = "<b>{}:</b>" \
          "\n#BANNED" \
          "\n<b>• Admin:</b> {}" \
          "\n<b>• User:</b> {}" \
          "\n<b>• ID:</b> <code>{}</code>".format(html.escape(chat.title), mention_html(user.id, user.first_name),
                                                  mention_html(member.user.id, member.user.first_name), user_id)

    reply = "🔨 Banned {}\nwith the ban hammer".format(
        mention_html(member.user.id, member.user.first_name))

    if reason:
        log += "\n<b>Reason:</b> {}".format(reason)

    try:
        chat.kick_member(user_id)
        keyboard = []
        bot.send_sticker(chat.id, BAN_STICKER)  # banhammer marie sticker
        message.reply_text(reply,
                           reply_markup=keyboard,
                           parse_mode=ParseMode.HTML)
        return log

    except BadRequest as excp:
        if excp.message == "Reply message not found":
            # Do not reply
            #bot.send_sticker(chat.id, BAN_STICKER)  # banhammer marie sticker
            message.reply_text(tld(chat.id, "Banned!"), quote=False)
            return log
        else:
            LOGGER.warning(update)
            LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s",
                             user_id, chat.title, chat.id, excp.message)
            message.reply_text(
                tld(chat.id, "Well damn, I can't ban that user."))

    return ""