def get_desc(update: Update, context: CallbackContext, mode="compose") -> int: query = update.callback_query query.answer() global kb global _ kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "compose", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext if mode == "compose": logger.info( _("Пользователь {id} указывает описание нового опроса").format( id=update.effective_user.id)) context.chat_data["current_step"] = "get_desc" context.chat_data["current_state"] = cc.GET_DESC_STATE elif mode == "edit": logger.info( _("Пользователь {id} редактирует описание опроса {title}").format( id=update.effective_user.id, title=context.chat_data["current_survey"])) query.edit_message_text(text=_( "Введите описание опроса.\nЭто описание будет отправляться перед опросом для ознакомления." )) return cc.GET_DESC_STATE
def start(update: Update, context: CallbackContext) -> int: user = update.effective_user if "settings" not in context.user_data: context.bot.send_message( chat_id=update.effective_chat.id, text=f"{cc.CHOOSE_LANG}", reply_markup=kbs.LANG_KB, ) return cc.LANG_STATE global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) bcmd = bcmds.BotCommands(context.user_data["settings"]["lang"]) locale = gettext.translation( "root", localedir="locales", languages=[context.user_data["settings"]["lang"]]) locale.install() _ = locale.gettext context.bot.set_my_commands(bcmd.bot_commands) if update.callback_query is None: logging.info(_("Пользователь {id} запустил бота").format(id=user.id)) context.bot.send_message( chat_id=update.effective_chat.id, text=_("Добро пожаловать, {name}!").format(name=user.first_name), reply_markup=kb.INITIAL_STATE_KB) else: query = update.callback_query query.answer() query.edit_message_text( text=_("Добро пожаловать, {name}!").format(name=user.first_name), reply_markup=kb.INITIAL_STATE_KB) return cc.START_STATE
def get_multi(update: Update, context: CallbackContext, mode="compose") -> int: query = update.callback_query query.answer() global kb global _ kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "compose", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext if mode == "compose": logger.info( _("Пользователь {id} решает, сколько вариантов ответа должно быть у вопроса №{num} нового опроса" ).format( id=update.effective_user.id, num=len(context.chat_data["current_survey"]["questions"]) + 1, )) elif mode == "edit": logger.info( _("Пользователь {id} решает, сколько вариантов ответа должно быть у вопроса №{num} опроса {title}" ).format( id=update.effective_user.id, num=context.chat_data["q_idx"] + 1, title=context.chat_data["current_survey"]["title"], )) query.edit_message_text( text=_("У этого вопроса должно быть несколько вариантов ответа?"), reply_markup=kb.YES_NO_KB, ) return cc.GET_MULTIANS_STATE
def pick_survey(update: Update, context: CallbackContext) -> int: query = update.callback_query query.answer() global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "poll", localedir="locales", languages=[context.user_data["settings"]["lang"]]) locale.install() _ = locale.gettext if "poll_ongoing" not in context.bot_data: context.bot_data["poll_ongoing"] = False if not context.bot_data["poll_ongoing"]: if query.data != "PAGENUM": if len(context.bot_data[consts.SURVEYS_KEY]) > 0: survey_list = utils.num_list( context.bot_data[consts.SURVEYS_KEY], key="title") multipage = context.user_data["settings"]["page_len"] < len( context.bot_data[consts.SURVEYS_KEY]) if multipage: if "page" not in context.chat_data: context.chat_data["page"] = 1 elif query.data == "prev page": context.chat_data["page"] -= 1 elif query.data == "next page": context.chat_data["page"] += 1 else: context.chat_data["page"] = None keyboard = kb.populate_keyboard( page_len=context.user_data["settings"]["page_len"], per_row=context.user_data["settings"]["row_len"], length=len(context.bot_data[consts.SURVEYS_KEY]), multipage=multipage, page=context.chat_data["page"], ) query.edit_message_text( text=_("Выберите опрос из существующих\n\n" "{list}").format(list=survey_list), reply_markup=keyboard, ) return cc.POLL_PICK_STATE else: query.edit_message_text( text=_( "В текущее время идёт опрос, подождите его завершения" ), reply_markup=kb.MAIN_MENU_KB, )
def start(update: Update, context: CallbackContext) -> int: query = update.callback_query query.answer() global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "manage", localedir="locales", languages=[context.user_data["settings"]["lang"]]) locale.install() _ = locale.gettext query.edit_message_text(text=_("Выберите действие"), reply_markup=kb.MANAGE_SURVEYS_KB) return cc.MANAGE_SURVEYS_STATE
def get_question(update: Update, context: CallbackContext, mode="compose", returning=False) -> int: query = update.callback_query query.answer() global kb global _ kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "compose", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext if mode == "compose": if "questions" not in context.chat_data["current_survey"]: num = 0 else: len(context.chat_data["current_survey"]["questions"]) + 1 logger.info( _("Пользователь {id} указывает текст вопроса №{num} нового опроса" ).format( id=update.effective_user.id, num=num, )) context.chat_data["current_step"] = "get_question" context.chat_data["current_state"] = cc.GET_QUESTION_STATE if "questions" not in context.chat_data["current_survey"]: context.chat_data["current_survey"]["questions"] = [] if returning: context.chat_data["current_survey"]["questions"].pop() query.edit_message_text(text=_("Введите текст вопроса №{num}").format( num=num + 1)) elif mode == "edit": q_idx = context.chat_data["q_idx"] logger.info( _("Пользователь {id} редактирует текст вопроса №{num} опроса {title}" ).format( id=update.effective_user.id, num=q_idx + 1, title=context.chat_data["current_survey"], )) query.edit_message_text(text=_("Введите текст вопроса №{num}").format( num=q_idx + 1)) return cc.GET_QUESTION_STATE
def pick(update: Update, context: CallbackContext) -> int: query = update.callback_query query.answer() global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "settings", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext query.edit_message_text( text=_("Выберите настройку"), reply_markup=kb.SETTINGS_KB, ) return cc.PICK_SETTING_STATE
def pick_part(update: Update, context: CallbackContext, source=None) -> int: query = update.callback_query query.answer() global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "edit", localedir="locales", languages=[context.user_data["settings"]["lang"]]) locale.install() _ = locale.gettext context.chat_data.pop("page", None) if "s_idx" in context.chat_data: idx = context.chat_data["s_idx"] context.chat_data["current_survey"] = copy.deepcopy( context.bot_data[consts.SURVEYS_KEY][idx]) if "base_ver" not in context.chat_data: context.chat_data["base_ver"] = copy.deepcopy( context.chat_data["current_survey"]) if source == "compose": context.chat_data["edit_end"] = cc.END_COMPOSE elif source == "manage": context.chat_data["edit_end"] = cc.END_MANAGE if "base_ver" in context.chat_data: if context.chat_data["base_ver"] != context.chat_data["current_survey"]: changes = utils.surv_diff( context.chat_data["base_ver"], context.chat_data["current_survey"], context.user_data["settings"]["lang"], ) else: changes = "" query.edit_message_text( text=_("Выбран опрос '{title}'\n\n").format( title=context.chat_data["current_survey"]["title"]) + changes + _("\nЧто вы хотите отредактировать?"), reply_markup=kb.PICK_PART_KB, ) return cc.PICK_PART_STATE
def get_answer(update: Update, context: CallbackContext, mode="compose", returning=False) -> int: query = update.callback_query query.answer() global kb global _ kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "compose", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext if mode == "compose": context.chat_data["current_step"] = "get_answer" context.chat_data["current_state"] = cc.GET_ANSWER_STATE if "answers" not in context.chat_data["current_survey"]["questions"][ -1]: context.chat_data["current_survey"]["questions"][-1][ "answers"] = [] if returning: context.chat_data["current_survey"]["questions"][-1][ "answers"].pop() query.edit_message_text( text=_("Введите текст ответа №{a_num} к вопросу №{q_num}").format( a_num=len(context.chat_data["current_survey"]["questions"][-1] ["answers"]) + 1, q_num=len(context.chat_data["current_survey"]["questions"]), )) elif mode == "edit": q_idx = context.chat_data["q_idx"] a_idx = context.chat_data["a_idx"] query.edit_message_text( text=_("Введите текст ответа №{a_num} к вопросу №{q_num}").format( a_num=a_idx + 1, q_num=q_idx + 1)) return cc.GET_ANSWER_STATE
def get_title(update: Update, context: CallbackContext, mode="compose") -> int: query = update.callback_query query.answer() global kb global _ kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "compose", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext if mode == "compose": logger.info( _("Пользователь {id} указывает название нового опроса").format( id=update.effective_user.id)) # if "current_survey" not in context.chat_data or query.data == cc.NO_CB: context.chat_data["current_survey"] = {"id": str(uuid4())} context.chat_data["current_step"] = "get_title" context.chat_data["current_state"] = cc.GET_TITLE_STATE # else: # query.edit_message_text( # text=_( # "Обнаружен незавершённый опрос.\nХотите продолжить его создание?" # ), # reply_markup=kb.YES_NO_KB, # ) if mode == "edit": logger.info( _("Пользователь {id} редактирует название опроса {title}").format( id=update.effective_user.id, title=context.chat_data["current_survey"])) query.edit_message_text(text=_( "Введите краткое название опроса.\nЭто название будет отображаться в списке опросов при управлении или запуске опроса." )) return cc.GET_TITLE_STATE
def set_lang(update: Update, context: CallbackContext, lang: str) -> None: query = update.callback_query query.answer() if "settings" not in context.user_data: context.user_data["settings"] = copy.deepcopy( context.bot_data[consts.DEFAULTS_KEY]) context.user_data["settings"]["lang"] = lang try: global _ global kb kb = kbs.Keyboards(context.user_data["settings"]["lang"]) locale = gettext.translation( "commands", localedir="locales", languages=[context.user_data["settings"]["lang"]], ) locale.install() _ = locale.gettext except ModuleNotFoundError: context.user_data["settings"]["lang"] = None logger.error("User {} picked an invalid language?".format( update.effective_user.id)) root.start(update, context) return cc.START_STATE