Example #1
0
def remove_wallet_inl(bch, wallet_id):
    keyboard = InlineKeyboardMarkup(row_width=2)

    list_buttons = [
        InlineKeyboardButton(_('Нет'),
                             callback_data='{}_{}_address_info'.format(
                                 bch, wallet_id)),
        InlineKeyboardButton(_('Нет'),
                             callback_data='{}_{}_address_info'.format(
                                 bch, wallet_id)),
        InlineKeyboardButton(_('Нет'),
                             callback_data='{}_{}_address_info'.format(
                                 bch, wallet_id)),
        InlineKeyboardButton(_('Да, удалить'),
                             callback_data='{}_{}_remove_address'.format(
                                 bch, wallet_id))
    ]
    random.shuffle(list_buttons)
    list_buttons.append(
        InlineKeyboardButton(_('Назад'),
                             callback_data='{}_{}_address_info'.format(
                                 bch, wallet_id)))

    for btn in list_buttons:
        keyboard.insert(btn)

    return keyboard
Example #2
0
async def warn_func(message: Message, chat, user, text, strings, filter_action=False):
    chat_id = chat["chat_id"]
    chat_title = chat["chat_title"]
    by_id = BOT_ID if filter_action is True else message.from_user.id
    user_id = user["user_id"] if filter_action is False else user

    if user_id == BOT_ID:
        await message.reply(strings["warn_sofi"])
        return

    if not filter_action:
        if user_id == message.from_user.id:
            await message.reply(strings["warn_self"])
            return

    if await is_user_admin(chat_id, user_id):
        if not filter_action:
            await message.reply(strings["warn_admin"])
        return

    reason = text
    warn_id = str(
        (
            await db.warns.insert_one(
                {
                    "user_id": user_id,
                    "chat_id": chat_id,
                    "reason": str(reason),
                    "by": by_id,
                }
            )
        ).inserted_id
    )

    admin = await get_user_link(by_id)
    member = await get_user_link(user_id)
    text = strings["warn"].format(admin=admin, user=member, chat_name=chat_title)

    if reason:
        text += strings["warn_rsn"].format(reason=reason)

    warns_count = await db.warns.count_documents(
        {"chat_id": chat_id, "user_id": user_id}
    )

    buttons = InlineKeyboardMarkup().add(
        InlineKeyboardButton(
            "тЪая╕П Remove warn", callback_data="remove_warn_{}".format(warn_id)
        )
    )

    if await db.rules.find_one({"chat_id": chat_id}):
        buttons.insert(
            InlineKeyboardButton(
                "ЁЯУЭ Rules", url=await get_start_link(f"btn_rules_{chat_id}")
            )
        )

    if warn_limit := await db.warnlimit.find_one({"chat_id": chat_id}):
        max_warn = int(warn_limit["num"])
Example #3
0
async def select_lang_keyboard(message, strings):
    markup = InlineKeyboardMarkup(row_width=2)

    lang_info = await get_chat_lang_info(message.chat.id)

    if message.chat.type == 'private':
        text = strings['your_lang'].format(lang=lang_info['flag'] + " " +
                                           lang_info['babel'].display_name)
        text += strings['select_pm_lang']

        # TODO: Connected chat lang info

    else:
        text = strings['chat_lang'].format(lang=lang_info['flag'] + " " +
                                           lang_info['babel'].display_name)
        text += strings['select_chat_lang']

    for lang in LANGUAGES.values():
        lang_info = lang['language_info']
        markup.insert(
            InlineKeyboardButton(
                lang_info['flag'] + " " + lang_info['name'],
                callback_data=select_lang_cb.new(lang=lang_info['code'])))

    markup.add(
        InlineKeyboardButton(strings['crowdin_btn'],
                             url='https://crowdin.com/project/sophiebot'))

    await message.reply(text, reply_markup=markup)
Example #4
0
async def select_lang_keyboard(message, strings, edit=False):
    markup = InlineKeyboardMarkup(row_width=2)
    task = message.reply if edit is False else message.edit_text

    lang_info = await get_chat_lang_info(message.chat.id)

    if message.chat.type == "private":
        text = strings["your_lang"].format(lang=lang_info["flag"] + " " +
                                           lang_info["babel"].display_name)
        text += strings["select_pm_lang"]

    # TODO: Connected chat lang info

    else:
        text = strings["chat_lang"].format(lang=lang_info["flag"] + " " +
                                           lang_info["babel"].display_name)
        text += strings["select_chat_lang"]

    for lang in LANGUAGES.values():
        lang_info = lang["language_info"]
        markup.insert(
            InlineKeyboardButton(
                lang_info["flag"] + " " + lang_info["babel"].display_name,
                callback_data=select_lang_cb.new(lang=lang_info["code"],
                                                 back_btn=edit is not False),
            ))

    markup.add(
        InlineKeyboardButton(strings["crowdin_btn"],
                             url="https://t.me/Daisysupport_official"))
    if edit:
        markup.add(
            InlineKeyboardButton(strings["back"], callback_data="go_to_start"))
    with suppress(MessageNotModified):
        await task(text, reply_markup=markup)
