Package: django-tbot-messages
django-tbot-messagesСтруктура модуляКоманда сreate_messagesutils.pymessages.pyviews.pyБыстрый старт с модулемЛокализация сообщенийСистема диалоговОписаниеМодуль служит для удобной интеграции функции отключаемых сообщений с возможностью переводов.Также в модуле предусмотрена простая машина состояний и система диалогов.create_messagesКомандаmanage.py create_messagesдобавляет в базу данных сообщения описанные
в переменнойBOT_MESSAGESв файлеsettings.pyпроекта.Формат переменной BOT_MESSAGES:BOT_MESSAGES={'ChooseLanguage':{'text':'Выберите язык','buttons':[{'reply':True,'row':0,'text':'Русский'},{'reply':True,'row':0,'text':'Українська'}]},'Promo':{'text':'Вам доступен бесплатный тестовый 2ух недельный период на максимальных возможностях!\n','text_ua':'Промо українською',},'Menu':{'text':'Вам доступно главное меню.\n\n''В разделе "📝 Создать подписку" вы сможете создать запрос для поиска объявлений по заданным вами параметрам\n''В разделе "🗂 Мои подписки" вы сможете просмотреть/удалить созданные ранее вами запросы поиска авто.\n''В разделе "👨‍🔧 Техподдержка" вы сможете отправить сообщение нашему Администратору и получить ответ или консультацию\n''С помощью функции "🙅 Не беспокоить" вы сможете приостановить поиск объявлений и позднее его "🙋‍♂Восстановить".\n''В разделе "👤 Мой профиль" вы сможете просмотреть статус вашего текущего тарифа и продлить тариф.\n','text_ua':'Меню українською','buttons':[{'reply':True,'row':0,'text':'🗂 Мои подписки','text_ua':'🗂 Мої підписки'},{'reply':True,'row':0,'text':'📝 Создать подписку','text_ua':'📝 Створити підписку'},{'reply':True,'row':1,'text':'👨‍🔧 Техподдержка','text_ua':'👨‍🔧 Техпідтримка'},{'reply':True,'row':1,'text':'🙅 Не беспокоить','text_ua':'🙅 Не турбувати'},{'reply':True,'row':2,'text':'👤 Мой профиль и тарифы','text_ua':'👤 Мій профіль та тарифи'},]}}Конечно, помещать весь словарь в settings.py вас никто не просит...Всегда можно импортировать его из другого файла дабы не засорять настройки:settings.py...fromtbot.translationsimportmessagesBOT_MESSAGES=messages...СловарьBOT_MESSAGESсостоит из пар имени сообщения в БД и его параметров.Среди параметров указываются ключиtext_{locale}или простоtextесли мы хотим
использовать это значение по умолчанию.Также, среди параметров сообщения есть ключbuttons, значением которого является массив кнопок.buttonsможно не указывать если сообщение не содержит кнопок.
Каждая кнопка это словарь с параметрами:text         : str   текст кнопки используемый по умолчанию
  text_{locale}: str   текст кнопки используемый если в user_data есть ключ locale (не обязательно)
  callback_data: str   callback_data кнопки
  reply        : bool  при значении True кнопка становится ReplyButton (если параметр не указан или равен False - по умолчанию кнопка InlineKeyboardButton и требует параметр callback_data)
  inline_mode  : bool  при значении True кнопка обретает параметр switch_inline_query_chat и становится "точкой входа" в инлайн режим бота
  row          : int   номер ряда (начиная с нулевого), в котором будет отображена кнопка
  * url        : str   пока что такого параметра нет, но всему своё время!После того как вы создали словарьBOT_MESSAGES, запускайте командуmanage.py create_messages,
