236 lines
9.9 KiB
Python
236 lines
9.9 KiB
Python
|
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update, ReplyKeyboardMarkup, ReplyKeyboardRemove
|
|||
|
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler, MessageHandler, ChatMemberHandler, filters, ApplicationBuilder
|
|||
|
from bot import config, text_msg_handlers, photo_msg_handlers, video_msg_handlers, da_text_msg_scenario
|
|||
|
import re
|
|||
|
from urllib.parse import urlparse
|
|||
|
from bot.DaMsg import DaMsg
|
|||
|
from datetime import datetime, timedelta
|
|||
|
|
|||
|
from bot.handlers.AdminActionsHandler import AdminActionsHandler
|
|||
|
from bot.handlers.SuperAdminHandler import SuperAdminHandler
|
|||
|
from db.models.Chat import Chat
|
|||
|
from db.models.Booking import Booking
|
|||
|
from db.services.ChatService import ChatService
|
|||
|
from db.services.BookingService import BookingService
|
|||
|
from bot.keyboards.AdminAnswerToBooking import AdminAnswerToBooking
|
|||
|
from bot.keyboards.GetTableListKeyboard import GetTableListKeyboard
|
|||
|
from bot.handlers.BookingHandler import BookingHandler
|
|||
|
from bot.handlers.SetRoleHandler import SetRoleHandler
|
|||
|
from bot.handlers.AuthHandler import AuthHandler
|
|||
|
from bot.handlers.AdminHandler import AdminHandler
|
|||
|
from bot.keyboards.FirstStepKeyboard import FirstStepKeyboard
|
|||
|
from bot.msg.UserMsg import HelloMsg
|
|||
|
from itguild_api import client
|
|||
|
from bot.keyboards.FirstStepDeveloper import FirstStepDeveloper
|
|||
|
from bot.keyboards.FirstStepPartner import FirstStepPartner
|
|||
|
from bot import FIRST, SECOND, SET_EMAIL_STEP, REQUEST_CODE_STEP
|
|||
|
|
|||
|
|
|||
|
class GuildBot:
|
|||
|
|
|||
|
def __init__(self):
|
|||
|
self.add_new_flag = 0
|
|||
|
self.add_photo_flag = 0
|
|||
|
self.add_new_pool = []
|
|||
|
self.add_photo_pool = []
|
|||
|
self.add_video_pool = []
|
|||
|
self.event_pool = {}
|
|||
|
self.booking_pool = []
|
|||
|
|
|||
|
def run(self):
|
|||
|
TOKEN = config['TELEGRAM_TOKEN']
|
|||
|
|
|||
|
application = ApplicationBuilder().token(TOKEN).build()
|
|||
|
|
|||
|
conv_handler = ConversationHandler(
|
|||
|
entry_points=[
|
|||
|
CommandHandler('start', self.start),
|
|||
|
CommandHandler('menu', self.get_menu),
|
|||
|
CommandHandler('show_menu', self.show_menu),
|
|||
|
CallbackQueryHandler(AdminHandler.accept_booking, pattern='^accept=\d+$'),
|
|||
|
CallbackQueryHandler(AdminActionsHandler.admin_respond_to_vacancy, pattern='^admin_respond_to_vacancy?\S{3,}'),
|
|||
|
CallbackQueryHandler(AdminActionsHandler.request_sent, pattern='^request_sent?\S{3,}'),
|
|||
|
MessageHandler(filters.TEXT, SuperAdminHandler.super_admin_text)
|
|||
|
],
|
|||
|
states={ # словарь состояний разговора, возвращаемых callback функциями
|
|||
|
FIRST: [
|
|||
|
CallbackQueryHandler(AuthHandler.request_code, pattern='^request_code'),
|
|||
|
CallbackQueryHandler(SetRoleHandler.set_developer, pattern='^set_developer'),
|
|||
|
MessageHandler(filters.TEXT, SuperAdminHandler.super_admin_text)
|
|||
|
],
|
|||
|
SECOND: [
|
|||
|
CallbackQueryHandler(self.start_over, pattern='^start_menu'),
|
|||
|
CallbackQueryHandler(self.thx, pattern='^thx$'),
|
|||
|
],
|
|||
|
SET_EMAIL_STEP: [
|
|||
|
MessageHandler(filters.TEXT, SetRoleHandler.set_email)
|
|||
|
],
|
|||
|
REQUEST_CODE_STEP: [
|
|||
|
MessageHandler(filters.TEXT, AuthHandler.add_user_at_dialog)
|
|||
|
],
|
|||
|
},
|
|||
|
fallbacks=[CommandHandler('start', self.start)],
|
|||
|
)
|
|||
|
|
|||
|
application.add_handler(conv_handler)
|
|||
|
|
|||
|
text_handler = MessageHandler(filters.TEXT & (~filters.COMMAND), self.text_msg)
|
|||
|
application.add_handler(text_handler)
|
|||
|
|
|||
|
application.run_polling()
|
|||
|
|
|||
|
def welcome(self, update, context):
|
|||
|
update.message.reply_text(
|
|||
|
"""Привет. Это новостной бот канала "проСМИсь» Присылайте фото, видео, сводки и любую информацию, о которой хотите рассказать. Мы все обязательно изучим.""")
|
|||
|
|
|||
|
async def start(self, update, context):
|
|||
|
# `bot.send_message` это метод Telegram API
|
|||
|
# `update.effective_chat.id` - определяем `id` чата,
|
|||
|
# откуда прилетело сообщение
|
|||
|
|
|||
|
dialog = client.tgBot.set_dialog({
|
|||
|
'dialog_id': update.effective_chat.id,
|
|||
|
'username': update.effective_chat.username if update.effective_chat.username else "",
|
|||
|
'first_name': update.effective_chat.first_name if update.effective_chat.first_name else "",
|
|||
|
'last_name': update.effective_chat.last_name if update.effective_chat.last_name else "",
|
|||
|
})
|
|||
|
|
|||
|
reply_markup = FirstStepKeyboard()
|
|||
|
|
|||
|
print(update.effective_chat)
|
|||
|
print(dialog)
|
|||
|
|
|||
|
await update.message.reply_text(HelloMsg.get_msg(), reply_markup=reply_markup.create_keyboard(), parse_mode="html")
|
|||
|
|
|||
|
# reaply_k = [['/start', '/menu']]
|
|||
|
# markup = ReplyKeyboardMarkup(reaply_k, one_time_keyboard=False)
|
|||
|
# update.message.reply_text('Пожалуйста, выберите:', reply_markup=markup)
|
|||
|
|
|||
|
return FIRST
|
|||
|
|
|||
|
def start_over(self, update, context):
|
|||
|
"""Тот же текст и клавиатура, что и при `/start`, но не как новое сообщение"""
|
|||
|
# Получаем `CallbackQuery` из обновления `update`
|
|||
|
query = update.callback_query
|
|||
|
# На запросы обратного вызова необходимо ответить,
|
|||
|
# даже если уведомление для пользователя не требуется.
|
|||
|
# В противном случае у некоторых клиентов могут возникнуть проблемы.
|
|||
|
query.answer()
|
|||
|
|
|||
|
reply_markup = FirstStepKeyboard()
|
|||
|
# Отредактируем сообщение, вызвавшее обратный вызов.
|
|||
|
# Это создает ощущение интерактивного меню.
|
|||
|
query.edit_message_text(
|
|||
|
'Пожалуйста, выберите:', reply_markup=reply_markup.create_keyboard()
|
|||
|
)
|
|||
|
# Сообщаем `ConversationHandler`, что сейчас находимся в состоянии `FIRST`
|
|||
|
return FIRST
|
|||
|
|
|||
|
def show_menu(self, update, context):
|
|||
|
reply_markup = FirstStepKeyboard()
|
|||
|
update.message.reply_text('Пожалуйста, выберите:', reply_markup=reply_markup.create_keyboard())
|
|||
|
# context.bot.send_message(chat_id=update.effective_chat.id, text="Здесь будет меню")
|
|||
|
|
|||
|
return FIRST
|
|||
|
|
|||
|
def thx(self, update, context):
|
|||
|
query = update.callback_query
|
|||
|
query.answer()
|
|||
|
query.edit_message_text(text="Спасибо!")
|
|||
|
return ConversationHandler.END
|
|||
|
|
|||
|
def run_text_handlers(self, update, context):
|
|||
|
for handler in self.get_scenario(update, context):
|
|||
|
handler.handler(update, context)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def get_last_step():
|
|||
|
keyboard = [
|
|||
|
[
|
|||
|
InlineKeyboardButton("Меню", callback_data='start_menu'),
|
|||
|
InlineKeyboardButton("Завершить", callback_data='thx')
|
|||
|
],
|
|||
|
]
|
|||
|
return keyboard
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def get_time_variants():
|
|||
|
time = datetime(2024, 1, 1, 15, 00)
|
|||
|
keyboard = []
|
|||
|
for i in range(1, 15):
|
|||
|
keyboard.append(
|
|||
|
[
|
|||
|
InlineKeyboardButton(time.strftime("%H:%M"),
|
|||
|
callback_data="set_time={time}".format(time=time.strftime("%H:%M")))
|
|||
|
]
|
|||
|
)
|
|||
|
time = time + timedelta(minutes=30)
|
|||
|
|
|||
|
keyboard.append(
|
|||
|
[
|
|||
|
InlineKeyboardButton("Назад", callback_data="set_time=back")
|
|||
|
]
|
|||
|
)
|
|||
|
return keyboard
|
|||
|
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def get_date_to_booking():
|
|||
|
current_day = datetime.now()
|
|||
|
keyboard = []
|
|||
|
for i in range(1, 8):
|
|||
|
keyboard.append(
|
|||
|
[
|
|||
|
InlineKeyboardButton(current_day.strftime("%d.%m.%Y"),
|
|||
|
callback_data="set_date={date}".format(date=current_day.strftime("%d.%m.%Y")))
|
|||
|
]
|
|||
|
)
|
|||
|
current_day = current_day + timedelta(days=1)
|
|||
|
keyboard.append(
|
|||
|
[
|
|||
|
InlineKeyboardButton("Назад", callback_data="set_date=back")
|
|||
|
]
|
|||
|
)
|
|||
|
return keyboard
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def send_admins_notif(context, text, photo=None, video=None):
|
|||
|
admins = ChatService.get_admins()
|
|||
|
|
|||
|
for admin in admins:
|
|||
|
context.bot.send_message(chat_id=admin, text=text)
|
|||
|
if photo:
|
|||
|
context.bot.send_photo(chat_id=admin, photo=photo)
|
|||
|
if video:
|
|||
|
context.bot.send_video(chat_id=admin, video=video)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def send_booking_notif(context, book: Booking):
|
|||
|
admins = ChatService.get_admins()
|
|||
|
|
|||
|
text = "Новое бронирование:\nСтол: {table} \nДата и время: {d} \nТелефон: {p} \nПожелания: {c}".format(
|
|||
|
table=book.table,
|
|||
|
d=book.booking_date,
|
|||
|
p=book.phone,
|
|||
|
c=book.comments
|
|||
|
)
|
|||
|
|
|||
|
reply_markup = AdminAnswerToBooking()
|
|||
|
reply_markup.add_option("book_id", book.id)
|
|||
|
|
|||
|
for admin in admins:
|
|||
|
context.bot.send_message(chat_id=admin.chat_id, text=text, reply_markup=reply_markup.create_keyboard())
|
|||
|
|
|||
|
return ConversationHandler.END
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def send_user_booking_notif(context, chat_id, book: Booking):
|
|||
|
text = "Спасибо \nВаша заявка принята в обработку.\nСтол: {table} \nДата и время: {d} \nТелефон: {p} \nПожелания: {c}".format(
|
|||
|
table=book.table,
|
|||
|
d=book.booking_date,
|
|||
|
p=book.phone,
|
|||
|
c=book.comments
|
|||
|
)
|
|||
|
|
|||
|
context.bot.send_message(chat_id=chat_id, text=text)
|