Example #5
0
async def select_lang_keyboard(message, strings, edit=False):
    markup = InlineKeyboardMarkup(row_width=2)
    task = message.reply if edit is False else message.edit_text

    lang_info = await get_chat_lang_info(message.chat.id)

    if message.chat.type == 'private':
        text = strings['your_lang'].format(lang=lang_info['flag'] + " " +
                                           lang_info['babel'].display_name)
        text += strings['select_pm_lang']

    # TODO: Connected chat lang info

    else:
        text = strings['chat_lang'].format(lang=lang_info['flag'] + " " +
                                           lang_info['babel'].display_name)
        text += strings['select_chat_lang']

    for lang in LANGUAGES.values():
        lang_info = lang['language_info']
        markup.insert(
            InlineKeyboardButton(
                lang_info['flag'] + " " + lang_info['babel'].display_name,
                callback_data=select_lang_cb.new(lang=lang_info['code'],
                                                 back_btn=edit is not False),
            ))

    markup.add(
        InlineKeyboardButton(strings['crowdin_btn'],
                             url='https://crowdin.com/project/hitsukix'))
    if edit:
        markup.add(
            InlineKeyboardButton(strings['back'], callback_data='go_to_start'))
    with suppress(MessageNotModified):
        await task(text, reply_markup=markup)
Example #6
0
def help_markup(modules):
    markup = InlineKeyboardMarkup()
    for module in modules:
        markup.insert(
            InlineKeyboardButton(module,
                                 callback_data=helpmenu_cb.new(mod=module)))
    return markup
Example #7
0
async def set_access(user: User, data: dict):
    bot_user = User.get(User.user_id == data['user_id'])
    bot_user.access = data['mode']

    keyboard = InlineKeyboardMarkup()
    callback_data = {
        'action': 'set_access',
        'user_id': bot_user.user_id,
        'mode': not bot_user.access
    }
    if bot_user.access:
        btn_text = STRESS['access_granted_btn']
        msg_text = STRESS['access_granted_msg']
    else:
        btn_text = STRESS['access_denied_btn']
        msg_text = STRESS['access_denied_msg']
    keyboard.insert(
        InlineKeyboardButton(text=btn_text,
                             callback_data=json.dumps(callback_data)))
    await bot.edit_message_reply_markup(ACCESS_CONTROL_CHANNEL_ID,
                                        bot_user.access_msg_id,
                                        reply_markup=keyboard)

    if bot_user.access:
        bot_user.state = 'default'
        keyboard = ReplyKeyboardMarkup(resize_keyboard=True,
                                       one_time_keyboard=True)
        keyboard.add(KeyboardButton('Главное меню'))
    else:
        keyboard = ReplyKeyboardRemove()
    bot_user.save()
    await bot.send_message(bot_user.user_id, msg_text, reply_markup=keyboard)
