Пример #1
0
async def user_processing(user_id: int):
    """Обработка пользователя, запустившего бота."""
    if check_is_new_user(user_id) == True:
        db = requestDB(DB_PATH)
        db.add_user(user_id)
        db.close()
        get_users()
Пример #2
0
async def dialogue_processing(message: CompactMessage):
    """Функция обработки диалога между оператором и пользователем."""
    sender_id = message.sender_id
    #
    db = requestDB(DB_PATH)
    dialogue_data = db.get_dialogue(sender_id)
    operator_id = dialogue_data[0]
    questioner_id = dialogue_data[1]
    #
    if sender_id == operator_id:  # Sender is operator
        if message.text == 'Закончить диалог':
            db.oper_setStatus(operator_id, True)
            db.delete_dialogue(operator_id)
            await bot.send_message(chat_id=operator_id,
                                   text='Диалог закончен.',
                                   reply_markup=get_keyboard('Закончить'))
            await mailing_tickets_to_operator(message.sender_id)
            return None
        #
        if message.text != None:
            text = f"*Оператор {message.sender_first_name}:*\n{message.text}"
        else:
            text = f"*Оператор {message.sender_first_name}:*"
        await send_message(chat_id=questioner_id, message=message, text=text)
        #
    elif sender_id == questioner_id:  # Sender is questioner
        if message.text != None:
            text = f"*{message.sender_first_name}:*\n{message.text}"
        else:
            text = f"*{message.sender_first_name}:*"
        await send_message(chat_id=operator_id, message=message, text=text)
    db.close()
Пример #3
0
def get_users():
    """Получает всех пользователей бота и сохраняет их в глобальную переменную."""
    global users
    db = requestDB(DB_PATH)
    temp = db.get_users()
    for user in temp:
        users.append(user[0])
    db.close()
Пример #4
0
def get_banned_users() -> list:
    """Получает всех заблокированных пользователей из БД и возвращает их."""
    db = requestDB(DB_PATH)
    temp = db.get_users_in_blocklist()
    db.close()
    banned_users = []
    for b_user in temp:
        banned_users.append(b_user[0])
    return banned_users
Пример #5
0
async def unblock_user(operator_id: int, user_id: int):
    """Разблокирует пользователя. Удаляет его из специальной таблицы в БД."""
    db = requestDB(DB_PATH)
    db.unblock_user(user_id)
    db.close()
    #
    await bot.send_message(chat_id=operator_id,
                           text=f'Вы разблокировали пользователя {user_id}.')
    await bot.send_message(chat_id=user_id, text=f'Вы были разблокированы.')
Пример #6
0
async def ban_user(operator_id: int, user_id: int):
    """Блокирует пользователя. Добавляет его в специальную таблицу в БД."""
    db = requestDB(DB_PATH)
    db.ban_user(user_id)
    db.close()
    #
    await bot.send_message(chat_id=operator_id,
                           text=f'Вы заблокировали пользователя {user_id}.')
    await bot.send_message(chat_id=user_id, text=f'Вы были заблокированы.')
Пример #7
0
def check_user_in_dialogs(user_id: int) -> bool:
    """Проверяет числится ли пользователь в каком-либо из открытых диалогов."""
    db = requestDB(DB_PATH)
    dialogs = db.get_dialogs()
    db.close()
    #
    for dialogue in dialogs:
        if user_id in dialogue:
            return True
    return False
Пример #8
0
async def error_bot_blocked(update: types.Update, exception: BotBlocked):
    """Функция срабатывает при попытке взаимодействия с пользователем, который заблокировал бота."""
    user_id = update.message.from_user.id
    db = requestDB(DB_PATH)
    db.delete_user(user_id)
    if check_user_is_operator(user_id):
        db.delete_operator(user_id)
    elif check_user_in_dialogs(user_id):
        db.delete_dialogue(user_id)
    db.close()
    return True
Пример #9
0
async def add_ticket_to_db(message: CompactMessage):
    '''Добавляет тикет в базу данных.'''
    sender_id = message.sender_id
    sender_first_name = message.sender_first_name
    text = message.text
    file_id = message.file_id
    content_type = message.content_type
    #
    db = requestDB(DB_PATH)
    db.add_ticket_to_db(sender_id, sender_first_name, text, file_id,
                        content_type)
    db.close()