если вы добавляли локализацию текста (ключиtext_{locale}), вы увидите перечень добавленных
локализаций и вопрос:ARE YOU SURE YOU WANT TO ADD FOUND LOCALES? (Y/n)::После нажатия Enter команда сгенерирует новые моделиBotMessageиButtonкоторые будут содержать
поля с локализованным текстом.ДисклеймерКрайне рекомендую (на момент версии 0.2) выполнять командуmanage.py makemigrations <app>с указанием параметраapp!Это избавит вас от случайного удаления моделиBotMessageи перезаписи этой самой модели сгенерированной моделью с локализованным текстом.utils.pyВ этом файле вы найдете разные фильтры и функции облегчающие разработкуmessages.pyВmessages.pyприсутствуют классыBaseMessagesиBaseDialogs, работа с ними показываетсятутитутсоответственно.QuickstartПрежде всего, установите данный модульpip install django-tbot-messagesЕсли модулиtbot-baseиbot-storageне были установлены в вашем проекте,
не проблема - они указаны в зависимостях к данному модулю.Далее, будет описан пример создания проекта с использованиемtbot_messagesИнициализируйте приложениеtbotс помощьюmanage.py startapp tbotДобавьте их вINSTALLED_APPSвsettings.pyпроектаINSTALLED_APPS=[...'tbot','tbot_messages',]Не забудьте добавить BOT_STORAGE вsettings.py, указав обьект хранилищаstorage.pyfromosimportgetenvfrombot_storage.storageimportRedisStoragestorage=RedisStorage(host=getenv('REDIS_HOST','localhost'),username=getenv('REDIS_USER',None),password=getenv('REDIS_PASSWORD',None))settings.pyfrom.storageimportstorageBOT_STORAGE=storageТакже, создадим сообщения нашего бота в файлеtranslations.pymessages={'SupportText':{'text_ru':'Отправьте текст вашего сообщения. 🙂','text_ua':'Надішліть ваш запит','buttons':[{'reply':True,'row':0,'text_ru':'Главное меню','text_ua':'Головне меню'},]},'SupportSent':{'text_ru':'Я отправил ваш вопрос Администратору!🙂 Он ответит вам в ближайшее время!','text_ua':'Я надіслав ваше питання адміну. Очікуйте',},'SupportAnswer':{'text_ru':'Ответ от Администратора:\n'' - <code>{text}</code>','text_ua':'Відповідь адміна: <code>{text}</code>',}}Укажите значениеBOT_MESSAGESвsettings.py# tbot_base configurationBOT_HANDLERS=['tbot.dispatcher','tbot.handlers',]fromtbot.storageimportstoragefromtbot.translationsimportmessages# instance of storage (such as redis, db or another)BOT_STORAGE=storageBOT_MESSAGES=messagesНастройкаBOT_HANDLERSиспользуется при запуске проекта, она служит для
последовательной загрузки всех модулей с хендлерами вашего бота. Данная настройка подразумевается
при использовании базового модуляtbot_baseОкей, теперь можем выполнять миграцииmanage.py makemigrations && manage.py migrateВыполняем командуmanage.py create_messagesи подтверждаем генерацию моделей с локализациями нажатием клавиши Enter (всегда можно отказаться написавn)Бинго! Сообщения и кнопки создались, теперь переходим к классуBaseMessagesСоздадим файлmessages.pyи в нем опишем классMessagesунаследованный отBaseMessagesfromtbot_messages.messagesimportBaseMessagesclassMessages(BaseMessages):SupportText='SupportText'SupportSent='SupportSent'SupportAnswer='SupportAnswer'Мы должны присвоить обьектам сообщений их названия в БД (однажды я автоматизирую этот процесс, но пока наслаждайтесь)А теперь можем смело использовать обьект сообщения и отправлять его, если оно активноdispatcher.pyfromtelebotimporttypesfromtbot.messagesimportMessagesfromtbot_base.botimporttbot@tbot.message_handler(commands=['start'])defsupport_text(message:types.Message):user_id=message.from_user.idMessages.SupportText.send_if_active(user_id)Использование локализацииЯзык который будет использован при отправке сообщения во время
вызова методаsend_if_active()зависит от значенияlocaleв user_data.Чтобы предложить пользователю выбрать язык, сделаем простой хендлер нажатия
реплай кнопокРусскийиУкраїнськаdispatcher.pyfromtelebotimporttypesfromtbot_base.botimporttbotfrom.storageimportstorage@tbot.message_handler(func=lambdamessage:message.textin('Русский','Українська'))deflanguage_handler(message:types.Message):user_id=message.from_user.idifmessage.text=='Русский':locale=Noneelifmessage.text=='Українська':locale='ua'storage.update_user_data(user_id,'locale',locale)В данном случае, мы используем локализацию по умолчанию если был выбран русский язык.Т.е полеtextбудет использовано приlocale = None, но как толькоlocaleприобретает какое либо значение, текст сообщений берётся изtext_{locale}ДиалогиДиалоги идеально подходят создания форм.Например, сделаем простую регистрацию используя классDialogsиMessagesmessages.pyfromtbot_messages.messagesimportBaseMessages,BaseDialogsclassMessages(BaseMessages):AskName='AskName'AskPhone='AskPhone'AskEmail='AskEmail'classDialogs(BaseDialogs):REG=(Messages.AskName,Messages.AskPhone,Messages.AskEmail)И теперь напишем логику регистрацииdispatcher.pyfromtelebotimporttypesfromtbot_base.botimporttbotfrom.storageimportstorageasstfrom.messagesimportDialogsfrom.modelsimportUser@tbot.message_handler(commands=['start'])defstart_handler(message:types.Message):user_id=message.from_user.iduser=User.object.filter(id=user_id).first()ifnotuser:# флаг start в данном случае обязателенDialogs.REG.next_message(user_id,start=True)else:...# state пользователя генерируется автоматически@tbot.message_handler(func=lambdamsg:st.get_user_state(msg.from_user.id)=='REG:AskName')defask_name_handler(message:types.Message):name=message.textuser_id=message.from_user.id# сохраняем значение в хранилищеst.update_user_data(user_id,'name',name)Dialogs.REG.next_message(user_id)При использовании.next_message()перезаписываетсяstateпользователя
наdialog:message. В данном примере диалог называетсяREG, и при вызове.next_message(start=True)отправленным сообщением будет первое в кортеже -AskName.Вызвав метод.next_message()во второй раз, бот отправит пользователю сообщениеAskPhoneи установит его состояние наREG:AskPhone