Example #8
0
def button_parser(chat_id, texts, pm=False, aio=False, row_width=None):
    buttons = InlineKeyboardMarkup(row_width=row_width) if aio else []
    pattern = r'\[(.+?)\]\((button|btn)(.+?)(:.+?|)(:same|)\)(\n|)'
    raw_buttons = re.findall(pattern, texts)
    text = re.sub(pattern, '', texts)
    for raw_button in raw_buttons:
        name = raw_button[0]
        action = raw_button[2]
        argument = raw_button[3][1:].lower() if raw_button[3] else ''

        if action in BUTTONS:
            cb = BUTTONS[action]
            string = f'{cb}_{argument}_{chat_id}' if argument else f'{cb}_{chat_id}'
            if aio:
                start_btn = InlineKeyboardButton(
                    name, url=f'https://t.me/{BOT_USERNAME}?start=' + string)
                cb_btn = InlineKeyboardButton(name, callback_data=string)
            else:
                start_btn = Button.url(
                    name, f'https://t.me/{BOT_USERNAME}?start=' + string)
                cb_btn = Button.inline(name, string)

            if cb.endswith('sm'):
                btn = cb_btn if pm else start_btn
            elif cb.endswith('cb'):
                btn = cb_btn
            elif cb.endswith('start'):
                btn = start_btn
            elif cb.startswith('url'):
                btn = Button.url(name, argument)
        elif action == 'url':
            if argument[0] == '/' and argument[1] == '/':
                argument = argument[2:]
            btn = InlineKeyboardButton(
                name, url=argument) if aio else Button.url(name, argument)
        else:
            # If btn not registred
            btn = None
            if argument:
                text += f'\n[{name}].(btn{action}:{argument})'
            else:
                text += f'\n[{name}].(btn{action})'
                continue

        if aio:
            buttons.insert(btn) if raw_button[4] else buttons.add(btn)
        else:
            if len(buttons) < 1 and raw_button[4]:
                buttons.add(btn) if aio else buttons.append([btn])
            else:
                buttons[-1].append(btn) if raw_button[4] else buttons.append(
                    [btn])

    if not aio and len(buttons) == 0:
        buttons = None

    if not text or text == ' ':  # TODO: Sometimes we can return text == ' '
        text = None

    return text, buttons
Example #9
0
async def warn_func(message: Message,
                    chat,
                    user,
                    text,
                    strings,
                    filter_action=False):
    chat_id = chat['chat_id']
    chat_title = chat['chat_title']
    by_id = BOT_ID if filter_action is True else message.from_user.id
    user_id = user['user_id'] if filter_action is False else user

    if user_id == BOT_ID:
        await message.reply(strings['warn_sofi'])
        return

    if not filter_action:
        if user_id == message.from_user.id:
            await message.reply(strings['warn_self'])
            return

    if await is_user_admin(chat_id, user_id):
        if not filter_action:
            await message.reply(strings['warn_admin'])
        return

    reason = text
    warn_id = str((await db.warns.insert_one({
        'user_id': user_id,
        'chat_id': chat_id,
        'reason': str(reason),
        'by': by_id
    })).inserted_id)

    admin = await get_user_link(by_id)
    member = await get_user_link(user_id)
    text = strings['warn'].format(admin=admin,
                                  user=member,
                                  chat_name=chat_title)

    if reason:
        text += strings['warn_rsn'].format(reason=html.escape(reason))

    warns_count = await db.warns.count_documents({
        'chat_id': chat_id,
        'user_id': user_id
    })

    buttons = InlineKeyboardMarkup().add(
        InlineKeyboardButton("тЪая╕П Remove warn",
                             callback_data='remove_warn_{}'.format(warn_id)))

    if await db.rules.find_one({'chat_id': chat_id}):
        buttons.insert(
            InlineKeyboardButton("ЁЯУЭ Rules",
                                 url=await
                                 get_start_link(f'btn_rules_{chat_id}')))

    if warn_limit := await db.warnlimit.find_one({'chat_id': chat_id}):
        max_warn = int(warn_limit['num'])
Example #10
0
def get_help(chat_id):
    text = "Select module to get help"
    counter = 0
    buttons = InlineKeyboardMarkup(row_width=2)
    for module in HELP:
        counter += 1
        btn_name = get_string(module, "btn", chat_id, dir="HELPS")
        buttons.insert(InlineKeyboardButton(btn_name, callback_data=help_page_cp.new(module=module)))
    return text, buttons
Example #11
0
async def categories_keyboard():
    CURRENT_LEVEL = 0
    markup = InlineKeyboardMarkup(row_width=2)

    categories = await get_categories()
    for category in categories:
        button_text = f'{category.category_name}'
        callback_data = make_callback_data(level=CURRENT_LEVEL + 1, category=category.category_code)
        markup.insert(
            InlineKeyboardButton(text=button_text, callback_data=callback_data)
        )
    return markup
Example #12
0
async def get_mod_help_callback(query, callback_data=False, **kwargs):
    chat_id = query.message.chat.id
    message = query.message
    module = callback_data['module']
    lang = get_chat_lang(chat_id)
    buttons = InlineKeyboardMarkup(row_width=2)
    text = LANGUAGES[lang]["HELPS"][module]['text']
    if 'buttons' in LANGUAGES[lang]["HELPS"][module]:
        counter = 0
        for btn in LANGUAGES[lang]["HELPS"][module]['buttons']:
            counter += 1
            btn_name = LANGUAGES[lang]["HELPS"][module]['buttons'][btn]
            buttons.insert(InlineKeyboardButton(
                btn_name, callback_data=help_btn_cp.new(module=module, btn=btn)))
    buttons.add(InlineKeyboardButton("Back", callback_data='get_help'))
    await message.edit_text(text, reply_markup=buttons)
