Files
kurator_bot/project/bot.py
T
2024-08-27 00:11:39 +03:00

204 lines
9.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import psycopg2
import telebot
from telebot import types
import re
from datetime import datetime, timedelta
import config
# Конфигурация
API_TOKEN = config.TOKEN
DATABASE_URL = config.DB_URL
SUPPORT_CHAT_ID = config.ADMIN_CHAT
SENIOR_CURATOR_CHAT_ID = config.SENIOR_CHAT
REQUEST_INTERVAL = timedelta(minutes=10) # Интервал между обращениями
bot = telebot.TeleBot(API_TOKEN)
# Подключение к базе данных
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()
# Команда /start
@bot.message_handler(commands=['start'])
def start_command(message):
user_id = message.from_user.id
cursor.execute("SELECT full_name, role FROM users WHERE user_id = %s", (user_id,))
user = cursor.fetchone()
if user:
bot.send_message(message.chat.id, f"Ваши данные:\nФИО: {user[0]}\nРоль: {user[1]}")
show_options(message, user[1])
else:
msg = bot.send_message(message.chat.id, "Добро пожаловать! Пожалуйста, укажите ваше полное имя.")
bot.register_next_step_handler(msg, process_full_name)
# Получаем ФИО пользователя
def process_full_name(message):
full_name = message.text
user_id = message.from_user.id
cursor.execute("INSERT INTO users (user_id, full_name) VALUES (%s, %s) ON CONFLICT (user_id) DO UPDATE SET full_name = EXCLUDED.full_name", (user_id, full_name))
conn.commit()
# Запрос роли пользователя с кнопками
markup = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
markup.add('Куратор', 'Первокурсник')
msg = bot.send_message(message.chat.id, "Пожалуйста, выберите вашу роль.", reply_markup=markup)
bot.register_next_step_handler(msg, process_role)
# Получаем роль пользователя
def process_role(message):
role = message.text
user_id = message.from_user.id
if role not in ["Куратор", "Первокурсник"]:
msg = bot.send_message(message.chat.id, "Пожалуйста, выберите роль из предложенных вариантов.")
bot.register_next_step_handler(msg, process_role)
return
cursor.execute("UPDATE users SET role = %s WHERE user_id = %s", (role, user_id))
conn.commit()
if role == "Куратор":
msg = bot.send_message(message.chat.id, "Какую группу вы курируете?")
else:
msg = bot.send_message(message.chat.id, "В какой группе вы учитесь?")
bot.register_next_step_handler(msg, process_group)
# Получаем группу пользователя
def process_group(message):
group_name = message.text
user_id = message.from_user.id
# Регулярное выражение для проверки формата группы
pattern = r'^[бсмБСМаА]\d{2}-\d{3}$'
if not re.match(pattern, group_name):
msg = bot.send_message(message.chat.id, "Некорректный формат группы. Пожалуйста, введите группу в формате: БXX-XXX (СXX-XXX)")
bot.register_next_step_handler(msg, process_group)
return
cursor.execute("SELECT full_name, role FROM users WHERE user_id = %s", (user_id,))
user_data = cursor.fetchone()
if user_data is None:
bot.send_message(message.chat.id, "Произошла ошибка. Пожалуйста, начните регистрацию заново.")
return
cursor.execute(
"UPDATE users SET group_name = %s WHERE user_id = %s",
(group_name, user_id)
)
conn.commit()
bot.send_message(message.chat.id, f"Регистрация завершена!\nФИО: {user_data[0]}\nРоль: {user_data[1]}")
show_options(message, user_data[1])
# Функция для отображения опций
def show_options(message, role):
markup = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
if role == "Куратор":
markup.add('Отчитаться', 'Тех. поддержка', 'Старший куратор')
elif role == "Первокурсник":
markup.add('Расскажу о кураторе', 'Тех. поддержка', 'Старший куратор')
bot.send_message(message.chat.id, "Выберите одну из опций:", reply_markup=markup)
# Проверка интервала времени с последнего обращения
def can_send_request(last_request_time):
if last_request_time is None:
return True
return datetime.now() - last_request_time >= REQUEST_INTERVAL
# Обработка обращений в тех.поддержку
@bot.message_handler(func=lambda message: message.text == "Тех. поддержка")
def tech_support(message):
user_id = message.from_user.id
cursor.execute("SELECT last_support_request FROM users WHERE user_id = %s", (user_id,))
last_support_request = cursor.fetchone()[0]
if not can_send_request(last_support_request):
diff = 10 - int(datetime.now().minute - last_support_request.minute)
minute_str = ''
if(diff == 1): minute_str = 'минута'
elif(diff in (2, 5)): minute_str = 'минуты'
else: minute_str = 'минут'
bot.send_message(message.chat.id, f"Вы недавно обращались в тех.поддержку. Пожалуйста, подождите {diff} {minute_str} перед следующим обращением.")
return show_options(message, "Куратор" if message.text == "Куратор" else "Первокурсник")
msg = bot.send_message(message.chat.id, "Пожалуйста, напишите ваше сообщение в тех.поддержку.")
bot.register_next_step_handler(msg, process_support_message)
# Обработка сообщения для тех.поддержки
def process_support_message(message):
support_message = message.text
user_id = message.from_user.id
name = message.from_user.username
# Отправляем сообщение в тех.поддержку
bot.send_message(SUPPORT_CHAT_ID, f"Сообщение от пользователя @{name}:\n{support_message}")
# Обновляем время последнего обращения в тех.поддержку
cursor.execute("UPDATE users SET last_support_request = %s WHERE user_id = %s", (datetime.now(), user_id))
conn.commit()
# Отправляем подтверждение пользователю
bot.send_message(message.chat.id, "Ваше сообщение отправлено в тех.поддержку. Спасибо!")
# Возвращаемся к меню выбора опций
cursor.execute("SELECT role FROM users WHERE user_id = %s", (user_id,))
role = cursor.fetchone()
if role:
show_options(message, role[0])
# Обработка обращения к старшему куратору
@bot.message_handler(func=lambda message: message.text == "Старший куратор")
def senior_curator(message):
user_id = message.from_user.id
cursor.execute("SELECT last_curator_request FROM users WHERE user_id = %s", (user_id,))
last_curator_request = cursor.fetchone()[0]
if not can_send_request(last_curator_request):
diff = 10 - int(datetime.now().minute - last_curator_request.minute)
minute_str = ''
if(diff == 1): minute_str = 'минута'
elif(diff in (2, 5)): minute_str = 'минуты'
else: minute_str = 'минут'
bot.send_message(message.chat.id, f"""Вы недавно обращались к старшему куратору. Пожалуйста, подождите {diff} {minute_str} перед следующим обращением.""")
return show_options(message, "Куратор" if message.text == "Куратор" else "Первокурсник")
msg = bot.send_message(message.chat.id, "Пожалуйста, напишите ваше сообщение для старшего куратора.")
bot.register_next_step_handler(msg, process_senior_curator_message)
# Обработка сообщения для старшего куратора
def process_senior_curator_message(message):
senior_message = message.text
user_id = message.from_user.id
name = message.from_user.username
# Отправляем сообщение старшему куратору
bot.send_message(SENIOR_CURATOR_CHAT_ID, f"Сообщение от пользователя @{name}:\n{senior_message}")
# Обновляем время последнего обращения к старшему куратору
cursor.execute("UPDATE users SET last_curator_request = %s WHERE user_id = %s", (datetime.now(), user_id))
conn.commit()
# Отправляем подтверждение пользователю
bot.send_message(message.chat.id, "Ваше сообщение отправлено старшему куратору. Спасибо!")
# Возвращаемся к меню выбора опций
cursor.execute("SELECT role FROM users WHERE user_id = %s", (user_id,))
role = cursor.fetchone()
if role:
show_options(message, role[0])
# Запуск бота
bot.polling(none_stop=True)