Telegram Bot. Автоответчик

Некоторое время назад я столкнулся с проблемой, которая заставила написать Telegram бота. Хочу рассказать о проблеме, поделиться мыслями. И, конечно, выложу исходный код Бота.

Приближался очередной «отпуск» 2024 года.

«Под обстрелом» (сообщений и звонков) — путь к выгоранию.

Думаю, что не ошибусь, если скажу, что многие IT-специалисты сталкиваются с серьезной проблемой — невозможностью полноценно отдохнуть даже во время отпуска. Время, предназначенное для восстановления сил и перезагрузки, часто превращается в продолжение рабочей недели, только без официального расписания. Постоянные рабочие сообщения и звонки нарушают личные границы и планы. Это ухудшает качество отдыха, способствует профессиональному выгоранию. Хуже того, это приводит к снижению эффективности работы в дальнейшем, после «отпуска».

Что не так? Почему это происходит?

Современные средства коммуникации, такие как Telegram, электронная почта и другие мессенджеры, делают человека доступным круглосуточно. Не берусь говорить за всех, но лично меня крайне раздражают красные кружочки с количеством не отвеченных сообщений на иконках приложений. Очевидно, так и задумано; чтобы человека тянуло «избавиться» от них, прочитав, далеко не всегда «желанное» сообщение. Даже если сотрудник включил автоответчик в почте или указал в мессенджере статус "в отпуске", поток сообщений коллег, клиентов или руководства часто не прекращается. Это приводит к ситуации, когда сотрудник, вместо того чтобы расслабляться и восстанавливать силы, вынужден постоянно отвлекаться на рабочие вопросы. Причина такой ситуации — отсутствие культуры уважения личных границ; а также пренебрежение разработанными бизнес-процессами: когда проще написать коллеге напрямую вместо того, чтобы направить обращение в службу «одного окна» (Helpdesk) – и дождаться ответа, согласно специально для того установленным правилам. Многие считают, что возможность мгновенно связаться с человеком дает им право на немедленный ответ, вне зависимости от того, находится ли он в отпуске или нет. Иронично, но те, кто активно беспокоит других в отпуске, зачастую сами стараются избегать работы в свободное время.

На пути к выгоранию …

Постоянное нарушение личных границ в отпуске напрямую связано с профессиональным выгоранием. Выгорание — это состояние эмоционального, физического и психического истощения, вызванное длительным воздействием стресса на работе. Если сотрудник не может полноценно отдохнуть, организм и психика не успевают восстановиться. Это приводит к накоплению стресса, который со временем перерастает в хроническое состояние усталости и апатии. Не имея возможности отключиться от рабочих вопросов, человек постоянно находится в напряжении. Даже находясь физически вне офиса, на уровне подсознания он как бы продолжает оставаться на работе. Это не только снижает качество отдыха, но и способствует быстрому выгоранию. Теряется интерес к работе, снижается продуктивность, ухудшается психоэмоциональное состояние.

На сколько всё плохо?

Во-первых, постоянное отвлечение на работу в отпуске мешает полноценному отдыху. Если постоянно отвлекаться на работу, в конечном итоге, возвращаются из отпуска не отдохнувшими, уставшими. Это негативно сказывается на продуктивности и ускоряет выгорание.

Во-вторых, эта практика разрушает доверие и взаимопонимание в команде. Если коллеги не уважают границы друг друга, это создает напряжение и ухудшает атмосферу в коллективе. Снижение мотивации и рост выгорания в долгосрочной перспективе наносят урон компании, приводя к текучке кадров и снижению качества работы.

Как же быть? Что же делать?

Каждый решает сам. В моём случае достаточно эффективным средством стал Telegram Bot. Идея примерно такова… Все люди, которые могут мне написать, условно поделены на две группы: сотрудники и все остальные. Соответственно, сотрудникам нужно отправлять одно сообщение, всем остальным другое (или не отправлять вообще). На пути к цели встает всего лишь одна проблема: как понять “Who is Who?” В моем случае в этом нет никаких проблем, так как существует некоторое количество групп, в которых состоят все (или почти все) сотрудники. Соответственно, если перед ответом проверять, состоит ли сотрудник в соответствующих группах, легко управлять тем, какое сообщение будет отправлено. Я не стал особо усложнять Бота, поэтому продумывать его более детально и делать более функциональным, не стал. Единственная дополнительная «фишка»: если я, всё же, решил ответить сам, Бот перестает отвечать этому конкретному пользователю на ближайшие 15 минут с момента моего последнего сообщения.


from telethon import TelegramClient, events
import time
from telethon.tl import functions, types

api_id = 'ТУЦ'
api_hash = 'ТУЦ'

client = TelegramClient('session_name', api_id, api_hash)

# Список названий рабочих чатов (через запятую)
GROUP_CHAT_NAMES = ['РАБОЧАЯ_ГРУППА_1','РАБОЧАЯ_ГРУППА_2']

# Переменная для хранения списка всех контактов
all_contacts = set()

# Словарь для хранения времени последнего ответа пользователя в каждом чате
last_user_reply_time = {}

# Функция для загрузки текста ответа из файла
def load_reply_text(filename):
    with open(filename, 'r', encoding='utf-8') as file:
        return file.read().strip()

# Загрузка текста ответа для коллег и друзей из файлов
reply_text_colleague = load_reply_text('reply_work2.txt')
reply_text_friend = load_reply_text('reply_friend2.txt')

@client.on(events.NewMessage(incoming=True))
async def handler(event):
    global all_contacts, last_user_reply_time

    # Проверяем, является ли чат личным
    if not event.is_private:
        return

    # Получаем текущий чат и время
    chat_id = event.chat_id
    current_time = time.time()

    # Проверяем, прошло ли 15 минут с момента последнего ответа пользователя в данном чате
    if chat_id in last_user_reply_time and current_time - last_user_reply_time[chat_id] < 15 * 60:
        return

    # Получаем отправителя сообщения
    sender = await event.get_sender()
    sender_name = sender.first_name if sender.first_name else "Unknown"

    # Проверяем, является ли отправитель контактом из списка GROUP_CHAT_NAMES
    if sender_name in all_contacts:
        await client.send_message(event.chat_id, reply_text_colleague)
    else:
        await client.send_message(event.chat_id, reply_text_friend)

@client.on(events.NewMessage(outgoing=True))
async def outgoing_handler(event):
    global last_user_reply_time

    # Проверяем, является ли чат личным
    if not event.is_private:
        return

    # Обновляем время последнего ответа пользователя в данном чате
    chat_id = event.chat_id
    last_user_reply_time[chat_id] = time.time()

async def fetch_contacts():
    global all_contacts

    # Получаем список всех диалогов пользователя
    async for dialog in client.iter_dialogs():
        # Проверяем, является ли диалог групповым чатом из списка GROUP_CHAT_NAMES
        if dialog.name in GROUP_CHAT_NAMES:
            # Получаем список участников чата и добавляем их в общий список контактов
            async for member in client.iter_participants(dialog):
                all_contacts.add(member.first_name if member.first_name else "Unknown")

    # Выводим список всех контактов в стандартный вывод
    print("Список всех контактов:", all_contacts)

with client:
    # Получаем список всех контактов перед началом работы
    client.loop.run_until_complete(fetch_contacts())
    client.run_until_disconnected()