Example #13
0
async def warn_user(message, strings, status, chat_id, chat_title):
    user, reason = await get_user_and_text(message)
    if not user:
        return
    user_id = int(user['user_id'])
    if user_id in WHITELISTED:
        await message.reply(strings['usr_whitelist'])
        return
    if user_id in await get_chat_admins(chat_id):
        await message.reply(strings['Admin_no_wrn'])
        return

    rndm = randomString(15)
    mongodb.warns.insert_one({
        'warn_id': rndm,
        'user_id': user_id,
        'group_id': chat_id,
        'reason': str(reason)
    })
    admin_id = message.from_user.id
    admin = mongodb.user_list.find_one({'user_id': admin_id})
    admin_str = await user_link_html(admin['user_id'])
    user_str = await user_link_html(user['user_id'])
    text = strings['warn'].format(admin=admin_str,
                                  user=user_str,
                                  chat_name=chat_title)
    if reason:
        text += strings['warn_rsn'].format(reason=reason)

    old = mongodb.warns.find({'user_id': user_id, 'group_id': chat_id})
    h = 0
    for suka in old:
        h += 1

    buttons = InlineKeyboardMarkup().add(
        InlineKeyboardButton("тЪая╕П Remove warn",
                             callback_data='remove_warn_{}'.format(rndm)))
    rules = mongodb.rules.find_one({"chat_id": chat_id})

    if rules:
        buttons.insert(
            InlineKeyboardButton("ЁЯУЭ Rules",
                                 callback_data='get_note_{}_{}'.format(
                                     chat_id, rules['note'])))

    if db_data := mongodb.warnlimit.find_one({'chat_id': chat_id}):
        warn_limit = int(db_data['num'])
Example #14
0
async def connect_chat_keyboard(message, strings, chat):
    if chat['status'] != 'private':
        text = strings['connected_chat'].format(chat_name=chat['chat_title'])
    else:
        text = ''

    text += strings['select_chat_to_connect']
    markup = InlineKeyboardMarkup(row_width=1)

    if 'history' in (
            connected := await db.connections_v2.find_one({'user_id': message.from_user.id},
                                                          {'history': {'$slice': -3}})):
        for chat_id in reversed(connected['history']):
            chat = await db.chat_list.find_one({'chat_id': chat_id})
            markup.insert(InlineKeyboardButton(
                chat['chat_title'],
                callback_data=connect_to_chat_cb.new(chat_id=chat_id))
            )
Example #15
0
async def add_handler(message, chat, strings):
    # filters doesn't support anon admins
    if message.from_user.id == 1087968824:
        return await message.reply(strings["anon_detected"])
    # if not await check_admin_rights(message, chat_id, message.from_user.id, ["can_change_info"]):
    # return await message.reply("You can't change info of this group")

    handler = get_args_str(message)

    if handler.startswith("re:"):
        pattern = handler
        random_text_str = "".join(random.choice(printable) for i in range(50))
        try:
            regex.match(pattern, random_text_str, timeout=0.2)
        except TimeoutError:
            await message.reply(strings["regex_too_slow"])
            return
    else:
        handler = handler.lower()

    text = strings["adding_filter"].format(
        handler=handler, chat_name=chat["chat_title"]
    )

    buttons = InlineKeyboardMarkup(row_width=2)
    for action in FILTERS_ACTIONS.items():
        filter_id = action[0]
        data = action[1]

        buttons.insert(
            InlineKeyboardButton(
                await get_string(
                    chat["chat_id"], data["title"]["module"], data["title"]["string"]
                ),
                callback_data=filter_action_cp.new(filter_id=filter_id),
            )
        )
    buttons.add(InlineKeyboardButton(strings["cancel_btn"], callback_data="cancel"))

    user_id = message.from_user.id
    chat_id = chat["chat_id"]
    redis.set(f"add_filter:{user_id}:{chat_id}", handler)
    if handler is not None:
        await message.reply(text, reply_markup=buttons)