Пример #10
0
async def process_callback_question_inl_btn(
        callback_querry: types.CallbackQuery):
    """Функция, выполняемая когда оператор нажимает на inline-кнопку ответа на тикет."""
    operator_id = callback_querry.from_user.id
    user_id = callback_querry.data.replace('question', '')
    #
    db = requestDB(DB_PATH)
    db.oper_setStatus(operator_id, False)
    db.add_dialogue(operator_id, user_id)
    db.delete_ticket(user_id)
    db.close()
    #
    await bot.send_message(chat_id=user_id, text='Оператор принял ваш вопрос.')
    await bot.send_message(chat_id=operator_id,
                           text='Вы приняли вопрос.',
                           reply_markup=get_keyboard('Закончить диалог'))
Пример #11
0
async def mailing_tickets_to_operator(operator_id: int):
    '''Если есть неотвеченные тикеты бот присылает их оператору.'''
    db = requestDB(DB_PATH)
    tickets = db.get_all_tickets()
    db.close()
    #
    if len(tickets) == 0:
        return
    #
    await bot.send_message(operator_id, text='Ждут ответа:')
    for ticket in tickets:
        sender_id = ticket[0]
        sender_first_name = ticket[1]
        text = ticket[2]
        file = ticket[3]
        content_type = ticket[4]
        #
        if text != None:
            text = f"*{sender_first_name} ({sender_id}):*\n{text}"
        else:
            text = f"*{sender_first_name} ({sender_id})*"
        #
        inline_btn_1 = InlineKeyboardButton(text='Ответить',
                                            callback_data='question' +
                                            str(sender_id))
        inline_btn_2 = InlineKeyboardButton(text='Заблокировать',
                                            callback_data='ban' +
                                            str(sender_id))
        inline_markup = InlineKeyboardMarkup().add(inline_btn_1).add(
            inline_btn_2)
        #
        await send_ticket(chat_id=operator_id,
                          content_type=content_type,
                          text=text,
                          file=file,
                          reply_markup=inline_markup)
Пример #12
0
async def check_operator_command(message: CompactMessage, user_id: int):
    """Проверяет команды оператора."""
    db = requestDB(DB_PATH)
    if message.text == 'Начать':
        db.oper_setStatus(user_id, True)
        #
        markup = get_keyboard('Закончить')
        await bot.send_message(
            chat_id=user_id,
            text=
            'Вы начали работу, вам будут приходить вопросы по мере их поступления.',
            reply_markup=markup)
        #
        await mailing_tickets_to_operator(message.sender_id)
    elif message.text == 'Закончить':
        db.oper_setStatus(user_id, False)
        markup = get_keyboard('Начать')
        await bot.send_message(chat_id=user_id,
                               text='Вы закончили обрабокту вопросов.',
                               reply_markup=markup)
    elif 'ban' in message.text:
        user_id = message.text.replace('ban', '')
        if user_id == '':
            return
        operator_id = message.sender_id
        #
        if int(user_id) in users:
            await ban_user(operator_id, user_id)
        else:
            await bot.send_message(
                chat_id=operator_id,
                text='Пользователя с указанным ID не существует.')
    elif 'unblock' in message.text:
        user_id = message.text.replace('unblock', '')
        if user_id == '':
            return
        operator_id = message.sender_id
        #
        if int(user_id) in get_banned_users():
            await unblock_user(operator_id, user_id)
        else:
            await bot.send_message(
                chat_id=operator_id,
                text='Пользователя с указанным ID не существует.')
    elif 'connect' in message.text:
        user_id = message.text.replace('connect', '')
        if user_id == '':
            return
        operator_id = message.sender_id
        #
        if int(user_id) in users:
            db.oper_setStatus(operator_id, False)
            db.add_dialogue(operator_id, user_id)
            markup = get_keyboard('Закончить диалог')
            await bot.send_message(
                chat_id=operator_id,
                text=f'Вы подключились к диалогу с пользователем {user_id}.',
                reply_markup=markup)
        else:
            await bot.send_message(
                chat_id=operator_id,
                text='Пользователя с указанным ID не существует.')
    db.close()
Пример #13
0
def get_free_operators() -> list:
    """Получает всех свободных операторов бота и сохраняет их возвращает их."""
    db = requestDB(DB_PATH)
    free_operators = db.get_free_operators()
    db.close()
    return free_operators