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()
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()
def get_users(): """Получает всех пользователей бота и сохраняет их в глобальную переменную.""" global users db = requestDB(DB_PATH) temp = db.get_users() for user in temp: users.append(user[0]) db.close()
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
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'Вы были разблокированы.')
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'Вы были заблокированы.')
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
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
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()
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('Закончить диалог'))
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)
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()
def get_free_operators() -> list: """Получает всех свободных операторов бота и сохраняет их возвращает их.""" db = requestDB(DB_PATH) free_operators = db.get_free_operators() db.close() return free_operators