Example #16
0
def wallet_menu_inl(bch, wallet_id, is_subscribe):
    keyboard = InlineKeyboardMarkup(row_width=2)

    keyboard.add(
        InlineKeyboardButton(_('Получать обновления: {status}'.format(
            status='✅' if is_subscribe else '❌')),
                             callback_data='{}_{}_subscribe_to_updates'.format(
                                 bch, wallet_id)))

    keyboard.add(
        InlineKeyboardButton(_('Указать имя'),
                             callback_data='{}_{}_set_address_name'.format(
                                 bch, wallet_id)))

    keyboard.insert(
        InlineKeyboardButton(_('Сделать основным'),
                             callback_data='{}_{}_set_address_as_main'.format(
                                 bch, wallet_id)))
    keyboard.insert(
        InlineKeyboardButton(_('Удалить кошелек'),
                             callback_data='{}_{}_try_remove_address'.format(
                                 bch, wallet_id)))
    keyboard.insert(
        InlineKeyboardButton(_('Приватный ключ'),
                             callback_data='{}_{}_view_private_key'.format(
                                 bch, wallet_id)))

    keyboard.add(InlineKeyboardButton(_('Назад'), callback_data=f'{bch}_view'))
    return keyboard
Example #17
0
async def add_handler(message, chat, strings):
    # filters doesn't support anon admins
    if message.from_user.id == 1087968824:
        return await message.reply(strings['anon_detected'])

    handler = get_args_str(message)

    if handler.startswith('re:'):
        pattern = handler
        random_text_str = ''.join(random.choice(printable) for i in range(50))
        try:
            regex.match(pattern, random_text_str, timeout=0.2)
        except TimeoutError:
            await message.reply(strings['regex_too_slow'])
            return
    else:
        handler = handler.lower()

    text = strings['adding_filter'].format(handler=handler,
                                           chat_name=chat['chat_title'])

    buttons = InlineKeyboardMarkup(row_width=2)
    for action in FILTERS_ACTIONS.items():
        filter_id = action[0]
        data = action[1]

        buttons.insert(
            InlineKeyboardButton(
                await get_string(chat['chat_id'], data['title']['module'],
                                 data['title']['string']),
                callback_data=filter_action_cp.new(filter_id=filter_id)))
    buttons.add(
        InlineKeyboardButton(strings['cancel_btn'], callback_data='cancel'))

    user_id = message.from_user.id
    chat_id = chat['chat_id']
    redis.set(f'add_filter:{user_id}:{chat_id}', handler)
    if handler is not None:
        await message.reply(text, reply_markup=buttons)
Example #18
0
async def subcategories_keyboard(category):
    CURRENT_LEVEL = 1
    markup = InlineKeyboardMarkup(row_width=2)

    subcategories = await get_subcategories(category=category)
    for subcategory in subcategories:
        button_text = f"{subcategory.subcategory_name}"
        callback_data = make_callback_data(
                                        level=CURRENT_LEVEL + 1,
                                        category=category,
                                        subcategory=subcategory.subcategory_code,
        )
        markup.insert(
            InlineKeyboardButton(text=button_text, callback_data=callback_data)
        )
        
    markup.row(
        InlineKeyboardButton(
                        text="Back",
                        callback_data=make_callback_data(level=CURRENT_LEVEL - 1)
        )
    )
    return markup
Example #19
0
async def task(message: types.Message):
    inline_button_add = InlineKeyboardButton('Добавить задачу 📋',
                                             callback_data=task_callback.new(
                                                 0, 'add'))
    inline_button_remove_all = InlineKeyboardButton(
        'Удалить все 💥', callback_data=task_callback.new(0, 'remove_all'))
    inline_task = InlineKeyboardMarkup().row(inline_button_add,
                                             inline_button_remove_all)
    await message.answer('<b> 💡 Твои задачи </b>',
                         parse_mode='HTML',
                         reply_markup=inline_task)
    db_session = message.bot.get('db')
    async with db_session() as session:
        sql = select(Task).where(Task.student == message.from_user.id)
        request = await session.execute(sql)
        tasks = request.scalars()
        k = 0
        for task in tasks:
            k += 1
            inline_task = InlineKeyboardMarkup()
            # Если задача готова то не надо кнопки
            if task.status != 'Готово':
                inline_task.insert(
                    InlineKeyboardButton('Выполнено✅',
                                         callback_data=task_callback.new(
                                             task.id, 'done')))
            inline_task.insert(
                InlineKeyboardButton('Удалить💥',
                                     callback_data=task_callback.new(
                                         task.id, 'delete')))
            inline_task.insert(
                InlineKeyboardButton('Изменить⚙',
                                     callback_data=task_callback.new(
                                         task.id, 'change')))
            await message.answer(
                f"<b> {time_lesson.emojiStatus[task.status]} {task.lesson} | {task.name} | {task.desc} \n Срок до {time_lesson.emojiToday[task.time.weekday()+1]} - {task.time.strftime('%d.%m.%y')} </b> \n ",
                parse_mode='HTML',
                reply_markup=inline_task)
        if k == 0:
            await message.answer("Пока что у тебя нету задач",
                                 parse_mode='HTML')
Example #20
0
            chat_title = connected_data['chat_id']
        text = strings['connected_chat:cmds'].format(
            chat_name=chat_title,
            # disconnect is builtin command, should not be shown
            commands=", ".join(f"<code>/{cmd}</code>"
                               for cmd in connected_data['command']
                               if cmd != "disconnect"))
    else:
        text = ''

    text += strings['select_chat_to_connect']
    markup = InlineKeyboardMarkup(row_width=1)
    for chat_id in reversed(connected_data['history'][-3:]):
        chat = await db.chat_list.find_one({'chat_id': chat_id})
        markup.insert(
            InlineKeyboardButton(
                chat['chat_title'],
                callback_data=connect_to_chat_cb.new(chat_id=chat_id)))

    await message.reply(text, reply_markup=markup)


# Callback for prev. function
@register(connect_to_chat_cb.filter(), f='cb', allow_kwargs=True)
async def connect_chat_keyboard_cb(message, callback_data=False, **kwargs):
    chat_id = int(callback_data['chat_id'])
    chat = await db.chat_list.find_one({'chat_id': chat_id})
    await def_connect_chat(message.message,
                           message.from_user.id,
                           chat_id,
                           chat['chat_title'],
                           edit=True)
Example #21
0
async def warn_user(message, strings, status, chat_id, chat_title):
    user, reason = await aio_get_user(message)
    if not user:
        return
    user_id = int(user['user_id'])
    if user_id in WHITELISTED:
        await message.reply(strings['usr_whitelist'])
        return
    if user_id in await get_chat_admins(chat_id):
        await message.reply(strings['Admin_no_wrn'])
        return

    rndm = randomString(15)
    mongodb.warns.insert_one({
        'warn_id': rndm,
        'user_id': user_id,
        'group_id': chat_id,
        'reason': str(reason)
    })
    admin_id = message.from_user.id
    admin = mongodb.user_list.find_one({'user_id': admin_id})
    admin_str = await user_link_html(admin['user_id'])
    user_str = await user_link_html(user['user_id'])
    text = strings['warn'].format(admin=admin_str,
                                  user=user_str,
                                  chat_name=chat_title)
    if reason:
        text += strings['warn_rsn'].format(reason=reason)

    old = mongodb.warns.find({'user_id': user_id, 'group_id': chat_id})
    h = 0
    for suka in old:
        h += 1

    buttons = InlineKeyboardMarkup().add(
        InlineKeyboardButton("тЪая╕П Remove warn",
                             callback_data='remove_warn_{}'.format(rndm)))
    rules = mongodb.rules.find_one({"chat_id": chat_id})

    if rules:
        buttons.insert(
            InlineKeyboardButton("ЁЯУЭ Rules",
                                 callback_data='get_note_{}_{}'.format(
                                     chat_id, rules['note'])))

    warn_limit = mongodb.warnlimit.find_one({'chat_id': chat_id})

    if not warn_limit:
        warn_limit = 3
    else:
        warn_limit = int(warn_limit['num'])

    if is_user_premium(user_id):
        warn_limit += 1

    if h >= warn_limit:
        if await ban_user(message, user_id, chat_id, None) is False:
            return
        text += strings['warn_bun'].format(user=user_str)
        mongodb.warns.delete_many({'user_id': user_id, 'group_id': chat_id})
    else:
        text += strings['warn_num'].format(curr_warns=h, max_warns=warn_limit)

    await message.reply(text,
                        reply_markup=buttons,
                        disable_web_page_preview=True)
Example #22
0
async def get_build_info(message, **args):
    codename = message.text.split('@rSophieBot')[0][1:].lower()
    device = mongodb.ofox_devices.find_one({'codename': codename})
    if not device:
        return
    chat_id = message.chat.id
    chat_type = 'stable'
    files_dir = 'OrangeFox-Stable/'
    text = ''
    if chat_id in FOX_BETA_CHATS:
        text = '<b>OrangeFox Recovery Beta</b>\n'
        chat_type = 'beta'
        files_dir = 'OrangeFox-Beta/'

    if f'{chat_type}_build' not in device:
        text = f'This device not support {chat_type} builds, check '
        if chat_type == 'stable':
            text += '<a href="https://t.me/joinchat/HNZTNkxOlyslccxryvKeeQ">OrangeFox Beta chat</a>'
        else:
            text += '<a href="https://t.me/OrangeFoxChat">OrangeFox Main chat</a>'
        await message.reply(text)
        return

    last_build = device[chat_type + "_build"]

    text += f"📱 <b>{device['fullname']}</b> (<code>{device['codename']}</code>)"
    text += f'\n📄 Last {chat_type} build: <code>{last_build}</code>'
    date_str = datetime.datetime.fromtimestamp(
        device[f'{chat_type}_date']).strftime('%a %b %d %H:%M %Y')
    text += f'\n📅 Date: <code>{date_str}</code>'
    text += f"\n👨‍🔬 Maintainer: {device['maintainer']}"

    if 'status' in device:
        text += f", status: <code>{device['status']}</code>"

    if f'{chat_type}_md5' in device:
        text += f"\n✅ File MD5: <code>{device[chat_type + '_md5']}</code>"

    if f'{chat_type}_build_bugs' in device:
        text += f'\n🐞 Build Bugs:\n' + device[chat_type + '_build_bugs']

    if f'{chat_type}_special_notes' in device:
        text += f'\n📝 Build Notes:\n' + device[chat_type + '_special_notes']

    if os.path.exists(FOX_FILES_LOCAL + files_dir + codename + '/' +
                      last_build[:-3] + 'txt'):
        text += f"\n<a href=\"{FOX_DOMAIN + files_dir + codename + '/' + last_build[:-3] + 'txt'}\">🗒 View changelog and more info</a>"

    buttons = InlineKeyboardMarkup().add(
        InlineKeyboardButton("⬇️ Download this build",
                             url=FOX_DOMAIN + files_dir + codename + '/' +
                             last_build))

    if f'{chat_type}_sf' in device and device[f'{chat_type}_sf'] is True:
        print('owo')
        buttons.add(
            InlineKeyboardButton("🗄️ All builds", url=FOX_DOMAIN + files_dir))
        sf_url = 'https://sourceforge.net/projects/orangefox/files/' + codename + '/' + last_build
        buttons.insert(InlineKeyboardButton("☁️ Cloud", url=sf_url))
    else:
        buttons.insert(
            InlineKeyboardButton("🗄️ All builds", url=FOX_DOMAIN + files_dir))

    msg = await message.reply(text,
                              reply_markup=buttons,
                              disable_web_page_preview=True)

    # Del prev msg code
    old_msg = mongodb.old_fox_msgs.find_one({'chat_id': chat_id})
    new = {
        'chat_id': chat_id,
        'last_msg': msg.message_id,
        'last_user_msg': message.message_id
    }
    if not old_msg:
        mongodb.old_fox_msgs.insert_one(new)
        return
    owo = []
    if 'last_msg' in old_msg:
        owo.append(old_msg['last_msg'])
    if 'last_user_msg' in old_msg:
        owo.append(old_msg['last_user_msg'])
    try:
        await tbot.delete_messages(chat_id, owo)
    except Exception:
        pass

    mongodb.old_fox_msgs.update_one({'_id': old_msg['_id']}, {'$set': new},
                                    upsert=True)
Example #23
0
def button_parser(chat_id, texts, pm=False, aio=False, row_width=None):
    buttons = InlineKeyboardMarkup(row_width=row_width) if aio else []
    pattern = r"\[(.+?)\]\((button|btn|#)(.+?)(:.+?|)(:same|)\)(\n|)"
    raw_buttons = re.findall(pattern, texts)
    text = re.sub(pattern, "", texts)
    btn = None
    for raw_button in raw_buttons:
        name = raw_button[0]
        action = (raw_button[1]
                  if raw_button[1] not in ("button", "btn") else raw_button[2])

        if raw_button[3]:
            argument = raw_button[3][1:].lower().replace("`", "")
        elif action in ("#"):
            argument = raw_button[2]
            print(raw_button[2])
        else:
            argument = ""

        if action in BUTTONS.keys():
            cb = BUTTONS[action]
            string = f"{cb}_{argument}_{chat_id}" if argument else f"{cb}_{chat_id}"
            if aio:
                start_btn = InlineKeyboardButton(
                    name, url=f"https://t.me/{BOT_USERNAME}?start=" + string)
                cb_btn = InlineKeyboardButton(name, callback_data=string)
            else:
                start_btn = Button.url(
                    name, f"https://t.me/{BOT_USERNAME}?start=" + string)
                cb_btn = Button.inline(name, string)

            if cb.endswith("sm"):
                btn = cb_btn if pm else start_btn
            elif cb.endswith("cb"):
                btn = cb_btn
            elif cb.endswith("start"):
                btn = start_btn
            elif cb.startswith("url"):
                # Workaround to make URLs case-sensitive TODO: make better
                argument = raw_button[3][1:].replace(
                    "`", "") if raw_button[3] else ""
                btn = Button.url(name, argument)
            elif cb.endswith("rules"):
                btn = start_btn
        elif action == "url":
            argument = raw_button[3][1:].replace("`",
                                                 "") if raw_button[3] else ""
            if argument[0] == "/" and argument[1] == "/":
                argument = argument[2:]
            btn = (InlineKeyboardButton(name, url=argument)
                   if aio else Button.url(name, argument))
        else:
            # If btn not registred
            btn = None
            if argument:
                text += f"\n[{name}].(btn{action}:{argument})"
            else:
                text += f"\n[{name}].(btn{action})"
                continue

        if btn:
            if aio:
                buttons.insert(btn) if raw_button[4] else buttons.add(btn)
            else:
                if len(buttons) < 1 and raw_button[4]:
                    buttons.add(btn) if aio else buttons.append([btn])
                else:
                    buttons[-1].append(
                        btn) if raw_button[4] else buttons.append([btn])

    if not aio and len(buttons) == 0:
        buttons = None

    if not text or text.isspace():  # TODO: Sometimes we can return text == ' '
        text = None

    return text, buttons
Example #24
0
async def report_error(event, telethon=False):
    error = str(sys.exc_info()[1])
    class_error = sys.exc_info()[0].__name__

    if class_error == 'ChatWriteForbiddenError':
        # This error mean bot is muted in chat
        return
    elif class_error == 'BadRequest' and error == 'Have no rights to send a message':
        return
    elif class_error == 'RetryAfter':
        return

    if telethon is True:
        msg = event
        chat_id = msg.chat_id
        lib = 'Telethon'
    else:
        msg = event.message
        chat_id = msg.chat.id
        lib = 'Aiogram'

    date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
    logger.error("Error: " + date)
    logger.error("Lib: " + lib)

    if telethon is True:
        logger.error(traceback.format_exc())

    if DEBUG_MODE is True:
        await msg.reply(error)
        return

    new = {
        'error_class_name': class_error,
        'error': error,
        'date': datetime.datetime.now()
    }
    mongodb.errors.insert_one(new)

    text = "<b>Sorry, I encountered a error!</b>\n"
    text += f"If you wanna you can report it - just press the \"Report error\" button.\n"
    text += "Till you press report button your data will be only here.\n"
    text += "<a href=\"https://t.me/YanaBotGroup\">Sophie support chat</a>"

    ftext = "Sophie error log file."
    ftext += "\n______________________\n"
    ftext += "\nDate: " + date
    ftext += "\nLib: " + lib
    ftext += "\nGroup ID: " + str(chat_id)
    ftext += "\nSender ID: " + str(msg.from_user.id if lib ==
                                   "Aiogram" else msg.from_id)
    ftext += "\nText: " + str(msg.text or "")
    ftext += "\n\nRaw update text:\n"
    ftext += str(event)
    ftext += "\n\nTraceback info:\n"
    ftext += str(traceback.format_exc())
    ftext += "\n\nFormatted update text:\n"
    ftext += str(ujson.dumps(msg, indent=2))

    command = "git log --pretty=format:\"%an: %s\" -5"
    ftext += "\n\n\nLast 5 commits:\n"
    ftext += await term(command)

    buttons = InlineKeyboardMarkup(row_width=1).add(
        InlineKeyboardButton(
            "Delete message",
            callback_data='get_delete_msg_{}_admin'.format(chat_id)))

    if CONFIG['advanced']['errors_channel_enabled'] is True:
        buttons.insert(
            InlineKeyboardButton("Report error", callback_data='report_error'))

    await bot.send_document(chat_id,
                            types.InputFile(io.StringIO(ftext),
                                            filename="Error.txt"),
                            caption=text,
                            reply_to_message_id=msg.message_id
                            if lib == "Aiogram" else msg.message.id,
                            reply_markup=buttons)

    return